15

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

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

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

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

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

可能的解决方案:我认为,我需要在 1 小时后进行轮询。

4

1 回答 1

28

隐式更新

服务工作者生命周期”是解决这类问题的一个很好的资源。

特别是,有一个部分处理更新

触发更新:

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

显式更新

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

您可以做的是按照该部分后面的示例进行操作:

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

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作业之间的差异来深入了解这一点。

于 2018-08-09T21:25:30.050 回答