【问题标题】:Workbox: clean up cache工作箱:清理缓存
【发布时间】:2018-04-07 07:56:13
【问题描述】:

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

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

...一旦新的 service worker 激活,我希望工作箱会清理旧版本的缓存,但我的缓存存储看起来像这样:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    From the Workbox docs.

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

    Workbox 不认为 x-v2x-v1 的新替代品。

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

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

    precache

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

    strategies

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

    expiration

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

    【讨论】:

    • 优秀的答案!谢谢。
    • 好吧,再理解一遍。我不需要删除缓存,因为 Workbox 会自动处理它?我的问题是,在具有本地主机的浏览器中,我仍然需要手动删除服务器工作者,因为它不想更新代码,即使预缓存文件有一个新名称。现在我不确定是否应该像here 那样实施安全清除
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-10
    • 2020-05-21
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    • 2020-01-04
    • 1970-01-01
    相关资源
    最近更新 更多