10

工作箱似乎没有清理旧缓存。例如,如果我指定这样的缓存版本:

var version = 'v2';
workbox.core.setCacheNameDetails({
  suffix: version
});

...一旦新的服务工作者激活,我希望工作箱会清理旧版本的缓存,但我的缓存存储如下所示:

在此处输入图像描述

自己手动清理缓存是否安全?例如在我的服务人员中:

self.addEventListener('activate', function(event) {
  event.waitUntil(
    caches
      .keys()
      .then(keys => keys.filter(key => !key.endsWith(version)))
      .then(keys => Promise.all(keys.map(key => caches.delete(key))))
  );
});
4

1 回答 1

16

您正在将suffix属性值更改为您作为版本的字符串。但 Workbox 仅使用它来命名存储桶以进行缓存。

来自 Workbox 文档。

前缀和后缀的主要用例是,如果您将 Workbox 用于多个项目并为每个项目使用相同的 localhost,为每个模块设置自定义前缀将防止缓存相互冲突。

Workbox 不认为x-v2x-v1.

您可以很好地使用缓存驱逐策略,因为 Workbox 将不再使用以前命名的缓存。

但是,您不需要使用suffix来对资产进行版本控制。Workbox 有许多工具来确保正确更新资产。此外,您的suffix实施将始终从一个新的缓存开始并下载所有内容。

预缓存

Precache 对资产进行了修订,因此当资产更改时,您会生成一个新的构建,并且部署更改的资产将更新,而未更改的资产将被单独保留。

策略

策略是完成大部分工作的地方。当您定义路由时,您将定义最适合该类型资产的缓存策略。staleWhileRevalidate是一种很好的方法,其中将使用设备上的缓存,但 Workbox 也会并行访问网络并检查该资源是否有更新。

到期

您还可以确保在旧资产超过定义的到期时间时清除它们。

于 2018-04-08T16:24:50.217 回答