Dedicated Worker 是 JavaScript 实现后台多线程计算的核心方式,需用同源外部 JS 文件启动,通过 postMessage 双向通信,禁止 DOM 操作,须主动调用 terminate() 或 close() 终止以避免资源泄漏。

Dedicated Worker 是 JavaScript 实现后台多线程计算的核心方式,它不阻塞主线程,适合处理大量数学运算、数据解析、加密解密等 CPU 密集型任务。配置和使用的关键在于脚本分离、通信约定与生命周期管理,不是靠语法糖,而是靠规范约束。
必须用独立 JS 文件启动 Worker
不能把 Worker 逻辑写成字符串、箭头函数或内联脚本——浏览器会直接报错。Worker 脚本必须是同源的外部 .js 文件。
- 正确写法:
const worker = new Worker('calc.js'); - 错误写法:
new Worker('self.postMessage(42)')或new Worker(() => {...}) - 如需动态生成脚本,可用 Blob + URL.createObjectURL 构造(属于进阶用法,非默认推荐)
主线程与 Worker 的双向通信机制
通信完全依赖 postMessage() 和 onmessage(或 addEventListener('message', ...)),数据通过结构化克隆传递,支持普通对象、数组、Date、RegExp、Map、Set 等,但不包括函数、DOM 节点或 undefined。
- 主线程发送:
worker.postMessage({ type: 'start', data: [1, 2, 3] }); - Worker 接收(在 calc.js 中):
self.onmessage = (e) => { console.log(e.data); }; - Worker 发送结果:
self.postMessage({ result: 42, id: e.data.id }); - 主线程监听:
worker.onmessage = (e) => handleResult(e.data);
初始化阶段可做的事与禁忌
Worker 脚本加载后立即执行,此时适合做一次性准备,但要避开所有 DOM 相关操作。
立即学习“Java免费学习笔记(深入)”;
- 可以:预加载 WebAssembly 模块、建立缓存 Map、初始化大型 ArrayBuffer、设置定时器或事件监听器
- 禁止:访问
document、window、localStorage、console(部分浏览器允许,但非标准)、fetch(虽支持,但需注意 CORS) - 建议首次收到消息后再开始主逻辑,避免空转;传参统一走
postMessage,不要试图在构造时传参
终止 Worker 避免资源泄漏
Worker 不会自动销毁,即使主线程已无引用,线程仍可能持续运行。必须主动清理。
- 主线程终止:
worker.terminate()(立即结束,不等待当前任务) - Worker 自行退出:
self.close()(推荐在完成任务后调用) - 监听错误并降级:
worker.onerror = (e) => { console.error(e.filename, e.lineno, e.message); } - 若频繁创建/销毁,考虑复用 Worker 实例,而非每次新建


















