web worker 中 onmessage 是接收主线程消息的唯一标准入口,本质为 messageevent 处理器,需在 self 或 this 上显式注册;支持结构化克隆的数据类型,不支持函数等不可序列化值;响应须用 self.postmessage(),并配合 transferable 提升性能;还需监听 onmessageerror 和 onerror 以处理通信与运行时异常。

Web Worker 内部监听主线程消息,核心就是 onmessage 事件。它不是可选插件,而是 Worker 线程接收外部数据的唯一标准入口,本质是 MessageEvent 的处理器,绑定在 Worker 全局作用域(self 或 this)上。
onmessage 的注册方式
Worker 脚本中必须显式设置监听逻辑,常见写法有三种,效果等价:
self.onmessage = function(e) { /* 处理 e.data */ };this.onmessage = function(e) { /* 处理 e.data */ };self.addEventListener('message', function(e) { /* 处理 e.data */ });
推荐使用第一种,语义清晰、兼容性好;若需动态添加/移除监听器,才用 addEventListener 方式。
消息数据的结构与类型支持
e.data 是实际传入的内容,不是字符串也不是 JSON 字符串,而是原样结构化克隆后的 JavaScript 值。支持:
- 普通类型:字符串、数字、布尔、null、undefined(注意 undefined 在某些旧版本中可能被忽略)
- 嵌套结构:对象、数组、Date、RegExp、Map、Set
- 二进制数据:Blob、File、ArrayBuffer 及其视图(如 Uint8Array)
不支持函数、Promise、DOM 节点、window 引用等无法序列化的值——这类数据传入会静默丢弃或触发 messageerror 事件。
主动响应:用 postMessage 回传结果
Worker 收到消息后,不能直接修改主线程变量,只能通过 self.postMessage() 发送响应。这个调用和 onmessage 配对构成双向通信闭环:
- 参数格式同
postMessage主线程调用:支持任意可克隆数据 - 大数据量场景建议搭配 transferable 对象,例如:
self.postMessage({id: 'img-1', buffer}, [buffer]);,避免拷贝开销 - 主线程通过
worker.onmessage接收该响应,e.data即为 Worker 发来的数据
错误与边界情况处理
仅靠 onmessage 不足以覆盖全部通信异常,还需关注两类事件:
-
self.onmessageerror:当主线程发送了无法结构化克隆的数据(如含有函数的对象),Worker 会触发此事件,e.data为空,e.source为 null -
self.onerror:捕获 Worker 内部运行时错误(如语法错误、未捕获异常),但不会拦截通信层错误
实践中建议在 Worker 开头统一监听 messageerror 并记录日志,便于定位协议不匹配问题。











