依赖里 ESLint 插件越堆越沉,Biome 入门页能先接管格式化和 lint 吗?

package.json 里 ESLint 插件一行接一行,保存时格式化走一轮,CI 里 lint 再走一轮,中间还挂着 React、无障碍、import。插件和共享配置的版本对不齐时,有人会问:能不能换成一个工具,先把格式化和日常 lint 扛住。Biome Quick start 把从安装到第一次检查写成很短的三步。同站的 Comparison with other tools 又写明,它的 linter 从 ESLint 吸收了很多规则,但不是按「把现有 ESLint 插件原样跑起来」来设计的。

入门页实际让你做完什么

Quick start 说可以用 npm、pnpm、Yarn、Bun、Deno 安装,也可以用独立安装器,不必依赖 Node.js。包管理器安装示例是把 @biomejs/biome 加到开发依赖,并用 -E 钉死精确版本,避免同事和 CI 跑到不同小版本。

接着 biome init 生成 biome.json。官方示例里 formatter、linter、assist 都打开:formatter 默认 indentStyle 为 tab,linter 使用 recommended 规则集,assist 里打开发 import。没有配置文件也能跑,配置是为了跟编辑器和同事共享同一套选项。示例里的 $schema 指向 2.6.5 那套 schema,编辑器可以靠它补全字段。

第三步是 biome check:一次跑过格式化、lint 和 assist,列出未格式化的文件和诊断。加上 --write 会应用格式化、安全的自动修复和 assist。剩下的诊断要么没有修复,要么修复不安全,需要人看。入门页没有把「先只开格式化、lint 以后再说」写成一条独立命令,但配置里 formatter 和 linter 可以分开开关,想先扛格式化,可以把范围收在 formatter 上,再逐步打开规则。

下一步他们指向编辑器集成、改规则、接入 VCS、放进 CI。生成配置里 vcs.enabled 默认是 false。迁移说明 写过,ESLint / Prettier 默认会尊重 .gitignore,Biome 只有打开 VCS 集成才会同样使用忽略文件。迁的时候这点很容易漏。

和 ESLint 插件生态差在哪

对比页第一句就给 ESLint 留了位置:它仍是 JavaScript lint 的常见标准,背后有十年的规则和插件。Biome 的 linter 从中吸收了很多,但不是 drop-in replacement。

他们写当前发行带 755 条规则,其中多数移植自 ESLint 以及常见插件,例如 eslint-plugin-react、eslint-plugin-jsx-a11y、eslint-plugin-import、eslint-plugin-unicorn。规则名用 camelCase,和 ESLint 的 kebab-case 不同,不少规则还换了更好懂的名字,例如 eqeqeq 对应 noDoubleEquals。选项可能更少,行为也可能和原规则略有差别,官方把这解释成跨语言体验上的取舍。

配置形态差得更明显。典型的 ESLint 工程要自己拼 parser、TypeScript 插件、框架插件,再加一份和 Prettier 和平共处的配置。Biome 侧主要依赖 @biomejs/biome,细调才需要 biome.json。真正拉开差距的是:ESLint 有一套 JavaScript 插件生态,Biome 跑不了这些插件。它自己的插件用 GritQL 写,用来匹配代码并报告诊断。仓库里如果靠某个 ESLint 插件提供的公司私有规则或框架专项规则,迁过去会留下空档,需要在 Biome 里找对应规则,或暂时保留那一部分 ESLint。

类型感知也不是一对一。ESLint 做这类检查通常要 typescript-eslint 和 TypeScript 编译器。Biome 从 v2 起带自己的类型感知规则,不依赖 typescript 包,但对比页写明数量明显少于 typescript-eslint,覆盖仍在增加。

格式化方面,对比页把 Biome 的 formatter 写成 Prettier 的 drop-in replacement,并给出他们自己基准上约 97% 的输出一致、默认缩进是 tab(Prettier 常见默认是空格)等说明。速度数字也来自该页的官方基准,没有在另一套环境里复跑,这里不当独立结论写。若你更在意「先把 format 统一掉」,这条路径比「完整替代所有 ESLint 插件」更接近官方承诺。

准备迁规则时,可以用 biome migrate eslint(需要的话再加 --include-inspired)把能对上的配置写进 biome.json。迁移页提醒:即便加上 inspired 规则,结果也不会和 ESLint 完全一样。部分插件或共享配置若导出循环引用,迁移命令可能加载失败,要手动对着缺的规则补。满意之后,官方才提到可以卸掉旧依赖——那是迁移完成后的收尾建议,不是「现在必须弃用 ESLint」。

一个前端仓库先用 Biome 扛格式化和 recommended lint,插件生态里暂时补不上的规则继续留在 ESLint,是对比页能支撑的用法。有人已经这么拆过吗,拆完以后哪一类规则最先露出空档?