工作箱:清理缓存

Joh*_*ika 7 service-worker progressive-web-apps workbox

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

var version = 'v2';
workbox.core.setCacheNameDetails({
  suffix: version
});
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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

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))))
  );
});
Run Code Online (Sandbox Code Playgroud)

abr*_*ham 11

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

来自Workbox文档.

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

Workbox并不认为是x-v2新的替代品x-v1.

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

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

预缓存

Precache对资产进行了修订,以便在资产发生变化时生成新的构建,并且部署已更改的资产将更新,并且未更改的资产将保持不变.

策略

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

呼气

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