Service Worker 处理 API 缓存应采用 Network First + 缓存兜底策略,优先网络请求,失败时返回缓存或预置降级 JSON;需区分 API 与静态资源,仅缓存 GET 接口,响应后主动更新缓存并清理过期数据。

Service Worker 处理 API 数据缓存与回退,核心在于区分资源类型、选择合适策略,并在 fetch 事件中主动控制响应流程。API 数据通常是动态的(如用户信息、列表页数据),不能简单套用静态资源的“缓存优先”逻辑,否则容易返回过期内容。关键不是“要不要缓存”,而是“什么时候缓存、怎么更新、失败时给什么”。
区分 API 请求并单独处理
不是所有请求都该走同一套缓存逻辑。需先识别哪些是 API 请求(比如以 /api/ 或 /v1/users 开头),再针对性设计策略:
- 用
event.request.url.startsWith('/api/')或正则匹配判断是否为 API 请求 - 对非 API 请求(HTML/CSS/JS/图片)继续用缓存优先策略
- 避免把登录态、实时订单等敏感接口误缓存,必要时加
cache: 'no-store'或跳过缓存
推荐用 Network First + 缓存兜底
这是 API 场景最稳妥的模式:总是先尝试网络获取最新数据,失败时才读缓存——既保证数据新鲜,又不失离线可用性:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 代码结构简洁:
fetch(event.request).catch(() => caches.match(event.request)) - 注意:fetch 失败包括网络断开、超时、跨域拒绝等,但不包括 HTTP 4xx/5xx 状态码(它们仍算“成功响应”,需业务层判断)
- 建议在 catch 后加日志或上报,便于监控离线频次和接口稳定性
缓存更新要主动且可控
单纯“读缓存+网络兜底”还不够。如果用户刚提交了新评论,刷新页面却看不到,说明缓存没及时更新。可结合以下方式:
立即学习“Java免费学习笔记(深入)”;
- 在 fetch 响应成功后,用
cache.put(request, response.clone())把新数据存入缓存(clone()防止流被消费两次) - 对关键 API(如用户资料),可在用户操作后手动调用
caches.open().delete()清掉旧缓存,下次请求自然拉新 - 避免无差别缓存所有 API 响应;只缓存 GET 类只读接口,POST/PUT/DELETE 不缓存
离线时提供有意义的降级体验
纯返回旧缓存可能让用户困惑(比如显示“已删除”的商品仍在列表里)。更优做法是:
- 预缓存一个轻量级 fallback JSON,如
{ "status": "offline", "message": "网络不可用,显示最近数据" } - 在 catch 分支里优先匹配这个 fallback,而不是直接返回原始缓存
- 前端收到响应后,通过自定义 header(如
X-Cache-Status: stale)或响应体字段,提示用户当前内容可能不是最新的

















