主线程通过new Worker()创建实例后调用postMessage()发送消息,支持基础类型、可结构化克隆的对象及转移ArrayBuffer;需监听message事件接收响应,避免向终止Worker或传不可克隆对象。

主线程通过 postMessage() 向 Web Worker 发送消息非常直接,核心是调用 Worker 实例的 postMessage() 方法,并传入可序列化的数据。
创建 Worker 实例后调用 postMessage
必须先用 new Worker() 创建实例,再调用其 postMessage()。不能对未初始化或已终止的 Worker 调用该方法,否则会静默失败或抛错。
- 发送基础类型(字符串、数字、布尔值):直接传递
- 发送对象或数组:需确保所有属性可被结构化克隆(structured clone),比如不能含函数、undefined、Symbol、Promise 或循环引用
- 发送 ArrayBuffer 或 TypedArray 时,可选择转移控制权(提升性能):传入第二个参数
[arrayBuffer]实现零拷贝
发送消息的典型写法
假设 Worker 脚本路径为 worker.js:
const worker = new Worker('worker.js');
// 发送普通对象
worker.postMessage({ type: 'LOAD_DATA', id: 123 });
// 发送字符串
worker.postMessage('hello from main thread');
// 发送 ArrayBuffer 并转移所有权(原主线程无法再访问该 buffer)
const buffer = new ArrayBuffer(1024);
worker.postMessage(buffer, [buffer]);
注意消息监听与响应时机
Worker 内部需监听 message 事件才能收到消息;主线程无需等待响应,postMessage() 是纯异步、无返回值的操作。
- 若需 Worker 返回结果,Worker 应在处理完后调用自身的
postMessage(),主线程通过worker.onmessage或addEventListener('message')接收 - 主线程可提前设置监听器,也可在创建 Worker 后立即绑定,顺序不影响通信可靠性
常见错误提醒
以下情况会导致消息发送失败或行为异常:
- Worker 脚本路径 404 或跨域,Worker 初始化失败,后续
postMessage()无效 - 向已调用
worker.terminate()的实例发消息,无效果且不报错 - 传入不可克隆的对象(如
{ fn() {} }),会抛出DataCloneError - 忘记处理 Worker 的
error事件,导致脚本内异常难以定位


















