1

我正在尝试为我的网络应用程序实现离线功能,但我在离线时遇到了一些奇怪的行为,这可能是我缺少的东西,因为它在 Chrome 和 Firefox 中都可以重现。

我将在下面描述我创建的示例应用程序的作用:

重现步骤

  1. 打开一个新的 Chrome 选项卡并打开控制台视图。
  2. 导航到示例应用程序(托管在 Netlify 上)。
  3. 观察日志消息,确认 Service Worker 的安装和激活,以及应用缓存存储的创建和填充。
  4. 转到开发人员工具中的应用程序选项卡并确认已创建并填充缓存
  5. 在“Service Worker”下启用“离线”以使网络不可用。
    • 或者,只需关闭您的 wifi/网络。
  6. 刷新页面。

观察到的行为

  • MyCache服务工作者之前创建的缓存存储消失了。

预期行为

  • 该页面无法按预期加载,但缓存存储在刷新后应保持可用,以便应用可以在离线时使用它来提供内容。

HTML 代码

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">

  <title>Vanishing cache storage test</title>
    <script>
        if ('serviceWorker' in navigator) {
            window.addEventListener('load', () => {
                navigator.serviceWorker.register('/sw.js')
                    .then((registration) => {
                        console.log('Service worker registered sucessfully:', registration);
                    })
                    .catch((error) => {
                        console.error('Failed to register service worker:', error.stack);
                    });
            });
        }
  </script>
</head>
<body>
  <h1>Hi!</h1>
</body>
</html>

服务人员

const CACHE_NAME = 'MyCache';

self.addEventListener('install', (event) => {
  event.waitUntil(
    caches.open(CACHE_NAME)
      .then((cache) => {
        return cache.add('/');
      })
      .then(() => {
        console.debug(CACHE_NAME, 'created and populated');
      })
  );
});

self.addEventListener('activate', (event) => {
  console.debug('SW activated');
});

操作系统+浏览器版本

Google Chrome 版本:87.0.4280.141(官方构建)(x86_64) Firefox 版本:85.0b5(64 位,开发者版) 操作系统:macOS v11.1(Big Sur)

问题

这是预期的行为吗?如果是这样,为什么?

笔记

  • 我无法在 Safari 上进行测试,因为我没有可视化缓存存储内容的可见方法(啊!)。
  • 在 Firefox 上刷新后,您可能需要关闭并重新打开 devtools 以使“存储”选项卡自行刷新。

离线前:缓存是 A-OK 离线刷新后:缓存消失了!

4

2 回答 2

3

缓存内容仍然存在。如果您上网并刷新页面,您可以再次看到它(它没有被重新下载)。

我已经提交了https://bugs.chromium.org/p/chromium/issues/detail?id=1164309,因为即使页面没有加载,存储也应该在 devtools 中可见。

于 2021-01-08T10:32:28.227 回答
0

不,缓存存储在离线后不会消失。 您遇到此行为的原因是您的网站目前未在离线模式下运行。

在您的服务工作者中添加以下 fetch 事件处理程序,您的站点也将在离线模式下正常工作。

self.addEventListener("fetch", function (event) {
  event.respondWith(
    caches.match(event.request).then(function (response) {
      if (response) {
        return response;
      }
      return fetch(event.request);
    })
  );
});
于 2021-01-08T10:13:12.887 回答