Service Worker 可通过 install/activate/fetch 事件与 Cache API 实现按需缓存:静态资源预缓存、公共数据带 TTL 缓存、用户接口网络优先+主动更新;按用途+版本命名缓存、fetch 中条件写入、主动触发更新与精准失效。

Service Worker 本身不提供“按需缓存生命周期”这一抽象概念,但可以通过精准控制 install、activate 和 fetch 三个核心事件,结合 Cache API 的显式操作,实现接口请求的精细化、按需缓存管理。
明确哪些接口该缓存、何时缓存
不能把所有 fetch 都一视同仁。应根据资源特性分类处理:
-
静态资源(CSS/JS/图片):在 install 阶段预缓存,用固定版本名(如
v2.1-static),避免运行时反复拉取 -
用户无关的公共数据(天气、公告):fetch 时按需缓存,设置 TTL(例如 10 分钟),响应头中带
Cache-Control: max-age=600,并在缓存逻辑中读取并校验 -
用户私有接口(个人订单、消息列表):不进 install 缓存;fetch 中可选择“网络优先 + 缓存兜底”,且每次成功响应后主动更新缓存(用
response.clone()写入),确保下次离线时返回最新一次有效数据
用版本化缓存名隔离不同策略
避免缓存污染和误删。不要共用一个 cacheName,而是按用途+版本动态命名:
-
cache-api-public-v3:存放公告、配置类接口,随主逻辑版本升级而变更 -
cache-api-user-202605:按月划分用户数据缓存,便于 activate 阶段批量清理过期数据 -
cache-dynamic-ttl:专用于带时间戳或 max-age 的临时缓存,fetch 中手动检查有效期
激活时只删非白名单缓存,保留当前策略所需的历史缓存,防止冷启动失败。
fetch 中实现“条件缓存写入”
不是所有响应都值得缓存。可在 fetch 事件中加入判断逻辑:
- 检查
event.request.method === 'GET',跳过 POST/PUT 等非幂等请求 - 用
new URL(event.request.url)提取路径和查询参数,过滤含auth=或timestamp=的 URL(防缓存击穿) - 检查响应状态:
response.status === 200才写入缓存;4xx/5xx 不缓存,或单独存为 fallback 响应 - 对 JSON 接口,可解析
response.json()后判断字段(如data?.valid === true)再决定是否缓存
主动触发更新与失效控制
依赖浏览器自动更新不够可靠。建议补充主动机制:
- 页面加载后调用
navigator.serviceWorker.getRegistration(),检查waiting状态,提示用户“新版本已就绪,点击刷新生效” - 关键接口响应中携带自定义 header(如
X-Cache-Strategy: stale-while-revalidate),fetch 中读取并执行对应逻辑 - 用户登出时,主动调用
caches.delete('cache-api-user-202605')清理敏感数据 - 监听
message事件,支持主页面发送指令(如{type: 'invalidate', key: '/api/orders'})来精准删除某条缓存

















