Service Worker就像浏览器的"智能管家",是一个在后台默默运行的独立线程。它能拦截网络请求、管理缓存资源,让你的网页实现离线访问、消息推送等原生APP才有的能力。
核心特性:
- 改写网页请求
- 本地资源管理员(最大50MB缓存空间)
- 页面关闭后仍能运行
- 安全卫士(必须HTTPS协议)
举个实际例子:当用户在地铁里打开你的新闻网站,Service Worker会立即调出缓存的最新文章,让用户无网络也能阅读。
实战场景
1. 离线缓存(最常用)
// 注册Service Worker
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/sw.js')
.then(() => console.log('管家已上岗'))
.catch(err => console.log('管家入职失败', err))
}
2. 秒开首屏(stale-while-revalidate策略)
// sw.js核心代码
self.addEventListener('fetch', event => {
event.respondWith(
caches.match(event.request)
.then(cachedResponse => {
// 后台更新缓存
const fetchPromise = fetch(event.request).then(networkResponse => {
const responseToCache = networkResponse.clone()
caches.open('v1').then(cache => cache.put(event.request, responseToCache))
})
return cachedResponse || networkResponse
})
)
})
这种策略让用户先看到缓存内容,同时后台悄悄更新资源。
3. 大文件分片下载
通过cachesAPI实现文件断点续传,适合视频类网站:
self.addEventListener('fetch', event => {
if (event.request.url.includes('/videos/')) {
event.respondWith(
caches.open('video-cache').then(cache =>
cache.match(event.request).then(res => res || fetch(event.request))
)
)
}
})
4. 后台数据同步
即使用户关闭页面,也能完成数据提交:
// 页面中触发同步
navigator.serviceWorker.ready.then(registration => {
registration.sync.register('submit-form-data')
})
// Service Worker处理
self.addEventListener('sync', event => {
if (event.tag === 'submit-form-data') {
event.waitUntil(submitData())
}
})
避坑指南
- 内存泄漏:及时清理旧缓存
self.addEventListener('activate', event => {
event.waitUntil(
caches.keys().then(keys =>
Promise.all(keys.map(key => {
if(key !== 'v2') return caches.delete(key)
}))
)
)
})
- 缓存雪崩:采用版本控制策略(如上述代码中的'v2')
- 首次加载:预缓存关键资源
self.addEventListener('install', event => {
event.waitUntil(
caches.open('v2').then(cache =>
cache.addAll(['/style.css', '/app.js'])
)
)
})
高频面试题
- Service Worker的生命周期?
安装(install)→等待(waiting)→激活(activate)→运行。更新时需要调用skipWaiting跳过等待阶段 - 如何更新缓存策略?
修改sw.js文件触发更新,通过版本号管理新旧缓存 - 与Web Worker的区别?
Service Worker专注网络代理,支持持久化运行;Web Worker专注计算任务,页面关闭即终止 - 如何实现离线统计?
通过IndexedDB暂存数据,网络恢复后批量上传 - 为什么必须HTTPS?
防止中间人攻击,保障请求拦截的安全性(localhost除外)
未来展望
Service Worker正在向更多领域延伸:
- 配合Web Assembly实现边缘计算
- 基于地理围栏的智能推送
- 视频流的分段预加载
- 与Web3技术结合实现去中心化存储
本文的主要目的不是技术深讨,想要了解更多的同学可以去参考mdn。本文大致是为了给大家介绍一下这个api,如果面试中碰到可以有点印象。