Service Worker 是一条独立于浏览器主线程运行的后台 JavaScript 线程。作为一个前端控制的代理服务器,它可以拦截页面的网络请求(fetch 事件),并决定是从网络获取数据还是从本地 Cache 获取,从而实现应用的离线可用和体验。
理解其生命周期对于避免版本更新问题非常重要:
self.skipWaiting() 强制其跳过等待,立即激活。clients.claim() 可以让它在首次注册时立即控制当前页面。在拦截 fetch 事件后,常用的缓存与网络分发策略如下:
优先从本地缓存读取,如果没有命中才发起网络请求并存入缓存。 适用场景:基本不怎么变动的静态资源(如带 Hash 的 JS/CSS 文件、字体、Logo)。
优先向服务器发起请求,如果网络异常或请求超时,则降级使用本地缓存中的数据。 适用场景:对实时性要求较高的数据(如文章列表、用户信息)。
有缓存时优先返回缓存,立刻让页面渲染;同时在后台静默发起网络请求更新缓存。这样下次访问时就能拿到最新的数据。 适用场景:更新频率较高但允许短暂展示旧数据的资源(如用户头像、次要的展示图片)。
postMessage 进行跨线程通信。localhost 本地开发环境)。