Transferable Objects 通过零拷贝移交内存所有权显著降低 Web Workers 通信开销,仅支持 ArrayBuffer、MessagePort 等特定类型,须显式传入 transfer list(如 worker.postMessage(buffer, [buffer])),移交后原上下文对象立即失效。

Web Workers 通信开销主要来自数据序列化/反序列化、频繁消息往返和内存复制。真正影响性能的不是“用了 Worker”,而是“怎么传数据”。优化重点不在线程数量,而在传输方式和数据结构设计。
用 Transferable Objects 避免数据拷贝
结构化克隆会完整复制 ArrayBuffer、TypedArray 等二进制数据,10MB 数据可能带来几十毫秒延迟。Transferable Objects 能把数据所有权直接移交 Worker,主线程不再持有副本。
- 必须在
postMessage第二个参数中显式传入可转移对象数组,如worker.postMessage(buffer, [buffer]) - 移交后主线程无法再访问该 buffer,读写会抛出错误,需提前完成所有主线程侧操作
- 只支持特定类型:ArrayBuffer、MessagePort、ImageBitmap、OffscreenCanvas 等,不支持普通对象或 JSON
分块传输 + 批量处理
一次性传 100 万个数字对象,不如分 100 批、每批 1 万个。既降低单次序列化压力,也避免阻塞主线程事件循环。
- 按固定大小(如 500–2000 条)切分数组,用循环 +
postMessage分批发送 - Worker 端累积接收,等批次收齐再统一处理,减少中间状态判断开销
- 对实时性要求不高的场景(如日志上报、离线计算),可加简单队列缓冲,合并多次小请求
精简传输内容,预计算静态部分
很多数据里混着大量不变字段——主题配置、接口地址、枚举映射表。这些不该每次动态生成再传,而应在构建时固化。
- 把常量对象提成顶层 const,Worker 加载时直接引用,无需传输
- 时间戳、用户 ID 等动态字段单独提取,只传必要增量数据
- 借助构建工具(如 esbuild、swc)做编译期替换,或用类似 Prepack 的思路提前序列化静态结构
考虑 SharedArrayBuffer(需配合 Atomics)
适用于高频、小粒度、多轮读写的场景,比如实时音视频处理或游戏物理模拟。它实现零拷贝共享内存,但有严格限制。
- 必须启用跨域隔离(Cross-Origin-Opener-Policy + Cross-Origin-Embedder-Policy)
- 读写需用
Atomics保证线程安全,不能直接赋值或修改属性 - 浏览器兼容性尚可(Chrome 68+、Firefox 70+、Safari 15.4+),但移动端需谨慎验证

















