我正在尝试使用也是ESM模块的服务工作者文件。
register
方法有一个额外的参数,它接受一个options
对象,该对象具有一个type
字段,其有效值似乎是classic
和module
,但是当我使用时:
navigator.serviceWorker.register('worker.js', { type: 'module' });
// `worker.mjs` doesn't work either
// The file exists in both cases!
我收到一个未指定的DOMException
,在Chrome中没有消息。
通过阅读规范,我弄清楚了type
的有效值是什么,
https://html.spec.whatwg.org/multipage/workers.html#workertype
在我看来,我的代码是有效的。
作为健全性检查,我还尝试将type
显式设置为classic
,然后服务人员注册可以正常进行。如果将其设置为无效值,则会得到TypeError
的提示,这并不意味着浏览器尚未意识到type: module
。它被视为特殊情况,它只会抛出DOMException
而没有消息。
我可以正确使用type
字段吗?还为时过早,浏览器不支持吗?
答案 0 :(得分:1)
这真是愚蠢!记录错误对象时,Chrome只会将DOMException
打印到控制台(甚至不可扩展),并且该对象实例上的Object.keys
返回[]
,但是当我专门打印e.message
时,罪魁祸首被揭露:
尚未实现RegistrationOptions中的类型'模块'。有关详细信息,请参见https://crbug.com/824647。
不被Chrome逗乐。
答案 1 :(得分:1)
在浏览器上,除非您还具有将裸名映射到模块的module map(又名import map,此链接具有更多信息),否则不能使用裸名来标识模块。
如果worker.js
与加载页面的位置相同,则:
navigator.serviceWorker.register('./worker.js', { type: 'module' });
// -------------------------------^^
或者,当然,添加模块映射。