【发布时间】:2017-12-09 06:45:50
【问题描述】:
我正在使用 service worker 来实现网络推送通知。每当我更改服务人员的某些代码时,除非我删除 cookie/缓存,否则该更改不会反映在浏览器上的服务人员中。 这是正常行为还是我必须添加一些功能来更新服务人员?
【问题讨论】:
标签: service-worker
我正在使用 service worker 来实现网络推送通知。每当我更改服务人员的某些代码时,除非我删除 cookie/缓存,否则该更改不会反映在浏览器上的服务人员中。 这是正常行为还是我必须添加一些功能来更新服务人员?
【问题讨论】:
标签: service-worker
如果缓存标头与 Service Worker 文件一起发送,则 Service Worker 文件最多缓存 24 小时。
第一步是将缓存头设置为0不缓存。
当浏览器找到新的 service worker 时,它会下载并安装它。直到当前由 service worker 控制的所有页面都关闭后才会生效。对于普通用户来说,这不是问题。在 chrome 开发过程中,您可以使用 Ctrl+ shift + R 进行硬刷新,这会强制页面不受服务人员控制,从而允许您的服务人员控制下一次刷新。
最后的选择是在安装步骤中使用跳过等待并在激活步骤中声明以强制新的服务人员立即激活和控制任何页面。如果靠这个赚钱,因为很容易陷入奇怪的情况。
更新:浏览器正在更改此默认行为 - Firefox 现在将忽略缓存标头,其他浏览器可能会实现相同的行为
【讨论】:
回答您的具体问题:是的,该行为是有意的,是的,您可以调用更新函数。在 service worker 注册上使用 update() 方法。来自 MDN:
ServiceWorkerRegistration 接口的 update 方法尝试更新 service worker。它获取工作人员的脚本 URL,如果新工作人员与当前工作人员不逐字节相同,则安装新工作人员。如果上一次 fetch 发生在 24 小时前,则 worker 的 fetch 会绕过任何浏览器缓存。
请注意,如果之前的 fetch 超过 24 小时,SW fetch 将绕过任何浏览器缓存,因此您应该在开发 service worker 时禁用缓存。
【讨论】: