Service Worker 是现代Web平台的一项革命性技术。它本质上是一个由JavaScript编写的浏览器后台线程,独立于网页主线程运行。它的核心能力是充当一个可编程的网络代理,允许你拦截、修改和处理页面的网络请求,从而实现可靠的离线体验、资源缓存控制和后台数据同步等功能。
![图片[1]-什么是Service Worker?-速码派](http://www.sumapai.com/wp-content/uploads/2026/01/f8c8fa3ac17e4de7a1e2c6df580254d3_tplv-tb4s082cfz-aigc_resize_1080_1080-1024x683.webp)
Service Worker的生命周期
Service Worker的生命周期严格且独立。它从注册开始,经历安装、激活等阶段,最终进入运行状态。这个生命周期事件是你进行初始缓存的入口。
// 在主线程中注册 Service Worker
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/sw.js')
.then(registration => console.log('注册成功'))
.catch(error => console.log('注册失败', error));
}
一旦注册成功,浏览器会在后台安装并激活这个 Service Worker 文件。一个激活的 Service Worker 可以控制其作用域(通常是其所在目录及子目录)内的所有页面。
拦截和缓存网络请求
这是 Service Worker 最强大的特性。通过监听 fetch 事件,你可以拦截页面发出的所有网络请求,并决定如何响应——是从网络获取,还是从缓存中返回,亦或是返回一个自定义响应。
// 在 sw.js 中
self.addEventListener('fetch', event => {
event.respondWith(
caches.match(event.request)
.then(cachedResponse => {
// 如果缓存中有,返回缓存,否则从网络获取
return cachedResponse || fetch(event.request);
})
);
});
结合 Cache API,你可以实现精细的缓存策略。例如,在 install 事件中预缓存核心静态资源,确保页面离线可用。
self.addEventListener('install', event => {
event.waitUntil(
caches.open('v1').then(cache => {
return cache.addAll([
'/',
'/index.html',
'/main.css',
'/app.js'
]);
})
);
});
构建离线优先的应用
Service Worker 是实现 PWA(渐进式Web应用)离线能力的基石。通过“缓存优先,网络回退”等策略,即使在网络不稳定或完全离线的情况下,应用也能展示基本内容或提供友好的离线提示,极大提升了用户体验的可靠性。
此外,Service Worker 还支持后台同步(Background Sync),允许你在用户网络恢复后,自动重试之前失败的请求。它也使得推送通知(Push Notifications)成为可能,让Web应用能像原生应用一样重新吸引用户。
由于 Service Worker 运行在独立的线程且权限很高,它只能在安全的 HTTPS 连接(或本地 localhost 环境)下工作,以保证不会被恶意篡改。理解和善用 Service Worker,是将你的Web应用从简单的网站转变为强大、可靠应用的关键一步。






















暂无评论内容