Service worker 在单页应用程序中检查service worker更新

Service worker 在单页应用程序中检查service worker更新,service-worker,workbox,workbox-webpack-plugin,Service Worker,Workbox,Workbox Webpack Plugin,我们有一个信号页面应用程序,该应用程序已安装并处于活动状态 现在我们的服务器重建了应用程序,服务器端的服务工作者文件正在更新 我们的客户不知道这个新的服务人员文件,它仍然在使用旧的服务人员文件 什么时候起作用? 如果我刷新/重新加载应用程序,则将安装新的service worker 如果服务器上的服务人员文件正在更新,而客户端没有重新加载,我们如何刷新客户端? 可能的解决方案: 我想,我需要在1小时后进行投票。 “”对于这类问题来说是一个很好的资源 特别是,有一个: 将触发更新: 在导航到范围

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

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

我们的客户不知道这个新的服务人员文件,它仍然在使用旧的服务人员文件

什么时候起作用? 如果我刷新/重新加载应用程序,则将安装新的service worker

如果服务器上的服务人员文件正在更新,而客户端没有重新加载,我们如何刷新客户端?

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

“”对于这类问题来说是一个很好的资源

特别是,有一个:

将触发更新:

  • 在导航到范围内页面时
  • 在功能事件(如推送和同步)上,除非在前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规范中的和作业之间的差异,您可以深入了解这方面的详细信息。

您是否提供了带有HTTP缓存头的SW.js文件?我认为它应该尝试在每次加载页面时更新(来自服务器的请求),但可能它仍然从浏览器缓存中获取旧版本。请看,这是一个单页应用程序,只有当我们手动刷新或打开新选项卡时,页面才会加载。感谢您的解释。我6个月的奋斗已经得到了回答。我添加了一个history.listener来检查服务人员更新。我实现了这个流程,请求用户允许重新加载应用程序,以便跨多个选项卡获取最新更新。你可以查我的密码