我看了三年前端工具链,今天终于把 Rust 为什么比 JS 快这件事从根上算清楚了
写过 JavaScript 构建工具的人都知道那种感觉——明明项目不大,改一行代码要等十几秒;大型 monorepo 跑一次全量构建,三五分钟就没了。
根子在哪?很多人第一反应是「JavaScript 太慢了」。但这个答案只对一半。
真正的问题不是 JavaScript 慢,是 JavaScript 的内存模型对构建场景天然不友好。
V8 的 GC 在构建时会反复暂停。构建是典型的计算密集型场景:大量对象频繁创建、大量字符串处理、大量数组操作。这些在 V8 里会不断触发 GC,而 GC 一跑就是几十毫秒的 STW(Stop-The-World)暂停。表面上你在等构建,实际上你在等 GC。
Rust 没有 GC。这不是「快一点」,是架构层面的差异。Rust 用所有权系统(Ownership)在编译时就确定了每个对象的生命周期,堆内存的分配和释放在编译阶段就已经安排好了。运行时根本不需要垃圾回收器。
这个差异直接体现在数字上:Oxc(Rust 写的 JS parser)比 ESLint(JS 写的)快 50-100 倍,Rolldown(Rust 写的)比 Rollup 快 5-10 倍,Rspack(Rust 写的)比 Webpack 快 10-20 倍。
这不是语言层面的优化,是内存管理模型的降维打击。
第一,堆分配少。Rust 的 String 在栈上操作,只有需要共享时才上堆,而且一旦确定不用就立即释放,不需要等 GC。构建工具里大量字符串拼接和 AST 节点创建,Rust 可以做到几乎零 GC 开销。
第二,并行不受内存安全约束。JavaScript 的线程共享内存靠的是 GC 和锁,而 Rust 的借用检查器(Borrow Checker)在编译时就排除了数据竞争(Data Race)。这意味着 Rust 可以放心地开多线程并行处理各自的数据,分割构建任务,CPU 多核利用率直接拉满。
第三,零成本抽象。Rust 的高级特性(如迭代器、闭包、智能指针)不会产生任何运行时开销。这些抽象在编译阶段全部被内联展开,最终生成的机器码和手写 C 的效果一样。
意味着你的开发服务器、测试、构建这条链路,理论上可以从分钟级压缩到秒级。Rolldown 已经在 Vite 8 里默认集成,Rspack 2.0 已经是字节跳动的生产主力,Oxc 全家桶(parser/linter/minifier/formatter)覆盖了 ESLint + Babel + Terser 的完整功能。
一个 10 万行代码的项目,用 Webpack 构建要 45 秒,用 Rspack 只要 4 秒。这个差距不是调参数能追回来的。
如果你的项目还在用 Webpack 或 Rollup,先跑一下 Rolldown 的 benchmark,感受一下差距;如果你是 CLI 工具作者,关注一下 Oxc 的 NAPI 绑定,Rust 写 Node.js 原生模块的体验已经很成熟了。
评论区
登录后可评论。