配了三年 ESLint,今天才发现每次它都在白做一件最贵的事——这件事被 Oxc 的共享 AST 彻底变了

你打开一个 500 个文件的项目,ESLint 跑完了,Prettier 接着跑,然后你的 bundler 又从头解析了一遍同样的代码。

三个工具,三套 AST,三次解析耗时。JavaScript 单线程执行,一个 500 文件的项目光解析就要占掉几十秒。

这不是你的配置有问题——是整个 JavaScript 工具链的架构从根上就这么设计的。

每套工具都在独立做同一件事:把代码 parse 成 AST,然后扔掉。

ESLint 读文件,建 AST,扔掉。Prettier 读同一个文件,再建一个自己的 AST,再扔掉。bundler 又读一遍,再建一个,再扔。

这个问题被一个 Rust 项目从根上改了。

Oxc(JavaScript Oxidation Compiler)是 VoidZero 推出的 Rust 版 JS/TS 工具链,旗下五个工具共享同一套 AST:oxc_parser(共享 AST 根基)、oxc_transformer(替代 Babel/SWC)、oxlint(替代 ESLint,50-100x 更快)、oxfmt(替代 Prettier,约 30x 更快)、oxc_minifier(替代 Terser)。

一个解析器,所有工具共用,没有跨工具的重复解析。这就是 Rolldown 能做到比 Rollup 快 10-30 倍的结构性原因——Linear 的生产构建从 46 秒掉到 6 秒,不是微调,是重写架构后的收益。

8 月 23 日发布的 Oxc v1.79.0 带来了 TypeScript no-confusing-non-null-assertion 建议规则、Vue/React/estree 处理细化,以及 FormalParameterRest spans 修复。8 月 24 日的 v0.147.0 带来了 minifier 的 switch-statement folding 和大范围性能优化。

还有一个更具体的例子:Rolldown 集成 React Compiler 时,JavaScript 插件接口返回 Babel AST 的 JSON 序列化结果,Oxc 收到后再解析回 Rust 类型。去掉这个 JSON 往返后,大文件 transform 时间从 14.95ms 掉到 10.83ms,napi addon 体积少了 759 KiB。

Boshen 后来用 Claude 辅助继续优化,早期数据显示:性能提升 2x,binary 体积只涨 1.4MB,而之前那个完整方案体积涨了 5MB——省掉了 3.6MB 的代价换来了同样的性能收益。

选型建议:

  • 已在用 Vite 8+:Rolldown 已内置,无需额外配置
  • 还在用 Vite 7:可先装 rolldown-vite 插件预体验
  • 还没迁移 ESLint/Prettier:先用 Oxlint 跑主流规则集,再用 Oxfmt 渐进替换
  • 大型 webpack 项目:Rspack 是更务实的选择,0 配置迁移

评论区

0 条评论

登录后可评论。