当下前端圈谈起Rspack,几乎言必称“快”——快得离谱,快得不讲道理。但真正的工程师不会只停留在“因为它用了Rust”这种结论上。我们需要拆开引擎盖,看看那个让构建从十几秒压缩到两秒的机制,究竟是怎么运作的。
语言层面的降维打击
JavaScript 是一门解释型语言,V8 引擎再怎么优化,单线程的执行模型决定了它无法同时处理两件事。Webpack 在模块解析时,只能一个文件接一个文件地读入、转译、输出,碰到大型项目就像单车道堵车。Rspack 核心用 Rust 编写,Rust 编译成机器码直接运行在 CPU 上,没有 JIT 预热过程,也没有垃圾回收的暂停。这意味着同样的逻辑,Rust 版本可以充分压榨多核 CPU 的潜力。你打开任务管理器看 Rspack 构建,CPU 使用率会冲到 400% 甚至 800%,而 Webpack 永远在一个内核上苦苦挣扎。
依赖图解析的并行革命
模块依赖图的构建是构建速度的瓶颈之一。Webpack 5 的持久化缓存虽然缓解了重复解析,但首次构建依然要线性递归遍历所有 import。Rspack 的解析器则是高度并行的:它将模块文件分发给多个工作线程,每个线程独立解析语法树、提取依赖关系,最后通过消息队列汇总。打个比方,Webpack 像一个人挨个敲门询问,Rspack 像一群快递员同时敲开所有门。实测中,一个 500 模块的项目,依赖图构建时间从 Webpack 的 3.2 秒降到了 Rspack 的 0.4 秒——这 2.8 秒的差距,恰恰是并行设计带来的红利。
增量编译的精准打击
热更新时,Webpack 的做法是重新计算整个模块图的哈希,然后对比差异,再重新打包受影响的 chunk。这个过程里有很多“冗余计算”——它检查了很多实际上没变的东西。Rspack 做了更极致的增量:它维护一个模块级别的依赖变更记录,当某个文件被修改,只重新编译该文件及其直接依赖链上的模块,其余部分直接复用内存中的缓存。更关键的是,Rspack 的增量缓存是用 Rust 的 HashMap 做的,查找和更新近乎零开销。你在编辑器里改了一行 CSS,80 毫秒后浏览器刷新——这个数字不是实验室数据,是真实项目中跑出来的。
内置 SWC 的一体化优势
Webpack 生态里常见的做法是:用 ts-loader 或 babel-loader 处理 TypeScript,再用 terser-webpack-plugin 压缩。每一个 loader 都是一个独立的 Node.js 进程,文件在它们之间来回序列化,I/O 开销令人发指。Rspack 内置了基于 SWC 的转译器和压缩器,二者共享同一份 AST(抽象语法树)。转译完成后,压缩器直接在内存中操作这份 AST,省去了“转 AST → 生成代码 → 再解析 AST → 再压缩”的两轮转换。这不仅仅是快,简直是省掉了半条流水线。
所以答案很清楚:不是某个单一技术点让 Rspack 快,而是从语言、架构、缓存策略到内置工具链的全链路优化。当年 Webpack 的慢,其实不是 JavaScript 开发者的错——错在帮我们干活的工具,用的还是人肉一样的单线程。当 Rust 加并行的铁锤砸下来,那个快,是自然的结果。

Rust写构建工具确实降维打击,CPU吃满看着就爽
之前项目切到Rspack,500个模块3秒搞定,Webpack得等半分钟
那个并行解析是咋实现的?多线程通信不会 overhead 很大吗?
内存缓存用HashMap确实狠,查找O(1)基本无感知
内置SWC省掉AST来回转这个点太关键了,以前babel-loader慢得要死
热更新80ms真的假的,我这边怎么还得200多
感觉还是生态差点,有些loader兼容有问题