1. Web Worker 定义
Web Worker 是浏览器提供的多线程能力,允许在主线程之外运行 JavaScript。
它的目标只有一个: 👉 把耗时任务从 UI 线程中挪走,让页面保持流畅。
2. Web Worker 作用
解决主线程的现实困境,主线程同时负责:
- JS 执行
- 页面渲染
- 用户交互
- 事件响应
一旦遇到👇
- 大量计算
- JSON 解析
- 文件处理
- 图片 / 视频处理
- 高频轮询 / 长时间任务
👉 UI 就会卡,页面就会"假死"。
3. Web Worker 的工作原理
1️⃣ 线程模型
主线程(UI / React)
│
├── postMessage
▼
Worker 线程(独立事件循环)
│
└── postMessage
- Worker 运行在 独立线程
- 拥有自己的事件循环
- 不会阻塞 UI
2️⃣ 通信机制
- 使用
postMessage传递消息 - 默认采用 structured clone(深拷贝)
- 可使用 Transferable(如 ArrayBuffer)转移所有权,避免拷贝
⚠️ Worker 不能访问 DOM / window / document,主线程的上下文
4. Web Worker 的类型
| 类型 | 名称 | 特点 | 使用场景 |
|---|---|---|---|
| Dedicated Worker | 专用 Worker | 一对一、最常用 | 计算、解析、后台任务 |
| Shared Worker | 共享 Worker | 多页面共享 | 多标签页共享状态 |
| Service Worker | service Worker | 拦截网络请求 | PWA / 离线缓存 |
| Worklet | ------ | 低延迟 | 音频 / 渲染 |
👉 日常业务中 90% 用 Dedicated Worker
5. Web Worker 的特点
- ✅ 真正的并行执行
- ✅ 避免主线程阻塞
- ❌ 不能操作 DOM
- ❌ 创建和通信有成本
- ⚠️ 数据传输需要考虑性能
6. 优缺点对照
- ✅ 优点
- 提升页面响应速度
- 适合 CPU 密集型任务
- 可作为后台"计算引擎"
- 可发送异步请求
- 可运行 fetch / WebSocket / IndexedDB
- ❌ 缺点
- 无法操作 DOM
- 通信存在数据拷贝成本
- 创建/销毁开销不小
- 调试、打包需要额外配置
7. React 中如何优雅使用 Web Worker
- ❌ 常见误区
- 每个组件 new 一个 Worker
- Worker 生命周期不清理
- 主线程/Worker 强耦合
- ✅ 推荐模式:Hook + 单例 Worker
csharp
const { post } = useWorker() // React Hook 库
const result = await post('compute', payload)
特点:
- Worker 只创建一次
- Promise 化调用
- 组件只关心结果
Web Worker 是全局资源,而不是组件资源。
8. 典型适用场景
- 🔥 强烈推荐使用
- 大数据计算 / 排序 / 过滤
- 图片处理、压缩、滤镜
- 视频转码、音频分析
- 文件解析(CSV / Excel / JSON)
- 加密、解密、哈希计算
- ⚠️ 谨慎使用
- 轻量逻辑
- 高频短任务
- 强依赖 DOM 的操作
10. Web Worker + WebSocket(工程进阶)
一个非常实用的组合:
- Worker 里维护 WebSocket
- 处理心跳 / 重连 / 解析
- 主线程只负责 UI 渲染
优势:
- UI 不受网络抖动影响
- 连接逻辑高度解耦
- 更稳定的实时通信
bash
┌────────────┐
│ React UI │
│ │
│ 订阅数据 │
│ postMessage│
└─────▲──────┘
│
│ structured clone
▼
┌────────────┐
│ Web Worker │
│ │
│ WebSocket │
│ 心跳/重连 │
│ 限流/聚合 │
└────────────┘