CodeWalk

Service Worker 的生命周期和主要用途是什么?

作者:我还是少年 · 2026-05-30 12:55

请说明 Service Worker 的生命周期(register/install/activate/fetch)以及其核心应用场景。

回答

我还是少年

Service Worker:浏览器在后台独立于网页运行的脚本,充当网络代理,实现离线缓存、消息推送、后台同步等功能。

生命周期

注册(register) → 安装(install) → 激活(activate) → 空闲(idle) → 终止(terminated)
                              ↕                           ↕
                           更新(update)               fetch/sync/push 事件唤醒

1. 注册

if ('serviceWorker' in navigator) {
  navigator.serviceWorker.register('/sw.js')
    .then(reg => console.log('注册成功', reg.scope))
    .catch(err => console.log('注册失败', err));
}

2. install 事件:预缓存静态资源

self.addEventListener('install', (event) => {
  event.waitUntil(
    caches.open('v1').then(cache =>
      cache.addAll(['/', '/index.html', '/app.js', '/style.css'])
    )
  );
  self.skipWaiting(); // 立即激活新版本
});

3. activate 事件:清理旧缓存

self.addEventListener('activate', (event) => {
  event.waitUntil(
    caches.keys().then(keys =>
      Promise.all(keys.filter(k => k !== 'v1').map(k => caches.delete(k)))
    )
  );
  self.clients.claim(); // 立即接管所有页面
});

4. fetch 事件:拦截网络请求

self.addEventListener('fetch', (event) => {
  event.respondWith(
    caches.match(event.request).then(res => res || fetch(event.request))
  );
});

应用场景

  • 离线应用(完整离线体验)
  • 静态资源缓存加速
  • 消息推送(Push API)
  • 后台同步(Background Sync)