Chrome v72 似乎忽略了 Cache-Control 标头和缓存 service-worker.js 进行测试,我已将所有资源设置为使用:
res.set('Cache-Control', 'no-store, no-cache, must-revalidate, private');
res.set('Max-Age', '0');
导航到 localhost:4000/dist/service-worker.js 时,我能够验证设置是否正确:
HTTP/1.1 200 OK
X-Powered-By: Express
Cache-Control: no-store, no-cache, must-revalidate, private
Max-Age: 0
Access-Control-Allow-Origin: *
Accept-Ranges: bytes
Last-Modified: Thu, 14 Feb 2019 23:17:55 GMT
ETag: W/"3c1-168ee4d6297"
Content-Type: application/javascript; charset=UTF-8
Content-Length: 961
Vary: Accept-Encoding
Date: Thu, 14 Feb 2019 23:27:24 GMT
Connection: keep-alive
即使这样,从 Chrome 68 开始,它“应该”默认绕过 HTTP 缓存: https ://developers.google.com/web/updates/2018/06/fresher-sw
显然不是。
我在“应用程序”选项卡中检查了重新加载更新。我已关闭 Chrome 并重新打开,但它仍在使用缓存中的旧 service-worker.js。
我的工作箱配置如下所示:
new GenerateSW({
include: [/\.css$/, /\.js$/],
clientsClaim: true,
skipWaiting: true
}),
我还能够验证,Chrome 正在缓存 service-worker.js,因为如果我:
打开一个新选项卡并导航到: http://localhost:4000/dist/service-worker.js
Chrome 实际上是最新的,现在另一个选项卡会触发“安装”事件。
- 另一个选项卡现在有最新的服务工作者。
倒数第二个测试:
- 注册 service-worker.js
- 进行更改,将 service-worker.js 重命名为 sw.js(注册 sw.js)
- 导航到http://localhost:4000并查看它仍在使用缓存的 service-worker.js
- 导航到http://localhost:4000/dist/service-worker.js -> 404 所以即使它不再存在,它也在使用缓存版本。
最终测试:
navigator.serviceWorker.register(`/dist/service-worker.js?hack=${Math.random()}`)
当然,现在它获取了所有新的 service-worker.js 更新。
这是 Chrome 错误吗?我没有正确配置某些东西吗?同样的行为也发生在 Chrome Canary 中。
或者,我可以执行以下操作来绕过缓存:
navigator.serviceWorker
.register(`/dist/sw.js`)
.then(registration => {
registration.update();
})
但这似乎是一个黑客......