ServiceWorker:浏览器未检测到新版本

ServiceWorker: Browser not detecting new version

我正在试验基于 this article 的 HTML5 ServiceWorker API。文章中提到

When the user navigates to your site, the browser tries to redownload the script file that defined the service worker in the background. If there is even a byte's difference in the service worker file compared to what it currently has, it considers it 'new'.

由此我得出结论,如果我要更改工作人员脚本文件中的 任何内容,它会提示浏览器定义一个新版本,当所有页面引用旧版本的工人被终止。


编辑: 显然浏览器正在缓存 serviceworker.js 文件本身,这就是为什么没有选择新版本的原因。谁能告诉我如何避免缓存工作文件?我浏览了可用的在线演示(包括 MDN and W3C Webmob's GitHub 上的演示)

这是我的文件结构:

|- index.html
|- serviceworker.js // the actual worker
|- serviceworker-cache-polyfill.js
|- serviceworker-registration.js // contains the registration logic for the worker
|- style.css

我将缓存配置为包含以下 URL:

问题不在于 ServiceWorker 的配置,而是我的服务器缓存了文件这一事实。不能说我不觉得自己很蠢我没有早点检查过这个。

为了将来参考,我正在使用 http-server,它默认将所有文件缓存 1 小时。您可以通过传入 c 参数来覆盖它。要完全禁用缓存,请传入 -1:

http-server -c-1

编辑 以下article 包含了关于如何使用 ServiceWorker 进行开发的很好的总结:

In order to guarantee that the latest version of your Service Worker script is being used, follow these instructions:

  1. Configure your local server to serve your Service Worker script as non-cacheable (cache-control: no-cache)
  2. After you made changes to your service worker script:
    1. close all but one of the tabs pointing to your web application
    2. hit shift-reload to bypass the service worker as to ensure that the remaining tab isn't under the control of a service worker
    3. hit reload to let the newer version of the Service Worker control the page.

这确实可以解释这种行为。更新逻辑确实尊重 HTTP 缓存控制 header,但最多 24 小时(以避免被 Cache-control 服务的损坏软件卡住:1 年 header)。