service-worker - 在单页应用中检查 Service Worker 更新

标签 service-worker workbox workbox-webpack-plugin

我们有一个安装了 Service Worker 并处于事件状态的信号页面应用程序。

现在我们的服务器重建了应用程序,服务 worker 文件正在服务器端更新。

我们的客户不知道这个新的 Service Worker 文件,它仍在使用旧的 Service Worker 文件。

什么时候工作?
如果我刷新/重新加载应用程序,则会安装新的 Service Worker。

如果服务 worker 文件正在服务器上更新并且没有重新加载客户端,我们如何刷新客户端?

可能的解决方案 :
我想,我需要在 1 小时后进行投票。

最佳答案

隐式更新

The Service Worker Lifecycle ”是此类问题的重要资源。

特别是,有一个 section dealing with updates :

An update is triggered:

  • On navigation to an in-scope page.
  • On functional events such as push and sync, unless there's been an update check within the previous 24 hours.
  • On calling .register() only if the service worker URL has changed.


显式更新

因为您的 SPA 不使用真正的导航,所以您不会获得第一个要点中提到的自动更新检查。

您可以做的是按照 later on in that section 中的示例进行操作:

As I mentioned earlier, the browser checks for updates automatically after navigations and functional events, but you can also trigger them manually:

navigator.serviceWorker.register('/sw.js').then(reg => {
  // sometime later…
  reg.update();
});


我可能会做的是修改您的 SPA 的路由器,并在您的路由器即将切换到新 View 时自动调用 reg.update()。这将模拟您在非 SPA 中获得的相同导航更新行为。

register() 是如何适应的?

在至少对 navigator.serviceWorker.register() 进行了一次调用后,Service Worker 就有机会安装和激活。此时,无论是否再次调用 navigator.serviceWorker.register(),都会检查 Service Worker 更新。

此答案的前面部分描述了何时进行这些更新检查,无论是隐式还是显式。

您可以通过比较 service worker 规范中 RegisterUpdate 作业之间的差异来深入了解这一点。

关于service-worker - 在单页应用中检查 Service Worker 更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51748241/

相关文章:

reactjs - React - 取消注册已注册的服务人员

Service Worker 任务计划程序的浏览器支持

promise - PushManager 的 .subscribe() 方法存在问题

service-worker - 从脚本标签启动时从网络下载的 Assets

vue.js - 部署到生产 Netlify 的 Vue CLI 3 PWA 提供 Workbox 错误 : bad-precaching-response . .._redirects?__WB_REVISION__...404

service-worker - Workbox 无法在 localhost 上运行,但可以在 127.0.0.1 上运行

javascript - registerNavigationRoute : precached index. html 未更新 NetworkFirst

vue.js - 当路由器处于历史模式时 PWA 不加载(基于 Vue CLI 3 的项目)

javascript - service worker 不会跳过等待状态

Webpack 工作箱在您的软件源中找不到 self.__WB_MANIFEST