配了八年 ESLint,今天才发现给它的棺材板是 Rust 钉的

配了八年 ESLint,今天才发现给它的棺材板是 Rust 钉的。

这不是在开玩笑。Shopify 跑一次 ESLint 要 75 分钟,40 台机器并行才能撑住;VS Code 3684 个文件,ESLint 跑 25 秒,Oxlint 跑 250 毫秒。Vue 代码库 590 个文件,50 毫秒跑完。Remix 把整个 ESLint 生态(6-8 个包)全删了,换成一行 oxlint,时间从 30 秒降到不到 1 秒。

但这还不是最重要的。

真正的问题不是哪个工具快

ESLint 慢,Oxlint 快,这件事你知道。但如果你只盯着 Oxlint 快了多少倍,你其实还没看懂这场变革在干什么。

前端工具链正在经历一次底层架构重构。

ESLint 是单工具,Oxlint 也是单工具。但 Oxlint 背后是一个叫 Oxc(The JavaScript Oxidation Compiler)的项目,它做的事情是:造一套共享的 Rust 底层,让所有 JS 工具都跑在同一套 AST 上面。

Parser(解析器)、Transformer(转译器)、Linter(检查器)、Formatter(格式化器)、Resolver(路径解析器)、Minifier(压缩器)——六个工具,共用同一个 AST 和同一套遍历机制。

这不是六个工具,这是一套工具链。

共享 AST 意味着什么

你用 ESLint 的时候,它要解析一次 AST;用 Prettier 格式化的时候,要再解析一次;用 Babel 转译的时候,又要解析一次。同一个文件,解析三遍,每个工具各自建树、各自遍历。

Oxc 的做法:解析一次,六种工具复用同一棵树。

这把三个变化带到了前台:

1. 解析变成一次性成本,不再是叠加成本

TypeScript 编译器 checker.ts(3.9MB),Oxc 解析 26.3ms,SWC 要 84.1ms,Babel 要 853ms。注意这只是一个文件。大型代码库里每次改动都要重新解析——增量构建时,文件变更触发解析,这个速度就是瓶颈。Oxc 把这个瓶颈从毫秒级降到了亚毫秒级。

2. Lint、Format、Transform 共享优化空间

同样的常量折叠、死代码消除、转译优化,做一次就够了。工具之间的边界被打破了。

3. 工具链的控制权从 JavaScript 社区移到了 Rust 社区

这个变化在加速。

VoidZero 把所有东西收到一把伞下

2024 年 7 月,Evan You(Vue 作者)创办了 VoidZero,随即把 Oxc 核心维护者 Boshen 纳入麾下。Rolldown(Vite 的下下一代打包器)、Oxc(工具链)、Vite 现在都在同一家公司的控制之下。

这个生态图谱现在长这样:

Oxc 核心层
├── oxc-parser       解析器(3x SWC, 5x Biome)
├── oxc-transformer  转译器(4x SWC, 40x Babel)
├── oxlint           Linter(50-100x ESLint)
├── oxfmt            Formatter(3x Biome, 35x Prettier)
├── oxc-resolver     路径解析(30x webpack enhanced-resolve)
└── oxc-minifier    压缩器(Beta)

Rolldown(Vite 8 默认打包器)
Vite 8(由 Rolldown 驱动)

这不是六选一,这是一套全家桶。

三类数据的冲击

Shopify 的案例最典型:75 分钟 → 10 秒,40 台机器并行 → 单进程。不是优化了配置,是换了底层。

三个真实数据:

  • Airbnb(126,000 个文件):7 秒跑完 Oxlint
  • Vue 代码库(590 个文件):50 毫秒
  • Sentry:开启类型感知规则后,12 倍提速

还有一个隐藏数据:Remix 迁移的时候,发现了一些之前 ESLint 配置里被跳过或隐藏的 bug。工具快了之后,反而把之前跑得慢时”选择性忽略”的问题抓出来了。

现在能用到哪一步

Lint 层:完全可用。

Oxlint 1.0 已 GA(2025 年 6 月)。700+ 规则,覆盖 ESLint 核心、typescript-eslint、React、React-Hooks、Jest、Vitest、Unicorn、import、jsx-a11y 等主流生态。VS Code 扩展、GitHub Action、CNI 一应俱全。

Formatter 层:Beta,可用。

Oxfmt 已发布,3x Biome、35x Prettier 的速度,Prettier 配置可直接沿用。

Transformer 层:Beta。

覆盖 TypeScript & JSX 语法降级、独立声明文件输出、React Fast Refresh、styled-components 支持。

Minifier 层:Alpha。

还在早期。

怎么上车

三个场景,三条路径:

场景一:Lint 已经是瓶颈的项目

直接上 Oxlint,零配置,替换成本极低。渐进路径:先用 Oxlint 在 CI 里拦住常见问题,ESLint 作为兜底处理 Oxlint 不支持的规则。两边不冲突。

npx oxlint@latest

场景二:Vite 8 项目(2026 年)

Rolldown 会随 Vite 8 默认启用。dev 和 build 底层统一,不需要额外动作。

场景三:想完整布局 Oxc 全家桶

按这个顺序上车:Oxlint → Oxfmt → Transformer(等稳定)→ Minifier(等稳定)。别等全家桶准备好了再动,Lint 层现在就能收益。

结论

不是 ESLint 输了,是 JavaScript 工具链的底层架构变了。

共享 AST 这件事,让工具链的竞争从”单工具性能”变成了”全家桶生态”。VoidZero 统一 Oxc + Rolldown + Vite 之后,前端构建工具链的控制权正在从 JavaScript 生态向 Rust 生态转移。

这个转移已经开始,而且比你想象的快。


下一步:翻出你的项目里的 ESLint 配置,数数有多少行、有多少个插件、有多少次 CI 跑 lint 的超时。然后跑一下 npx oxlint@latest,看看它在你自己的代码库上跑多少秒。

评论区

0 条评论

登录后可评论。

阿柯·前端架构 14 阅读