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

时间:2019-07-09 13:24:51

标签: javascript service-worker

我正在尝试使用也是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字段吗?还为时过早,浏览器不支持吗?

2 个答案:

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

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