但是,如果我的新服务工作者没有更改一个字节怎么办?(如果只更改了一个哈希值,则会发生这种情况)。如何配置sw-precache在每个新请求时更新服务工作?即使服务工作者文件与其当前文件相比只有一个字节的差异,它也将被视为新文件。
但是,如果我的新服务工作者没有更改一个字节怎么办?(如果只更改了一个哈希值,则会发生这种情况)。如何配置sw-precache在每个新请求时更新服务工作?即使服务工作者文件与其当前文件相比只有一个字节的差异,它也将被视为新文件。
正如之前的回答所述,浏览器默认有一天(24小时)的时间限制来查找服务工作者更新,但需要注意的是,在原始版本文件被使用之前,您仍然需要调用.update()
在您的ServiceWorkerRegistration
对象上。
在Chrome中测试更改时,我总是右键单击刷新按钮并选择“清空缓存并强制重置”(选项在开发者工具打开时可用),以便在我的服务工作者脚本上工作。
.update()
!但那很丑。 - Csaba Toth'sw-precache'已被Workbox取代,它为您想要预缓存的文件生成哈希,并将其添加到服务工作者的源代码中(我不知道sw-precache
是否以同样的方式工作,Jeff的答案表明这确实是这种情况)。如果您想要预缓存的任何文件发生更改,并且重新运行构建,则服务工作者中更新的哈希将更新,这基本上保证了服务工作者至少会“有一个字节的不同”。
当您重新加载(ctrl-r
)或重新访问您的应用程序时,浏览器会再次获取为其注册的服务工作者。并且,如果该服务工作者已更改,它将被“排队”以管理该应用程序。但是,在关闭所有打开该应用程序的选项卡后,它不会开始管理该应用程序,直到您打开一个新选项卡。
当您进行硬刷新(shift-ctrl-r
)它将始终不使用控制器加载,这与使用新的服务工作者不同。
在开发过程中进行测试时,我使用跳过等待在devtools中,以使新的服务工作者取代旧的服务工作者,而不必等待我关闭所有选项卡。
如果一个文件的哈希值改变了,就足以确保由sw-precache
生成的服务工作者JavaScript文件发生了变化。这反过来又足以触发服务工作者的更新流程。
如果在测试过程中未触发更新流程,则可能是由于服务工作者JavaScript文件使用HTTP缓存标头进行了服务,导致它从浏览器缓存而不是网络获取。
请参见https://dev59.com/kFkT5IYBdhLWcg3wRNYR#38854905,了解HTTP缓存标头的作用及相关最佳实践。
从用户体验的角度来看,我实施的一个选项是在您的服务工作者中调用“取消注册”方法。 (https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerRegistration/unregister)
完成注销过程后,您可以:
我以前遇到服务工作者的奇怪问题,因此这种解决方案允许您在不强制用户清除其实际浏览器缓存的情况下,清除旧缓存并刷新应用程序状态,同时重新加载应用程序。
示例 (如何取消注册):
serviceworker.unregister()
.then( unregResult => {
//You can check if successful with Promise result 'unregResult'
window.location.reload();
})
service-worker.js
中存储版本号控制service-worker.js
中的一个字符更改将自动触发PWA更新。因此,如果您将版本号存储在此文件中的const
中并进行更改,则会触发PWA的更新。
如何处理更新最终由service-worker.js
确定。可以根据PWA资产的大小和波动性定义不同的更新策略。
然而,有一个重要的警告。请确保由您的资产服务器上的.htaccess
文件设置的浏览器缓存到期指令设置为非常短的持续时间(例如小时
)甚至为none。
未能这样做将导致浏览器在接下来的几天内看不到manifest.json
或service-worker.js
中的任何更改。
有关服务工作者行为的更多详细信息可以从Google Web Fundamentals获取。
const messaging = firebase.messaging();
messaging.setBackgroundMessageHandler(function(payload) {
//Force the Service Worker to Upddate
self.registration.update();
const notification = JSON.parse(payload.data.notification);
return self.registration.showNotification(notification.title, notification);
});
/style.css?{hash-of-the-file}
- Umur Karagöz