工作箱:清理缓存

时间:2018-04-07 07:56:14

标签: service-worker progressive-web-apps workbox

似乎workbox不会清理旧的缓存。例如,如果我指定这样的缓存版本:

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

...一旦新服务工作者激活,我本来希望workbox能够清理旧版本的缓存,但我的缓存存储看起来像这样:

enter image description here

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

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))))
  );
});

1 个答案:

答案 0 :(得分:6)

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

From the Workbox docs.

  

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

Workbox不会将x-v2视为x-v1的新替代品。

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

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

precache

Precache对资产进行了修订,以便资产发生变化,生成新版本,部署更改的资产将更新,未更改的资产将保持不变。

strategies

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

expiration

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