caching - 覆盖 PWA Service Worker 中的浏览器缓存

标签 caching progressive-web-apps service-worker cachestorage

我正在使用“缓存”在服务工作线程中缓存我的 PWA Assets 并使其可以离线使用。

当我更改 Assets (特别是 js 文件)时,我会修改服务工作线程中的至少一个字节以触发其 native 更新:服务工作线程更新并检索其之前缓存的所有 Assets 以刷新其缓存。

然而,服务器以文件的缓存版本进行响应,虽然我拥有所提供的文件,但我无法控制 Cache-Control http header 。

如何防止浏览器缓存 Service Worker 缓存的资源?使用

对文件进行版本控制
"?v="+version

后缀不起作用,因为此版本无法传递到引用 html 文件中的缓存文件的 or 或 标记,这些文件是静态的,缓存将无法识别和提供脱机未版本控制的文件名。

由于“caches.addAll”不允许以任何方式指定 http 请求 header (例如像 fetch 或 XMLHttpRequest 那样的 Cache-Control),我如何防止对我的资源进行额外的激进缓存阶段?

我正在使用纯 JavaScript,如果可能的话,我需要在没有任何额外库的情况下完成它。另请注意,元 http-equiv 标记无法解决除完整 html 之外的资源的问题。

最佳答案

您可以通过显式构造 Request 来绕过浏览器的缓存。带有 cache 的对象属性设置为适当的 cache mode'reload' 是一个不错的选择,因为它将绕过传出请求的浏览器缓存,但它会使用响应更新浏览器的缓存(因此您将拥有更新鲜的浏览器缓存)。如果您甚至不想执行该更新,则可以使用'no-store'

下面的一些代码展示了如何针对可传递给 cache.addAll() 的 URL 数组简洁地执行此操作:

async function addAllBypassCache(cacheName, urls) {
  const cache = await caches.open(cacheName);
  const requests = urls.map((url) => new Request(url, {
    cache: 'reload',
  }));
  await cache.addAll(requests);
}

关于caching - 覆盖 PWA Service Worker 中的浏览器缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68023737/

相关文章:

php - WordPress 在内存中存储身份验证 token

vue.js - VueJS如何实现渐进式渲染?

javascript - 如何对 workboxSW 预缓​​存项使用 staleWhileRevalidate?

javascript - ServiceWorker 实例与地理位置更新的预期比率

低延迟、高可用性的java分布式缓存

asp.net - 如何全局禁用 ASP.NET WebForm 中的缓存

java - 如何在 Java 或 Python 中使用文件系统缓存?

android - 以 WebAPK 格式制作 PWA 的要求

javascript - 如果浏览器关闭,Google Chrome 推送通知无法正常工作?

javascript - ServiceWorker 向 FetchEvent.respondWith() 传递了一个 promise ,该 promise 以非响应值 ‘undefined’ 解析。浏览器同步