配了八年 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,看看它在你自己的代码库上跑多少秒。
评论区
登录后可评论。