隐式更新
“服务工作者生命周期”是解决这类问题的一个很好的资源。
特别是,有一个部分处理更新:
触发更新:
- 在导航到范围内页面时。
- 关于推送和同步等功能性事件,除非在过去 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 规范中的Register和Update作业之间的差异来深入了解这一点。