在服务工作进程文件中使用 ESM(导入/导出)



我正在尝试使用一个服务工作者文件,它也是一个ESM模块。

register方法有一个额外的参数,接受一个options对象,该对象具有一个type字段,其有效值似乎是classicmodule,但是当我使用时:

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' });
// -------------------------------^^

或者,当然,添加一个模块映射。

最新更新