我正在使用 sw-precache 为 Web 应用程序添加离线支持。
我的设置:
- 带有 CSS/JS/HTML 的静态网站 动态内容通过自定义 indexedDB 解决方案进行处理。
- 使用 Grunt 任务生成 service-worker。
- sw-precache (4.0.0) 用于缓存所有静态资产。
- 在 apache 上设置的 service-worker.js 上的缓存标头如下:
<LocationMatch "service-worker\.js.*"> Header set Cache-Control "max-age=0, no-cache" </LocationMatch>
在通常情况下,事情似乎工作正常。但是,如果由于某种原因,用户清除了缓存(例如在 chrome 开发工具 -> 应用程序 -> 清除存储(选择所有内容)-> 单击“清除所选内容”),即使我在线并且我的网页也不会加载我在控制台中看到以下错误:
“ https://my.somedomain.com/somepath/somepage.html ” 的 FetchEvent 导致网络错误响应:一个不是响应的对象被传递给了 respondWith()。
当我查看生成的 service-worker.js 时,我注意到以下代码。
// If shouldRespond was set to true at any point, then call
// event.respondWith(), using the appropriate cache key.
if (shouldRespond) {
event.respondWith(
caches.open(cacheName).then(function(cache) {
return cache.match(urlsToCacheKeys.get(url));
}).catch(function(e) {
// Fall back to just fetch()ing the request if some unexpected error
// prevented the cached response from being valid.
console.warn('Couldn\'t serve response for "%s" from cache: %O', event.request.url, e);
return fetch(event.request);
})
);
调试时,我没有看到 catch 块被执行。另请参阅传递给 respondWith() 的返回的对象的附加调试输出 catch.match
所以我的问题:
- 为什么 sw-precache 在缓存中找不到条目时不会回退到网络?
- 当在缓存中找不到请求条目时,是否有强制网络请求?