配了三年 npm,今天才发现每个工具都在独立解析同一份代码——这件事今天被共享 AST 彻底原生化了
假设你手里有个 1000 个文件的 TypeScript 项目。现在跑一次 npm run build。
这中间发生了什么?
ESLint 先读一遍所有文件,每个文件都完整 parse 出 AST,做 lint 检查,然后丢掉 AST。
Prettier 接着读同样的文件,每个文件再 parse 一遍完整的 AST,做格式化,再丢掉。
Bundler 最后读进来,又 parse 一遍。
1000 个文件,每个文件 parse 三次——这是三千次完整解析,全部跑在单线程上。
而每次 parse 的结果都是临时对象,用完就扔,下一个工具从头再来。
这就是 2010 年代 JavaScript 工具链的架构:每个工具都是一座孤岛,每座孤岛都自己挖地基建房子。
Rust 重写浪潮:解决了速度,没解决架构
2018 年开始,Rust 开始吞噬前端工具链。
SWC 把 Babel 换了,Deno 核心也用 Rust 重写,Biome 把 ESLint + Prettier 合并了,Rspack 把 webpack 替代了,Rolldown 把 Rollup 替了。
效果是真实的:SWC 比 Babel 快 70 倍,Rspack 比 webpack 快 10-20 倍,Oxc linter 比 ESLint 快 50-100 倍。
但这些改进都是单点突破。每个工具还是独立 parse 代码,ESLint 的 AST 不给 Prettier 用,Prettier 的 AST 不给 bundler 用。
换句话说:Rust 把工具链的「发动机」换了,但「发动机」还是每个工具单独配一台。
Oxc:第一个共享 AST 架构
这个架构问题,今天被 Oxc 从根上翻了。
Oxc(JavaScript Oxidation Compiler)是 Void Zero 公司出的 Rust 工具链,但它的核心创新不是「用 Rust 写」,而是「只 parse 一次」:
Oxc 工具链
├── oxc_parser ← 只有一个解析器,所有工具共用
├── oxc_transformer ← 转译,直接用 parser 的 AST
├── oxc_minifier ← 压缩,直接用 parser 的 AST
├── oxc_linter ← lint,直接用 parser 的 AST
└── oxc_formatter ← 格式化,直接用 parser 的 AST
你跑 oxlint 的时候,不存在「lint 先 parse 一遍」。lint 直接吃的是共享 parser 的输出。
你跑 transformer 的时候,同样一个 AST 被复用,不是重新 parse。
这就是为什么 Oxc 的 benchmark 里它不只是「Rust 的速度」,而是「架构级的速度」——它消灭了 N-1 次冗余 parse。
Rolldown:共享 AST 进了 bundler
Oxc 不只是理论。Rolldown 是 Vite 8 的底层 bundler,它直接集成 Oxc parser,不重新 parse 代码。
实测数据(Linear 代码库):
| 指标 | Rolldown | Rollup(原生) | 提升 |
|---|---|---|---|
| 冷启动时间 | 0.8s | 12s | 15x |
| Tree-shaking | 220ms | 1.8s | 8x |
| 代码生成 | 1.2s | 9.5s | 8x |
| 内存占用 | 180MB | 450MB | 2.5x |
Rolldown 跑这么快,不只是因为用 Rust——是因为它从 parser 到 transformer 到 bundler 全链路共用同一套 AST,没有中间商赚 parse。
三步下一步
第一步:跑一次 oxlint 感受差距
npx oxlint@latest .
不需要删 ESLint,先并行跑,对比速度。这是 Oxc 目前最成熟的组件,400+ 规则,生产可用。
第二步:了解你的项目 parse 了多少次
eslint --print-config 可以看到 ESLint 读了多少文件。然后算一下:eslint + prettier + bundler,总共 parse 了多少轮。
数字会吓到你。
第三步:关注 Rolldown 进入 Vite 默认配置
等 Vite 8 正式版,Rolldown 默认开启,你不需要改一行配置——整个工具链的 parse 架构就变了。
结论
Rust 重写解决的是「单工具速度慢」的问题。
共享 AST 解决的是「整个工具链在重复劳动」的问题。
这两个改进是叠加关系,不是替代关系。Rust 给了速度,共享 AST 给了架构——而架构级的优化,在大项目上的收益是指数级的,不是线性的。
三年 npm 生态卷性能,今天这件事的答案不在单点竞争,在架构重构。
评论区
登录后可评论。