oxlint — 编译进二进制的 JS/TS linter
已复核oxlint 是 oxc 仓库里的 JavaScript / TypeScript linter 应用。日常类比:它不像 Biome 那样同时管排版;它只做体检,把规则编译进一个 CLI,再按目录向上找配置。
固定 1.80.0 的 npm 包名是 oxlint,二进制名同样是 oxlint。它住在 oxc-project/oxc 的 apps/oxlint,不是单独的 GitHub 仓库。同一次 apps release 还发布了 sibling oxfmt;本文只审查 linter。
pnpm add -D oxlintpnpm oxlint不看固定入口,容易把 oxlint 和整个 oxc 工具链、甚至 Rolldown 捆成一句话:
- 为什么独立二进制默认跑不了 JS plugin
- 为什么
.oxlintrc.json到处都能用,而oxlint.config.ts写着 experimental - 为什么
--fix不会自动带上 suggestion / dangerous fix - 为什么
--type-aware是开关,而不是“装了 TypeScript 就自动有类型规则”
一句话:oxlint 的合同是 lint runner + 配置发现 + 显式能力开关。
固定 1.80.0 的主链可以拆成五步:
- 选入口:
apps/oxlint的main解析 CLI;--lsp才启动 Tokio,普通 lint 保持同步 Rayon。 - 找配置:未传
--config时按.oxlintrc.json、.oxlintrc.jsonc、oxlint.config.ts、oxlint.config.mts搜索;还可从每个文件目录向上走 nested config。 - 装规则:默认 plugin 位是
unicorn | typescript | oxc。--init再写上categories.correctness = error。 - 跑文件:
Walk收集路径,Linter/LintRunner出 diagnostics;输出格式包括 default、unix、github、sarif 等。 - 可选扩展:JS plugin、JS/TS config loader 走 Node NAPI
lint();--type-aware/--type-check是另外的显式旗标。
独立二进制的 main 以 ExternalLinter = None 调用 CliRunner。没有 Node 回调时,不要假设 JS plugin 已经在跑。
案例 1:生成默认配置再 lint
Section titled “案例 1:生成默认配置再 lint”pnpm oxlint --initpnpm oxlint src逐部分解释:
--init写.oxlintrc.json,带本地 schema、pluginstypescript/unicorn/oxc、以及correctness: error。- 不传路径时,walker 从当前工作目录收集文件。
- 这只启用默认 correctness 合同,不会自动打开
pedantic/nursery。
案例 2:按类别拒绝,再单独放行一条
Section titled “案例 2:按类别拒绝,再单独放行一条”pnpm oxlint -D correctness -A no-debugger srcCLI 把 -A / -W / -D 从左到右累加。all 表示除 nursery 外的类别,而且不会自动开启 plugin。
案例 3:修复开关是三层,不是一个 --fix
Section titled “案例 3:修复开关是三层,不是一个 --fix”pnpm oxlint --fix srcpnpm oxlint --fix --fix-suggestions srcpnpm oxlint --fix-dangerously src--fix 只打开 SafeFix。suggestion 与 dangerous 必须显式加旗标。把 --fix 理解成 ESLint --fix 的全集,会漏掉后两层。
- 以为原生二进制也能加载 JS plugin:
main.rs不传ExternalLinter;plugin 回调定义在 NAPIlint()。 - 把 JS/TS 配置文件当成稳定默认:源码标注 experimental,且需要经 Node 跑。
--tsconfig不能代替 type-aware:注释写明 type-aware 仍会自己发现合适的tsconfig.json。- 把 sibling
oxfmt或 oxc 页面当成 oxlint 自己的 formatter / parser 课:本页不覆盖那些合同。 - 把规则总数或“比 ESLint 快 N 倍”写进结论:本轮没有统计
RULES,也没有跑 benchmark。
适用 vs 不适用场景
Section titled “适用 vs 不适用场景”适用:
- 只要 lint、不要 formatter,并愿意用 oxlint 自己的类别 / plugin 开关
- CI 里用 JSON / JSONC 配置,避免 experimental JS config
- 需要 GitHub / Sarif / JUnit 这类机器可读输出
不适用:
- 必须在无 Node 的纯二进制里跑 JS plugin
- 需要类型感知规则,但还没装 optional peer
oxlint-tsgolint、也没验证--type-aware - 想用同一条命令同时 format;那是 sibling
oxfmt或 biome 的范围
固定版本边界
Section titled “固定版本边界”- 本文绑定
oxc-project/oxc@97e99b85...,npm 包oxlint@1.80.0。 - 引擎声明为
node ^20.19.0 || >=22.12.0;oxlint-tsgolint与vite-plus是 optional peer。 - npm latest 未带
gitHead;版本对齐依据 Git tag 与仓库内npm/oxlint/package.json。 - 本文只做源码静态审查,没有执行 lint、type-aware 或 JS plugin,状态保持
UNVERIFIED。
- 产品入口和 monorepo 不是同一张卡片——oxlint 从 oxc 仓库发布,但用户合同是 linter CLI
- 默认可移植配置是 JSON/JSONC;JS config 与 JS plugin 绑在 Node 运行时
- 修复、类型信息和 LSP 都是显式旗标,不能从“装了 TypeScript”推导出来
- 默认规则面很窄:默认 plugin +
correctness,不是全类别全开
- 直接运行官方二进制
oxlint,不经 Node,能加载 JS plugin 吗? oxlint --fix会应用 suggestion 和 dangerous fix 吗?- 不传
--config时,子目录里的.oxlintrc.json默认会被看到吗?
检查点:
- 不能。无 NAPI 的
main不安装ExternalLinter。 - 不会。
--fix只开SafeFix。 - 会,除非加了
--disable-nested-config。
- 使用指南:oxc.rs/docs/guide/usage/linter
- 固定源码:oxc-project/oxc —— 本文绑定提交
97e99b85483776a72928d675cc05b1cfc1130ba0 - biome —— 同一赛道里同时做 lint + format 的对照
- oxc —— parser / AST / 工具链地基;本页不改写它
- biome —— 一体化 lint/format/assist,对照 oxlint 的 lint-only
- oxc —— oxlint 所在 monorepo 与 AST 底座
- vite —— 固定包把
vite-plus列为 optional peer,未在本轮验证 - ast-grep —— 另一条 AST 搜索/改写路线
- biome —— Biome — 把 lint、format 和 assist 收进同一个 CLI