浏览器标准化的 Worker 类型只有三种:Dedicated Worker(专用)、Shared Worker(共享)和 Service Worker(服务)。它们分别用于CPU密集计算、跨Tab状态共享、离线缓存与网络代理,职责、生命周期和通信机制各不相同。

Web Workers 并没有“三大线程家族”这个官方分类。这是对浏览器多线程能力的一种常见误读或营销式包装。浏览器中真正可用的、标准化的 Worker 类型只有三种:Dedicated Worker(专用 Worker)、Shared Worker(共享 Worker)和 Service Worker(服务 Worker)。它们职责不同、生命周期不同、通信机制不同,但都运行在独立线程(或独立上下文),不阻塞主线程。
专用 Worker:最常用、最可控的后台任务载体
每个 Dedicated Worker 绑定一个 JavaScript 脚本,由单个页面实例创建并独占使用。适合 CPU 密集型计算、数据预处理、加密解密等场景。
- 创建简单:
const worker = new Worker('./task.js'),支持 Blob URL 动态生成脚本 - 通信靠
postMessage+onmessage,消息需结构化克隆(不能传函数、DOM 节点等) - 生产建议:用
Transferable(如 ArrayBuffer)避免大数组拷贝;配合worker.terminate()及时释放资源;错误需监听onerror并上报
共享 Worker:跨 Tab/iframe 共享状态的轻量级方案
Shared Worker 可被同源下多个浏览上下文(如多个 tab、iframe)复用,通过端口(Port)通信。适合全局状态同步、实时消息中转、统一日志收集等。
- 必须显式调用
port.start()启动通信;每个连接对应一个独立端口 - 不支持直接访问
window或 DOM,但可访问self.name和self.clients(有限) - 生产注意:Chrome 已限制其跨 iframe 使用;Safari 对
self.clients支持弱;建议仅用于同源多 tab 场景,并做好降级(fallback 到多个 Dedicated Worker)
Service Worker:离线、缓存、网络代理的核心枢纽
Service Worker 是事件驱动的代理脚本,独立于页面运行,具备拦截网络请求、管理缓存、接收推送等能力。它是 PWA 的基石,不是为通用计算设计的。
- 生命周期由浏览器控制(install → waiting → active → redundant),不保证常驻;无权访问 DOM 或
localStorage - 通信依赖
postMessage(页面 ↔ SW)和clients.matchAll()主动向页面发消息 - 生产关键:用
skipWaiting()+clients.claim()加速更新;缓存策略推荐 Cache API + Stale-While-Revalidate 模式;务必处理 fetch 错误和 offline fallback
把这三者强行称作“线程家族”易引发概念混淆——Service Worker 本质是网络代理与生命周期控制器,不是通用线程;Shared Worker 实际应用受限,已逐渐边缘化;Dedicated Worker 才是绝大多数高可用后台任务的主力。真正构建生产级方案,关键是按场景选型、封装健壮通信层、监控异常生命周期、合理复用与销毁,而非套用虚构分类。

















