3

我正在使用 sw-precache 为 Web 应用程序添加离线支持。

我的设置:

  1. 带有 CSS/JS/HTML 的静态网站 动态内容通过自定义 indexedDB 解决方案进行处理。
  2. 使用 Grunt 任务生成 service-worker。
  3. sw-precache (4.0.0) 用于缓存所有静态资产。
  4. 在 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 传递给 respondWith 的 promise 对象的控制台调试输出

所以我的问题:

  1. 为什么 sw-precache 在缓存中找不到条目时不会回退到网络?
  2. 当在缓存中找不到请求条目时,是否有强制网络请求?
4

0 回答 0