Javascript Serviceworker从未被激活或接收消息,但workbox功能在子路径上工作
在我当前使用webpack with(Javascript Serviceworker从未被激活或接收消息,但workbox功能在子路径上工作,javascript,webpack,single-page-application,workbox,workbox-window,Javascript,Webpack,Single Page Application,Workbox,Workbox Window,在我当前使用webpack with(workbox-webpack-plugin)和workbox(withworkbox-window)的项目中,我遇到了一个错误,当页面加载到“深url”时,serviceworker将永远不会响应消息,例如“/我的路径/嵌套”。 它将在“/我的路径”上工作 在最小的可再生环境中,这是应该发生的 在新选项卡中,可访问应用程序(例如,通过https://my-app.my-name.company-dev-envs.cloud/some-unique-id)
workbox-webpack-plugin
)和workbox(withworkbox-window
)的项目中,我遇到了一个错误,当页面加载到“深url”时,serviceworker将永远不会响应消息,例如“/我的路径/嵌套”。
它将在“/我的路径”上工作
在最小的可再生环境中,这是应该发生的
- 在新选项卡中,可访问应用程序(例如,通过
)https://my-app.my-name.company-dev-envs.cloud/some-unique-id
- ServiceWorker通过workbox(
)注册.register()
- 注册后,
用于请求SWs“版本”messageSW
- ServiceWorker使用
响应,并使用一个字符串指示版本event.ports[0].postMessage
重新加载时更新时,externalactivated
除外)
serviceworker将报告为“活动并正在运行”,而不显示其他service Worker。它似乎也可以处理抓取。只有消息和事件从不通过wb
Workbox窗口实例响应/触发
“应用程序”选项卡将服务工作者报告为活动且正在运行:
index.js(应用程序的主条目)
/*全局窗口,系统*/
导入“/”脱机“;
// [...]
offline.js
从“工作盒窗口”导入{Workbox};
if(导航器中的“serviceWorker”){
const wb=new Workbox('./sw.js');
const attachDebugEventHandlers=(事件)=>{
events.forEach((eventName)=>{
wb.addEventListener(事件名称,()=>{
log(`[workbox sw]${eventName}触发`);
});
});
};
attachDebugEventHandlers([
“已激活”,
“控制”,
“外部激活”,
“外部安装”,
“外部等待”,
“已安装”,
"讯息",,
"多余",,
“等待”,
]);
wb.register()
。然后((注册)=>{
console.log('workbox sw register successful');
console.log(“发送消息”)
messageSW({type:'GET_VERSION'})。然后((ver)=>console.log(`[workbox sw]VERSION报告为${ver}`)
})
.catch((错误)=>{
控制台。错误(“[workbox sw]无法激活sw”,错误);
});
sw.js
webpack.config.js(为简洁起见缩短)
const HtmlWebpackPlugin=require('html-webpack-plugin');
const WorkboxPlugin=require('workbox-webpack-plugin');
module.exports={
devtool:“评估源地图”,
模块:{
规则:[
{
测试:/\(jsx?)$/,
包括:[
解析(uu dirname,'src'),
],
用法:['babel-loader'],
},
//[…](样式加载)
{
测试:/\.html$/,,
使用:[
{
加载器:“html加载器”,
},
],
},
],
},
开发服务器:{
历史上的倒退:是的,
disableHostCheck:true
},
插件:[
// [...]
新HtmlWebpackPlugin({
模板:path.resolve(uu dirname,'src/html/index.html')
}),
// [...]
新WorkboxPlugin.InjectManifest({
swSrc:'/src/sw.js',
swDest:'sw.js',
maximumFileSizeToCacheInBytes:12*1024*1024,
}),
],
};
使用的版本:
"webpack": "^4.33.0",
"webpack-cli": "^3.3.2",
"workbox-window": "^5.1.3"
"workbox-webpack-plugin": "^5.1.3"
()我自己能够解决它。问题当然是当用户导航到子路径时,/sw.js
的路径不正确
https://my-website.com/a-subpath/a-resource
不会将/sw.js
解析为https://my-website.com/sw.js
而不是https://my-website.com/a-subpath/sw.js
这是一个非常愚蠢的错误,但希望有人能得到这个答案的帮助。如果workbox window
没有像注册成功一样正确解析,但拒绝了/sw.js
路径,可能会有所帮助
"webpack": "^4.33.0",
"webpack-cli": "^3.3.2",
"workbox-window": "^5.1.3"
"workbox-webpack-plugin": "^5.1.3"