service worker通过版本隔离、安装新缓存、激活时清理旧缓存实现更新:必须修改缓存名(如static-v1→static-v2),install阶段打开新缓存,activate阶段删除旧缓存并调用clients.claim(),fetch时明确指定cache_name以确保命中正确缓存。

Service Worker 更新缓存中的旧版本文件,核心在于版本隔离 + 安装新缓存 + 激活时清理旧缓存。它不是“覆盖”旧文件,而是用新缓存名称接管,再主动删掉旧缓存——这样能避免冲突,确保新旧版本不混用。
用带版本号的缓存名区分新旧资源
每次更新 Service Worker 时,必须改掉缓存名称(比如从 static-v1 改成 static-v2)。这是最关键的一步:
- 安装阶段打开新缓存名(如
caches.open('static-v2')),只往里面加新版资源; - 旧缓存(
static-v1)依然存在,但新 Service Worker 不会读它; - 如果缓存名不变,浏览器可能复用旧缓存,导致更新失效。
在 activate 阶段清理不再需要的旧缓存
激活事件是清理的唯一安全时机——此时旧 Service Worker 已退出,新 Worker 开始接管流量:
- 获取所有已存在的缓存名(
caches.keys()); - 过滤出不属于当前版本的缓存(比如保留
static-v2,删掉static-v1); - 调用
caches.delete(name)逐个清除; - 加上
self.clients.claim()让新 Worker 立即控制当前页面。
确保 fetch 请求命中正确的缓存
拦截请求时,不能硬写死缓存名。推荐做法是:
- 把当前缓存名定义为常量(如
const CACHE_NAME = 'static-v2'),和 install / activate 中的一致; - fetch 里用
caches.match(event.request, { cacheName: CACHE_NAME })明确指定; - 避免用
caches.match(event.request)这种模糊匹配,它可能随机命中任意一个缓存。
让更新更快生效(可选但实用)
默认情况下,用户要关掉所有标签页、重新打开,新 Service Worker 才会激活。开发或强更新场景下可主动推进:
- install 阶段调用
self.skipWaiting(),跳过 waiting 状态; - activate 阶段调用
self.clients.claim(),立即接管已打开的页面; - 注意:生产环境慎用
skipWaiting,除非你确认新版本完全兼容且无破坏性变更。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











