首页 文章

如何强制服务工作者更新?

提问于
浏览
6

我正在使用sw-precache通过Polymer CLI构建过程生成我的服务工作,因此它旨在更新更新文件的哈希,以表示需要更新缓存 . 但是我的更新内容没有在缓存中被替换,所以如果我用ctrl r刷新它会得到一个旧版本但是如果我用ctrl shift r刷新则会得到新版本 . 原因可能是我的服务工作者没有更新 .

This doc说明

如果服务工作文件中的字节与现有文件的差异,则认为它是新的 .

,但是如果我的新服务工作者没有更改字节怎么办? (如果只有一个哈希发生变化,就会发生这种情况) . 如何配置sw-precache以在每次新请求时更新服务工作?

3 回答

  • 8

    如果一个文件's hash changes, that'足以确保 sw-precache 生成的服务工作者JavaScript文件发生更改 . 反过来,这足以触发服务工作者更新流程 .

    如果您在测试时没有看到触发的更新流,那么可能是由于服务工作者JavaScript文件与HTTP缓存头一起提供,导致它从浏览器的缓存而不是从网络中获取 .

    有关HTTP缓存标头如何发挥作用的讨论,请参阅https://stackoverflow.com/a/38854905/385997,以及与此相关的最佳实践 .

  • 5

    正如之前的答案所述,浏览器有一天(24小时)的内置限制来查找服务工作者的更新,但您需要注意的是,您仍然需要在 ServiceWorkerRegistration 对象上调用 .update() 否则将使用该文件的原始版本 .

    在测试Chrome中的更改时,我总是右键单击刷新按钮,并在处理我的服务工作者脚本时选择“清空缓存和硬重置”(当开发人员工具打开时可用选项) .

  • 4

    'sw-precache'已被Workbox取代,它为您要预先缓存的文件生成哈希值,并将这些哈希值添加到服务工作者的源代码中(我不知道 sw-precache 是否以相同的方式工作,杰夫的回答表明它确实如此) . 如果您希望预先缓存的任何文件发生更改 - 并且您重新运行构建 - 则更新服务工作者中的更新哈希值,这几乎可以保证服务工作者将"at least one byte different" .

    当您重新加载( ctrl-r )或重新访问您的应用程序时,浏览器将再次获取为其注册的服务工作者 . 而且,如果该服务工作者已更改,则管理该应用程序将为"queued up" . 但是,在关闭打开应用程序的所有选项卡,然后打开一个新应用程序之前,它不会开始管理应用程序 .

    当你硬刷新( shift-ctrl-rit’ll always load without a controller时,这与使用新服务工作者不同 .

    为了在开发期间进行测试,我在devtools中使用skip waiting来使新服务工作者替换旧服务工作者,而无需等待我关闭所有选项卡 .

相关问题