Chapter 06

从 ESLint / Prettier 迁移

把 Biome 接入一个已有的 ESLint + Prettier 项目——内置 migrate 工具、规则对照、并存策略与最终清理。

6.1 迁移策略:三种路线

一步到位:完全替换
删掉 eslint + prettier 及其 plugin,完全切换到 Biome。新项目/中小型项目推荐。
渐进式:format 先走、lint 保留
先用 Biome 替代 Prettier(几乎零风险),lint 仍跑 ESLint;等团队适应、Biome 规则覆盖足够后再切 lint。
共存:Biome 负责大多数,ESLint 只留少量 plugin
某些生态(如 eslint-plugin-testing-libraryeslint-plugin-vitest)Biome 没有对应规则,可保留 ESLint 只针对这些文件/规则跑。

6.2 自动迁移:biome migrate

Biome 提供一键读入现有配置的工具:

# 读取 .eslintrc.* / eslint.config.*,合并进 biome.json
biome migrate eslint --write

# 读取 .prettierrc.* / prettier 字段,合并进 biome.json
biome migrate prettier --write

# 看变化但不写入
biome migrate eslint

migrate 会做这些事:

迁移后 review 一遍

migrate 是"尽力而为":约有 10–20% 的 ESLint 规则在 Biome 里没有完全等价物。看生成的 biome.json 顶部的注释提示,对那些规则做判断:关掉 / 用 Biome 相近规则替代 / 保留 ESLint 跑它。

6.3 典型规则对照

ESLint 规则Biome 对应注意
no-unused-varscorrectness/noUnusedVariables
no-undefcorrectness/noUndeclaredVariables建议用 tsc 替代
prefer-conststyle/useConst
eqeqeqsuspicious/noDoubleEquals
no-consolesuspicious/noConsoleLog只针对 log,Biome v2 增 noConsole
@typescript-eslint/no-explicit-anysuspicious/noExplicitAny
@typescript-eslint/no-non-null-assertionstyle/noNonNullAssertion
react-hooks/rules-of-hookscorrectness/useHookAtTopLevel
react-hooks/exhaustive-depscorrectness/useExhaustiveDependencies
import/orderorganizeImports(内置)自动排
import/no-duplicatesorganizeImports 自动合并自动
jsx-a11y/alt-texta11y/useAltText
@next/next/no-img-elementnursery/noImgElement(v2 domain)开启 domain: next

6.4 没有对应的 ESLint 规则怎么办

以下常见规则 Biome 目前没有等价物(2026 年路线图中):

处理方案:保留 ESLint 只针对这些 plugin。

6.5 ESLint + Biome 共存配置

思路:Biome 管格式化 + 大多数 lint;ESLint 精简到只开几条 Biome 没有的规则。

// eslint.config.js(flat config)
import testingLibrary from 'eslint-plugin-testing-library';

export default [
  {
    files: ['**/*.test.{ts,tsx}'],
    plugins: { 'testing-library': testingLibrary },
    rules: {
      'testing-library/no-debugging-utils': 'error',
      'testing-library/no-await-sync-queries': 'error'
    }
  }
];

对应 package.json:

{
  "scripts": {
    "lint": "biome check . && eslint '**/*.test.{ts,tsx}'"
  }
}

6.6 清理旧依赖

完全迁到 Biome 后可以卸载:

pnpm remove \
  eslint \
  prettier \
  eslint-config-prettier \
  eslint-plugin-prettier \
  eslint-plugin-import \
  eslint-plugin-jsx-a11y \
  @typescript-eslint/parser \
  @typescript-eslint/eslint-plugin

rm .eslintrc* .prettierrc* .prettierignore eslint.config.* prettier.config.*

留意:.editorconfig 不要删——Biome 会读它里面的 indent_style/indent_size/end_of_line,可以让非 Biome 覆盖的编辑器也保持一致。

6.7 生态集成:保留哪些 ESLint 框架的规则

6.8 CI 里的迁移期策略

// .github/workflows/lint.yml — 迁移期双跑、只要求一个过
- run: pnpm biome ci .     # 先跑,失败仅 warn
  continue-on-error: true
- run: pnpm eslint .        # 硬门槛

等 Biome 输出稳定、开发者熟悉后,把 continue-on-error 去掉;再逐步移除 ESLint 步骤。

小结

迁移核心三步:biome migrate eslint && biome migrate prettier → review 生成的 biome.json → 决定完全替换还是与 ESLint 少量共存。大多数常见规则都有对应;少数"测试框架语义"类规则仍需 ESLint。下一章回到日常工具——IDE 集成。