Service Worker 与 PWA
前端里一提到离线、预缓存、安装到桌面、后台同步,主线基本都会落到 Service Worker 和 PWA。
这两件事经常被一起提,但并不是同一个概念:
Service Worker是浏览器提供的一层可编程代理能力PWA是一组更完整的体验目标,通常会把Service Worker、manifest、离线能力、可安装性放在一起看
先把关系理顺
Service Worker 是什么
它是一段运行在浏览器后台的脚本,可以拦截页面发出的网络请求,并决定:
- 直接走网络
- 先查缓存
- 网络失败后兜底
- 在后台做同步、推送或更新
它不直接操作页面 DOM,也不和页面共享同一执行环境。
PWA 是什么
PWA,Progressive Web App,更像一套体验目标:
- HTTPS
- 可安装
- 有图标、名称、启动页
- 弱网或离线时仍然能工作一部分
- 更接近原生 App 的访问方式
所以可以简单记成:
Service Worker更偏底层能力PWA更偏最终产品体验
Service Worker 在解决什么
普通前端页面如果完全依赖网络,一旦进入这些场景,体验就会明显掉下来:
- 地铁、电梯、弱网环境
- 首屏要请求很多静态资源
- 二次访问本可以更快,但还是反复走网络
- 某些接口可以短期容忍旧数据,但页面还是完全阻塞
Service Worker 能补上的,通常是这些:
- 静态资源预缓存
- 离线兜底页
- API 响应缓存
- 更新时机控制
- 后台同步
- 推送通知
它为什么经常被说成“浏览器里的代理”
因为请求路径会变成:
- 页面发起请求
- Service Worker 决定怎么处理
- 再去网络或缓存拿结果
- 把结果返回给页面
这意味着它很适合接管:
- HTML
- CSS
- JS
- 图片
- 字体
- 部分 API 请求