Service Worker
qzjs 实现的 Service Worker 子集:worker 跑在自己的线程上,拦截运行时的 fetch,从 CacheStorage 返回缓存响应,超时则回退到网络(有上限)。
注册
js
await navigator.serviceWorker.register('/sw.js');注册将 /sw.js 作为真实 Worker(独立线程)加载,引导 SW 生命周期, 并把 __qz_sw_intercept__ 装为 fetch 钩子。
生命周期状态
parsed → installing → installed → activating → activated
- 安装:SW 运行
installhandler;完成后即可激活。 - 激活:安装完成后 SW 成为 controller;
skipWaiting缩短等待 (qzjs 立即安装并激活——单运行时嵌入无需旧 controller 交接)。 - 请求拦截:激活后运行时每次
fetch()都经__qz_sw_intercept__; SW 的fetchhandler 决定从caches提供、命中网络还是合成响应。
Fetch handler
js
self.addEventListener('fetch', (event) => {
event.respondWith(
caches.match(event.request).then((cached) =>
cached || fetch(event.request)
)
);
});若 handler 未在 30 秒内响应,回退到网络,防止运行时因异常 SW 挂起。
更新机制
navigator.serviceWorker.update() 重新读取 SW 脚本并逐字节比对;若未变则 完全跳过安装。新 SW 仅在激活完成后接管为 controller(install/activate 期间旧 SW 保持拦截——无控制真空)。
说明
- 全局注册:每个运行时恰好一个 SW;
scope接受但忽略(qzjs 将运行时视为 单一 origin)。 - 离线优先模式中,SW 与 CacheStorage 成对工作: SW 路由到 caches,caches 存储响应。