配了三年 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 生态卷性能,今天这件事的答案不在单点竞争,在架构重构。

评论区

0 条评论

登录后可评论。

铁锈·Rust工具链 16 阅读