Service Worker 无法自动修复资源完整性,但可通过拦截请求、校验响应哈希、分层降级与元数据管理构建可控的本地分发中心;核心是版本化资源、响应头/manifest 校验、缓存分级策略及多源路由扩展能力。

Service Worker 本身不提供“资源完整性自动修复”能力,它没有校验哈希、重下载损坏文件或自我修复的内置机制。但你可以基于它的拦截能力和 Cache API,构建一套轻量、可落地的本地分发中心逻辑,在资源加载失败或校验不通过时,主动回退、重试或切换来源。关键不在“自动修复”,而在“可控降级 + 可验证缓存”。
核心思路:用缓存版本号 + 请求拦截 + 响应校验链实现可信分发
把 Service Worker 当作一个带策略的“本地 CDN 网关”:每次请求前查缓存元数据,加载后验证完整性(如 ETag、自定义 hash header 或预置 manifest),失败则触发备用流程。
- 所有静态资源(JS/CSS/图片/字体)必须带唯一版本标识,推荐用内容哈希命名(如
main.a1b2c3d4.js),天然防篡改且避免缓存混淆 - 服务端响应需携带可验证字段:优先用标准
ETag,或自定义X-Content-Hash: sha256-xxx;若无法改服务端,可在构建时生成manifest.json并随 SW 一起部署 - SW 在
fetch事件中拦截请求,先查缓存 → 检查响应是否匹配预期哈希 → 不匹配则删除旧缓存并重新 fetch
缓存管理:按资源类型分仓 + 元数据持久化
不能只靠 Cache API 存二进制,要额外维护一份轻量元数据索引(存在 indexedDB 或 cacheStorage 的专用 cache 中),记录每个资源的:
- URL、期望哈希值、最后校验时间、当前缓存版本号
- 是否为“强一致性资源”(如核心 JS)——这类资源校验失败必须阻塞渲染并强制重拉
- 是否允许弱一致性(如 banner 图)——校验失败可直接 fallback 到上一版或占位图
示例片段(注册校验逻辑):
self.addEventListener('fetch', event => {
if (!event.request.url.includes('/static/')) return;
event.respondWith(
handleWithIntegrityCheck(event.request)
);
});
完整性校验与恢复流程
校验不是一次性动作,而是三级响应:
- 一级(缓存命中即信任):对已知稳定资源(如哈希命名的 vendor.js),直接返回缓存,不做运行时校验,靠构建时保证
-
二级(响应头校验):对带
X-Content-Hash的请求,在 fetch 后读取 response headers,比对哈希;不一致则cache.delete()+fetch()重拉 - 三级(离线兜底):若网络失败且缓存校验失败,检查 indexedDB 中是否有前一版可用哈希,有则返回旧版并标记“需后台更新”;无则返回预置 error fallback 页面
本地分发中心的扩展能力
在此基础上可自然延伸出分发中心特性:
- 多源路由:SW 可根据设备类型、网络状态或地域,将 /api/* 请求代理到本地 mock server、边缘节点或主站,形成“软 CDN”
-
灰度资源注入:在 install 阶段预加载灰度包(如
v2.1.0-beta/main.js),并在 fetch 中按 cookie 或 feature flag 动态启用 -
静默更新通道:用
navigationPreload+backgroundFetch(如支持)在空闲时拉取新版资源包,校验通过后替换缓存,用户无感

















