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
事件,则此过程工作正常

  • 对应用程序进行一次小更新,从而导致service worker文件发生更改
  • 按“检查更新”按钮
  • 找到新的服务人员并提示用户安装更新
  • 页面被重新加载
  • 但是如果触发了
    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);
    });