前端面试-Service Worker您的智能“牛马”

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())
  }
})

避坑指南

  1. 内存泄漏:及时清理旧缓存
self.addEventListener('activate', event => {
  event.waitUntil(
    caches.keys().then(keys => 
      Promise.all(keys.map(key => {
        if(key !== 'v2') return caches.delete(key)
      }))
    )
  )
})
  1. 缓存雪崩:采用版本控制策略(如上述代码中的'v2')
  2. 首次加载:预缓存关键资源
self.addEventListener('install', event => {
  event.waitUntil(
    caches.open('v2').then(cache => 
      cache.addAll(['/style.css', '/app.js'])
    )
  )
})

高频面试题

  1. Service Worker的生命周期?
    安装(install)→等待(waiting)→激活(activate)→运行。更新时需要调用skipWaiting跳过等待阶段
  2. 如何更新缓存策略?
    修改sw.js文件触发更新,通过版本号管理新旧缓存
  3. 与Web Worker的区别?
    Service Worker专注网络代理,支持持久化运行;Web Worker专注计算任务,页面关闭即终止
  4. 如何实现离线统计?
    通过IndexedDB暂存数据,网络恢复后批量上传
  5. 为什么必须HTTPS?
    防止中间人攻击,保障请求拦截的安全性(localhost除外)

未来展望

Service Worker正在向更多领域延伸:

  • 配合Web Assembly实现边缘计算
  • 基于地理围栏的智能推送
  • 视频流的分段预加载
  • 与Web3技术结合实现去中心化存储

本文的主要目的不是技术深讨,想要了解更多的同学可以去参考mdn。本文大致是为了给大家介绍一下这个api,如果面试中碰到可以有点印象。

原文链接:,转发请注明来源!