尝试注册服务工作者时出现此错误:
无法注册ServiceWorker:获取脚本时收到了错误的HTTP响应代码(404)。
我正在使用离子,这就是我在app.js中所拥有的:
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('service-worker.js').then(function(registration) {
console.log('ServiceWorker registration successful with scope: ', registration.scope);
}).catch(function(err) {
//registration failed :(
console.log('ServiceWorker registration failed: ', err);
});
}else {
console.log('No service-worker on this browser');
}
在目录中,我在同一文件夹上的app.js旁边有service-worker.js文件。
在ubuntu桌面上使用最新的chrome版本。
答案 0 :(得分:46)
您提到service-worker.js
与app.js
位于同一目录中,但传递给.register()
的网址与HTML文档的路径相关。您需要确保您的service-worker.js
文件与您所在页面对应的.html
文件位于同一目录中。
答案 1 :(得分:8)
答案 2 :(得分:2)
服务工作者和index.html文件应位于公共目录中。
答案 3 :(得分:2)
您只需要将正确的路径传递到navigator.serviceWorker.register,并且不一定需要与html文件相同。
例如,我的service-worker.js位于应用程序的Scripts文件夹中,因此我需要在navigator.serviceWorker.register上传递路径“ /Scripts/service-worker.js”,例如:
navigator.serviceWorker.register('/Scripts/service-worker.js')
答案 4 :(得分:1)
这些都是很好的答复,这使我感到困惑。我只是想添加另一件事,以防其他人遇到这个问题并像我一样感到困惑。
如果您使用的是Webpack之类的捆绑程序,则该路径必须相对于编译版本。
如果sw.js位于/src
文件夹中,但html的编译版本进入./dist
文件夹,并且注册sw.js的路径为"./sw.js"
,则服务worker将在dist文件夹中搜索sw.js文件。
我针对上述Webpack问题的解决方案是使用copy-webpack-plugin
并将文件从src文件夹发送到dist文件夹。
答案 5 :(得分:0)
尝试使用〜将源设置为在根目录中查找
像这样:
navigator.serviceWorker.register('~service-worker.js')