Web WorkerService Worker 都是浏览器提供的 JavaScript 多线程技术,但它们的用途和工作方式有显著区别。

对比项 Web Worker Service Worker
用途 用于在后台线程执行 CPU 密集型任务,避免阻塞主线程 主要用于离线缓存、网络请求拦截、推送通知等 PWA(渐进式 Web 应用)功能
生命周期 由页面创建,页面关闭后终止 独立于页面,即使页面关闭也能运行(直到被浏览器终止)
DOM 访问 ❌ 不能访问 DOM ❌ 不能访问 DOM
网络请求 ⚠️ 可以发起 `fetch`,但不能拦截请求 ✅ 可以拦截、修改网络请求(`fetch` 事件)
存储能力 ⚠️ 可使用 `IndexedDB`、`localStorage`(同步 API 不可用) ✅ 可使用 `Cache API`、`IndexedDB`
通信方式 ✅ `postMessage` 与主线程通信 ✅ 通过 `postMessage` 与页面通信,也支持 `BroadcastChannel`
典型应用场景 大数据计算、图像处理、复杂算法 离线缓存、资源预加载、后台同步、推送通知
注册方式 `new Worker('worker.js')` `navigator.serviceWorker.register('sw.js')`
作用范围 仅影响当前页面 可控制多个页面(作用域内)
是否支持 `importScripts` ✅ 支持 ✅ 支持

Web Worker(专用 Worker)

  • 用途:在独立线程运行脚本,防止主线程卡顿(如计算、数据处理)。
  • 特点
    • 由页面创建,页面关闭后 Worker 终止。
    • 不能访问 DOM、`window`、`document`。
    • 通过 `postMessage` 与主线程通信。

```html

Document