我们有一个安装了 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 规范中 Register 和 Update 作业之间的差异来深入了解这一点。
关于service-worker - 在单页应用中检查 Service Worker 更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51748241/