Chrome service worker 没有拦截缓存的请求
Chrome service worker not intercepting cached requests
我有这个简单的测试网站 https://service-worker-test.app.baqend.com/,可以并排显示 200 张图片。它注册了一个非常简单的 service worker。 HTML 看起来像这样:
<html>
<style>
img {
width: 50px;
width: 50px;
float: left;
padding: 5px;
}
</style>
<head>
<title>Service Worker Test</title>
<script type="text/javascript">
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('sw.js');
}
</script>
</head>
<body>
<div class="row">
<img src="/img/1.jpg"/>
<img src="/img/2.jpg"/>
...
<img src="/img/200.jpg"/>
</div>
</body>
</html>
service worker 只包含一个 fetch 事件的处理程序,打印出它看到的 url 个请求:
self.addEventListener('fetch', (event) => {
console.log('fetching: ' + event.request.url);
});
就是这样。现在 first load in chrome 安装 service worker。当我执行 second load 时,service worker 将 HTML 请求和所有 200 个图像请求打印到控制台,如下所示:
fetching: https://service-worker-test.app.baqend.com/
fetching: https://service-worker-test.app.baqend.com/img/1.jpg
fetching: https://service-worker-test.app.baqend.com/img/2.jpg
fetching: https://service-worker-test.app.baqend.com/img/3.jpg
....
fetching: https://service-worker-test.app.baqend.com/img/200.jpg
如果我选中“网络”选项卡中的禁用缓存复选框,所有进一步加载做同样的事情(确保在每次加载后清除控制台)。
现在的问题是:当 浏览器缓存未被禁用时 ,在几次加载后,service worker 只会打印以下内容:
fetching: https://service-worker-test.app.baqend.com/
仅此而已。同样在调试 service worker 时,只有 HTML 请求在 fetch 事件监听器中被处理。
我的问题是为什么 chrome 中的 service worker 在从浏览器缓存提供请求时看不到请求?
顺便说一句。该代码在 Firefox 中运行良好。
我在 Mac OS 版本 10.11.6 (15G1421)
上使用 Chrome 版本 59.0.3071.86
上述行为 由 Chrome 渲染引擎 Blink 中的内存缓存引起。
从内存中缓存提供的所有请求都不会通过 Service Worker,因为它们实际上并未作为请求发出,因为它们仍在位于 Service Worker 之前的内存中缓存中。
Jake Archibald 关于服务器推送的 This article 也说明了请求到达 Service Worker 之前的 "image cache"。
内存中的缓存遵循 HTTP 缓存语义并限定为当前选项卡。除了图像,它还存储样式、脚本和字体。除此之外,关于这个缓存的实现的信息很少。虽然有一些奇怪的事情:What does Blink in-memory cache store?
我有这个简单的测试网站 https://service-worker-test.app.baqend.com/,可以并排显示 200 张图片。它注册了一个非常简单的 service worker。 HTML 看起来像这样:
<html>
<style>
img {
width: 50px;
width: 50px;
float: left;
padding: 5px;
}
</style>
<head>
<title>Service Worker Test</title>
<script type="text/javascript">
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('sw.js');
}
</script>
</head>
<body>
<div class="row">
<img src="/img/1.jpg"/>
<img src="/img/2.jpg"/>
...
<img src="/img/200.jpg"/>
</div>
</body>
</html>
service worker 只包含一个 fetch 事件的处理程序,打印出它看到的 url 个请求:
self.addEventListener('fetch', (event) => {
console.log('fetching: ' + event.request.url);
});
就是这样。现在 first load in chrome 安装 service worker。当我执行 second load 时,service worker 将 HTML 请求和所有 200 个图像请求打印到控制台,如下所示:
fetching: https://service-worker-test.app.baqend.com/
fetching: https://service-worker-test.app.baqend.com/img/1.jpg
fetching: https://service-worker-test.app.baqend.com/img/2.jpg
fetching: https://service-worker-test.app.baqend.com/img/3.jpg
....
fetching: https://service-worker-test.app.baqend.com/img/200.jpg
如果我选中“网络”选项卡中的禁用缓存复选框,所有进一步加载做同样的事情(确保在每次加载后清除控制台)。
现在的问题是:当 浏览器缓存未被禁用时 ,在几次加载后,service worker 只会打印以下内容:
fetching: https://service-worker-test.app.baqend.com/
仅此而已。同样在调试 service worker 时,只有 HTML 请求在 fetch 事件监听器中被处理。
我的问题是为什么 chrome 中的 service worker 在从浏览器缓存提供请求时看不到请求?
顺便说一句。该代码在 Firefox 中运行良好。
我在 Mac OS 版本 10.11.6 (15G1421)
上使用 Chrome 版本 59.0.3071.86上述行为 由 Chrome 渲染引擎 Blink 中的内存缓存引起。 从内存中缓存提供的所有请求都不会通过 Service Worker,因为它们实际上并未作为请求发出,因为它们仍在位于 Service Worker 之前的内存中缓存中。
Jake Archibald 关于服务器推送的This article 也说明了请求到达 Service Worker 之前的 "image cache"。
内存中的缓存遵循 HTTP 缓存语义并限定为当前选项卡。除了图像,它还存储样式、脚本和字体。除此之外,关于这个缓存的实现的信息很少。虽然有一些奇怪的事情:What does Blink in-memory cache store?