我正在尝试使用一个服务工作者文件,它也是一个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
字段?现在还为时过早,浏览器不支持吗?
太愚蠢了!当记录错误对象时,Chrome 将只打印到控制台DOMException
(甚至不可扩展(,并且该对象实例上的Object.keys
返回[]
,但是当我专门打印e.message
时,罪魁祸首被揭示出来:
">注册选项"中的类型"模块"尚未实现。有关详细信息,请参阅 https://crbug.com/824647。
没有被铬逗乐。
在浏览器上,裸名称不能用于标识模块,除非您还有一个模块映射(又名导入映射,此链接包含更多信息(将裸名称映射到模块。
如果worker.js
与加载它的页面位于同一位置,则:
navigator.serviceWorker.register('./worker.js', { type: 'module' });
// -------------------------------^^
或者,当然,添加一个模块映射。