4

我需要在每次发布后“清除”或“无效”Workbox SW 缓存。

这就是我打算做的(当然是虚拟版本),但我没有足够的经验来理解这是否是正确的方法:

importScripts(...);

const version = 1;
const workboxSW = new WorkboxSW();

workboxSW.router.registerRoute(/\.(?:png|gif|jpg|svg|json|js|css|woff|mp3)$/,
    workbox.strategies.cacheFirst({
        cacheName: 'static-cache-' + version
    })
);

并在每个版本中增加版本:) 我应该从以前的版本中清除每个文件吗?有不同的方法吗?

tnx 用于反馈

4

2 回答 2

11

这对我来说很有意义,但是您应该确保当激活事件发生时,您清除所有不需要的旧缓存。

一个非常基本的方法(假设您可以完全清除缓存)是擦除当前存在的所有缓存)。

// Clean up caches in activate event to ensure no pages
// are using the old caches.
self.addEventListener('activate', (event) => {
  const promiseChain = caches.keys()
  .then((cacheNames) => {
    // Step through each cache name and delete it 
    return Promise.all(
      cacheNames.map((cacheName) => caches.delete(cacheName))
    );
  });

  // Keep the service worker alive until all caches are deleted.
  event.waitUntil(promiseChain);
});

您可能希望更聪明地使用此逻辑(即检查版本号或仅删除您知道的缓存名称)。

于 2018-04-18T18:10:07.350 回答
2

如果您想采用缓存优先策略,那么我建议您将 Workbox 集成到您的构建过程中,并使用其内置支持来生成“预缓存清单”。此清单将确保您的预缓存文件在您每次重新部署 Web 应用程序时保持最新。

在https://developers.google.com/web/tools/workbox/#get_started上有一些构建时集成入门指南

如果您选择不这样做,那么我建议不要使用缓存优先策略,而是使用网络优先策略。

于 2018-01-30T18:36:00.633 回答