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

Javascript 在服务工作者文件中使用ESM(导入/导出),javascript,service-worker,Javascript,Service Worker,我正在尝试使用一个服务工作者文件,它也是一个ESM模块 register方法有一个额外的参数,该参数接受一个选项对象,该对象有一个类型字段,其有效值似乎是经典和模块,但当我使用时: navigator.serviceWorker.register('worker.js',{type:'module'}); //“worker.mjs”也不起作用 //文件在这两种情况下都存在! 我得到一个未指定的DOMException,在Chrome中没有消息 通过阅读规范,我计算出类型的有效值,具体如下:

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

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-对,路径或地图的要求与模块具体相关。例如,对于非工作者,
起作用;但是如果没有地图,
没有,它必须是