【问题标题】:Checking for service worker updates in a single page app在单页应用程序中检查服务人员更新
【发布时间】:2019-01-15 19:27:17
【问题描述】:

我们有一个信号页面应用程序,该应用程序已安装并处于活动状态。

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

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

什么时候有效? 如果我刷新/重新加载应用程序,则正在安装新的服务人员。

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

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

【问题讨论】:

  • 您是否提供带有 HTTP-Cache 标头的 SW.js 文件?我认为它应该在每次页面加载时尝试更新(来自服务器的请求),但也许它仍然从浏览器缓存中获取旧版本。见stackoverflow.com/a/38854905/7362396
  • 它是一个单页应用程序,只有在我们手动刷新或打开新标签时才会加载页面。

标签: service-worker workbox workbox-webpack-plugin


【解决方案1】:

隐式更新

The Service Worker Lifecycle”是这类问题的绝佳资源。

特别是有一个section dealing with updates

触发更新:

  • 导航到范围内的页面。
  • 关于推送和同步等功能性事件,除非在过去 24 小时内进行过更新检查。
  • 仅当服务工作者 URL 发生更改时才调用 .register()。

显式更新

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

你可以做的是按照later on in that section的例子:

正如我之前提到的,浏览器会自动检查更新 在导航和功能事件之后,但您也可以触发它们 手动:

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

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

register() 如何适应?

至少拨打一次navigator.serviceWorker.register() 后,服务人员就有机会安装和激活。此时,无论是否再次调用 navigator.serviceWorker.register(),都会检查 Service Worker 更新。

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

您可以通过比较 Service Worker 规范中的 RegisterUpdate 作业之间的差异来深入了解此细节。

【讨论】:

  • 感谢您的解释。这个回复回答了我6个月的挣扎。我添加了一个 history.listener 来检查 service worker 的更新。我实现了请求用户许可重新加载应用程序以跨多个选项卡获取最新更新的流程。你可以查看我的代码github.com/rahuls360/testing-sw
猜你喜欢
  • 2019-11-08
  • 2011-03-03
  • 2021-06-15
  • 2020-01-14
  • 1970-01-01
  • 1970-01-01
  • 2018-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多