Google chrome devtools 与workbox window.update()行为不一致
平台Google chrome devtools 与workbox window.update()行为不一致,google-chrome-devtools,progressive-web-apps,workbox,workbox-window,Google Chrome Devtools,Progressive Web Apps,Workbox,Workbox Window,平台 "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36" 工作盒版本 5.0.0-rc.0 我正在使用workbox窗口update()方法触发service worker更新检查,如中所述。这个问题似乎也与本报告中的观察结果有关 大多数情况下,waiting事件被触发,如果用户接受更新,服务人员将被激活,我们可以重新加载页面以完成更
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36"
工作盒版本
5.0.0-rc.0
我正在使用workbox窗口update()
方法触发service worker更新检查,如中所述。这个问题似乎也与本报告中的观察结果有关
大多数情况下,waiting
事件被触发,如果用户接受更新,服务人员将被激活,我们可以重新加载页面以完成更新过程:
function handleActivated(wb, event) {
if (event.isUpdate) {
window.location.reload();
} else {
wb.messageSW({ type: 'CLIENTS_CLAIM' });
}
}
wb.addEventListener('activated', event => {
handleActivated(wb, event);
});
wb.addEventListener('externalactivated', event => {
handleActivated(wb, event);
});
如果触发了waiting
事件,则此过程工作正常
externalwaiting
事件,则此代码不起作用。新的服务人员仍然处于等待状态,我可以在Chrome开发工具中看到这一点
跳过旧服务人员收到的等待消息
如果用户确认要更新SKIP_WAITING
消息,则较旧的激活的服务人员定义将接收到该消息
这是我日志中的一段摘录,证明了这一点
- 来自应用程序/客户端的日志条目的前缀为“application”,后跟应用程序版本
- 来自service worker的日志条目以“service worker”为前缀,后跟每个service worker实例唯一的DOB日期戳
01[应用程序0.0.1.2019.11.05-48]检查更新。。。
02[服务人员2019-11-05@15:23:14]>
03[服务工人2019-11-05@15:23:14]耶!Workbox 5.0.0-rc.0已加载请注意,现在已在Workbox窗口中解决此问题。有一个更新的高级配方:
还请注意,此配方中的代码存在(或曾经存在)问题。有关固定代码,请参阅以下问题
嘿,这么长时间之后,我发现了同样的问题。你解决了吗?是的。但不能使用workbox窗口。必须使用香草服务工人API。我会尽量找时间发表这篇文章。这很复杂。但最重要的是,出于这个原因,我不得不放弃workbox窗口,尽管服务人员仍然使用workbox,这非常有效。我们可以聊聊天吗?我正在努力解决这个问题,如果我不必花费大量时间来修复它,我将不胜感激。你可以很快帮我,我会问正确的问题。让我知道怎样才能联系到你。谢谢你的回答!!!我会尽量抽出时间将我的代码提取到一个可公开访问的示例中,并在这里发布一个链接。您需要解决方案的紧迫程度如何?(我的邮件在苹果和其他平台/浏览器中运行良好。真遗憾,workbox团队中没有人对此做出回应…)完全同意。真遗憾。这也是我做的。没那么难。
function handleWaiting(wb) {
if (confirm("An update is available for this app. Install now?")) {
wb.messageSW({type: 'SKIP_WAITING'});
}
}
wb.addEventListener('waiting', event => {
handleWaiting(wb);
});
wb.addEventListener('externalwaiting', event => {
handleWaiting(wb);
});
function handleActivated(wb, event) {
if (event.isUpdate) {
window.location.reload();
} else {
wb.messageSW({ type: 'CLIENTS_CLAIM' });
}
}
wb.addEventListener('activated', event => {
handleActivated(wb, event);
});
wb.addEventListener('externalactivated', event => {
handleActivated(wb, event);
});