Service Worker 是运行在浏览器后台的可编程网络代理,能拦截请求并控制缓存,凭借独立生命周期、完整缓存控制权和可靠安装激活机制实现离线体验。

Service Worker 是运行在浏览器后台的脚本,独立于网页主线程,能拦截和处理网络请求,从而让网页具备离线访问、消息推送、后台同步等能力。它不是 DOM API,也不能直接操作页面元素,但正是这种“隔离性”让它可以稳定地控制资源加载逻辑,成为实现可靠离线体验的核心机制。
Service Worker 的本质:一个可编程的网络代理
它像一个中间人,位于网页和网络之间。当页面发起 fetch 请求(比如加载 JS、CSS、图片或 API 数据),Service Worker 可以决定:
- 直接从缓存中返回资源(跳过网络)
- 先查缓存,没命中再走网络,并把响应存入缓存
- 同时发起网络请求和缓存读取,优先展示缓存内容,再用网络数据更新(stale-while-revalidate)
- 甚至完全伪造响应(比如返回自定义的离线页面)
为什么它能实现离线体验:三大关键特性
1. 独立生命周期:注册后即使关闭网页,Service Worker 仍可在后台运行(只要浏览器进程未被彻底关闭)。这意味着它能持续监听 fetch 事件,包括用户断网后的请求。
2. 缓存控制权完整:通过 Cache API,它可以主动缓存任意资源(HTML、JS、API 响应等),不受 HTTP 缓存头限制。开发者完全掌控哪些资源存、何时存、怎么取。
立即学习“Java免费学习笔记(深入)”;
3. 安装与激活机制可靠:新版本 Service Worker 在安装阶段预缓存关键资源;只有激活成功后,才会接管页面请求。这确保了离线资源是完整且可用的,避免“半缓存”导致白屏。
一个典型离线流程示例
用户首次访问网站 → Service Worker 注册并安装 → 预缓存 HTML、核心 JS、离线页 → 用户第二次访问(甚至已断网)→ 页面加载时触发 fetch 事件 → Service Worker 拦截请求 → 返回已缓存的 HTML 和资源 → 页面正常渲染 → 同时检测到网络不可用,显示友好提示或自动降级内容。











