Node.js 多线程一直有个绕不开的坎:postMessage 靠结构化克隆传数据,对象越大,内存越容易失控。Vercel Labs 的 Chris Tate 推出的 @scriptc/threads,想直接把这个环节拿掉。

它的做法是让发送端和所有 Worker 读取同一份底层数据结构,而不是各存一份副本。数据通过 publish() 函数以不可变图的形式共享,实现引用级零拷贝,序列化开销被彻底消除。

8个Worker的实测数字

在 8 个 Worker 协同处理的基准测试中,峰值内存从 3102 MB 降到 611 MB,缩减幅度超过 80%。这个数字对应的正是结构化克隆最吃力的场景:多线程同时持有大对象。

工具基于 scriptc 编译,API 贴合原生调用习惯,不需要开发者重新学习一套多线程模型。对已经在用 Worker 的项目来说,迁移成本被压得很低。

兼容性上的退路

@scriptc/threads 兼容原生 Worker API,并带有自动回退机制。在标准 Node.js 环境下,如果条件不满足,它会平滑回退到常规克隆方式,不会让代码直接跑不起来。

这一点对生产环境很关键:零拷贝是加速项,不是必须项。开发者可以先接入,再根据运行环境决定是否真正吃到那 80% 的内存收益。

Node.js 多线程的内存瓶颈存在已久,@scriptc/threads 给出的答案是把共享做成不可变图。8 个 Worker 的测试数据说明,这条路至少在大对象场景下是走得通的。