Web Workers 是 JavaScript 在后台线程运行脚本的机制,用于避免密集计算阻塞主线程;通过 new Worker() 创建、postMessage() 通信,不可操作 DOM,适用于大数据排序、音视频处理、加密解密等场景。

Web Workers 是 JavaScript 提供的一种在后台线程中运行脚本的机制,让耗时任务不阻塞主线程,从而保持页面响应流畅。
为什么需要 Web Workers
浏览器中 JavaScript 是单线程执行的,所有代码(包括 DOM 操作、事件处理、定时器等)都跑在同一个主线程上。一旦执行密集计算(比如图像处理、大数据排序、加密解密),页面就会“卡住”,按钮点不动、滚动延迟、动画掉帧。Web Workers 把这部分工作搬到独立线程里,主线程继续处理用户交互和渲染。
Web Workers 的基本用法
它不是直接在当前脚本里开个线程,而是通过加载一个单独的 JS 文件来启动新线程:
- 用 new Worker('path/to/worker.js') 创建并启动一个专用 Worker
- 主线程和 Worker 之间通过 postMessage() 发送消息,用 onmessage 接收
- Worker 里不能访问 window、document、DOM 等全局对象,但可以使用 XMLHttpRequest、fetch、setTimeout、WebAssembly 等
- Worker 内部用 self.postMessage() 向主线程发消息,self.onmessage 接收
常见使用场景
适合那些计算量大、与界面无关、可异步完成的任务:
立即学习“Java免费学习笔记(深入)”;
- 前端做大型数组排序或搜索(比如十万条数据的模糊匹配)
- 实时音视频处理(如 WebRTC 中的音频降噪预处理)
- 离线数据加密/解密(避免暴露密钥到主线程)
- Canvas 图像滤镜运算(高斯模糊、边缘检测等)
- 解析大型 JSON 或 CSV 文件(边读边处理,不卡 UI)
注意限制和替代方案
Web Workers 不是万能的:
- 不能操作 DOM,也不能直接修改页面内容
- 每个 Worker 是独立上下文,变量和函数不共享,通信靠序列化消息(注意 无法传函数、undefined、循环引用对象)
- 频繁通信有开销,不适合微小任务
- 如果只需简单异步,Promise + async/await 或 setTimeout 更轻量;真正重计算才用 Worker
基本上就这些。用对地方,Web Workers 能明显提升用户体验,尤其在数据密集型 Web 应用中。










