6.1 迁移策略:三种路线
- 一步到位:完全替换
- 删掉 eslint + prettier 及其 plugin,完全切换到 Biome。新项目/中小型项目推荐。
- 渐进式:format 先走、lint 保留
- 先用 Biome 替代 Prettier(几乎零风险),lint 仍跑 ESLint;等团队适应、Biome 规则覆盖足够后再切 lint。
- 共存:Biome 负责大多数,ESLint 只留少量 plugin
- 某些生态(如
eslint-plugin-testing-library、eslint-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 会做这些事:
- 识别 ESLint 规则 → 查 Biome 对应规则 → 自动开启对等级
- 找不到对应的 ESLint 规则会在
biome.json顶部添加注释标记 - 把 Prettier 的
tabWidth/printWidth/singleQuote/semi/trailingComma映射为 Biome 对应字段
迁移后 review 一遍
migrate 是"尽力而为":约有 10–20% 的 ESLint 规则在 Biome 里没有完全等价物。看生成的 biome.json 顶部的注释提示,对那些规则做判断:关掉 / 用 Biome 相近规则替代 / 保留 ESLint 跑它。
6.3 典型规则对照
| ESLint 规则 | Biome 对应 | 注意 |
|---|---|---|
| no-unused-vars | correctness/noUnusedVariables | — |
| no-undef | correctness/noUndeclaredVariables | 建议用 tsc 替代 |
| prefer-const | style/useConst | — |
| eqeqeq | suspicious/noDoubleEquals | — |
| no-console | suspicious/noConsoleLog | 只针对 log,Biome v2 增 noConsole |
| @typescript-eslint/no-explicit-any | suspicious/noExplicitAny | — |
| @typescript-eslint/no-non-null-assertion | style/noNonNullAssertion | — |
| react-hooks/rules-of-hooks | correctness/useHookAtTopLevel | — |
| react-hooks/exhaustive-deps | correctness/useExhaustiveDependencies | — |
| import/order | organizeImports(内置) | 自动排 |
| import/no-duplicates | organizeImports 自动合并 | 自动 |
| jsx-a11y/alt-text | a11y/useAltText | — |
| @next/next/no-img-element | nursery/noImgElement(v2 domain) | 开启 domain: next |
6.4 没有对应的 ESLint 规则怎么办
以下常见规则 Biome 目前没有等价物(2026 年路线图中):
testing-library/*(测试代码检查)vitest/*/jest/*(测试框架语义)import/no-cycle(循环依赖检测,需要全局图)unicorn/*(大部分)@typescript-eslint里基于类型推断的规则(部分 v2 已补齐)
处理方案:保留 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 框架的规则
- Next.js — 2025 起 Next 团队推荐 Biome + domain: next;
next/core-web-vitals的大多数规则 Biome 已覆盖 - Nuxt — Nuxt 3 Biome 社区配置成熟;Vue 模板 lint 仍依赖 eslint-plugin-vue
- Astro — Biome v2 完整覆盖 Astro 组件脚本部分
- SvelteKit — Biome 的 Svelte 支持仍在 nursery,建议继续 svelte-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 集成。