Javascript 在服务工作者文件中使用ESM(导入/导出)
我正在尝试使用一个服务工作者文件,它也是一个ESM模块Javascript 在服务工作者文件中使用ESM(导入/导出),javascript,service-worker,Javascript,Service Worker,我正在尝试使用一个服务工作者文件,它也是一个ESM模块 register方法有一个额外的参数,该参数接受一个选项对象,该对象有一个类型字段,其有效值似乎是经典和模块,但当我使用时: navigator.serviceWorker.register('worker.js',{type:'module'}); //“worker.mjs”也不起作用 //文件在这两种情况下都存在! 我得到一个未指定的DOMException,在Chrome中没有消息 通过阅读规范,我计算出类型的有效值,具体如下:
register
方法有一个额外的参数,该参数接受一个选项
对象,该对象有一个类型
字段,其有效值似乎是经典
和模块
,但当我使用时:
navigator.serviceWorker.register('worker.js',{type:'module'});
//“worker.mjs”也不起作用
//文件在这两种情况下都存在!
我得到一个未指定的DOMException
,在Chrome中没有消息
通过阅读规范,我计算出类型
的有效值,具体如下:
在我看来,我的代码是有效的
作为一项健全性检查,我还试图明确地将type
设置为classic
,然后服务人员的注册将通过罚款。如果我将其设置为无效值,我会得到一个TypeError
来告诉我这一点,因此浏览器不会不知道type:module
。它被视为一个特例,它只抛出一个DOMException
,没有消息
我是否正确使用了
类型字段?现在还太早,浏览器不支持它吗?这太愚蠢了!当记录错误对象和对象时,Chrome将只将DomeException
打印到控制台中(甚至不可扩展)。该对象实例上的键
返回[]
,但当我特别打印e.message
时,罪魁祸首被发现:
注册选项中的类型“module”尚未实现。有关详细信息,请参阅
对Chrome不感兴趣。在浏览器上,裸名称不能用于识别模块,除非您还有一个(aka,此链接包含更多信息)将裸名称映射到模块
如果worker.js
与加载它的页面位于同一位置,则:
navigator.serviceWorker.register('./worker.js', { type: 'module' });
// -------------------------------^^
当然,也可以添加一个模块映射。.mjs
是Node.js,而不是Node.js之外的ESM。(Node.js现在有类型
。希望.mjs
会死掉……)什么版本的Chrome?您的服务人员脚本的内容有什么不同吗?很遗憾,它的副本不受支持,错误消息令人难以置信。贴出问题后,我才想出来,看看我的答案。@TomášHübelbauer-是的,我刚刚看到了。但是,当它得到支持时,我怀疑您需要执行上述操作::-)我会记住这一点。对于经典(默认)注册,传递worker.js
(no/
)对我来说很好。浏览器能够正确解析相对URL。@TomášHübelbauer-对,路径或地图的要求与模块具体相关。例如,对于非工作者,
起作用;但是如果没有地图,
没有,它必须是
。