告别 ESLint + Prettier:Biome 统一工具链 + AI 代码审查实战

3455 字
17 分钟
告别 ESLint + Prettier:Biome 统一工具链 + AI 代码审查实战

引言:前端工具链的”配置地狱”#

每个前端开发者都经历过这样的噩梦:新建一个项目,光是配置代码规范就要折腾半天。ESLint 配置一份、Prettier 配置一份,两者还经常打架——ESLint 说这行要加分号,Prettier 说不用。于是你又得装 eslint-config-prettier 来解决冲突,再加上 eslint-plugin-import@typescript-eslint/parser……

一个中型 Vue 项目的 devDependencies 里,光代码规范相关的包就能有 15 个以上。

2026 年,这个局面终于有了根本性的改变。Biome(原 Rome)在 v2.0 发布后,真正实现了「一个工具干完 Lint + Format + Import 排序」的承诺,而且速度快到离谱。再配合 AI 代码审查工具,前端代码质量体系迎来了一次质的飞跃。

本文会深入聊聊:

  1. Biome 到底好在哪,和 ESLint + Prettier 的真实对比
  2. 如何在 Vue 3 项目中完整接入 Biome
  3. AI 代码审查工具的实战选型和接入
  4. 一套完整的 CI/CD 代码质量流水线方案

一、为什么说 ESLint + Prettier 模式该退场了#

1.1 历史包袱太重#

ESLint 诞生于 2013 年,Prettier 诞生于 2017 年。两个工具的设计哲学完全不同:

维度ESLintPrettier
核心目标代码质量检查代码格式统一
配置哲学高度可配置尽量少配置
解析器基于 AST基于 AST(但重新打印)
插件生态海量插件几乎不需要插件

问题在于,ESLint 后来也加了格式化规则(比如 indentsemi),和 Prettier 的职责产生了重叠。社区的解决方案是 eslint-config-prettier——关掉 ESLint 所有格式化规则,让 Prettier 接管。

但这本质上是用一个 hack 去弥补架构设计的缺陷

1.2 性能问题不可忽视#

在一个 1000 个文件的中型项目中,我实际测过(M2 MacBook Pro):

ESLint(含 TypeScript 解析): 12.3s
Prettier: 4.7s
两者串行: 17.0s
Biome(lint + format): 0.8s

快了 21 倍。 这不是理论数据,是实际项目的 time 命令结果。

Biome 用 Rust 写的,这是根本原因。但更重要的是它的架构:一次解析,多次检查。ESLint 和 Prettier 各自解析一次 AST,而 Biome 只解析一次就同时完成 lint 和 format。

1.3 配置复杂度的差距#

一个典型的 ESLint + Prettier 项目需要这些配置文件和依赖:

// package.json 中的 devDependencies(精简版)
{
"eslint": "^9.x",
"@eslint/js": "^9.x",
"eslint-plugin-vue": "^10.x",
"eslint-config-prettier": "^10.x",
"@typescript-eslint/parser": "^8.x",
"@typescript-eslint/eslint-plugin": "^8.x",
"eslint-plugin-import": "^2.x",
"prettier": "^3.x"
}

加上 eslint.config.js(Flat Config)和 .prettierrc,总配置量轻松超过 100 行。

Biome 呢?

package.json
{
"@biomejs/biome": "^2.x"
}

一个依赖。配置文件 biome.json 通常 20-30 行就够了。

二、Biome 深入解析#

2.1 架构设计#

Biome 的核心是一个用 Rust 编写的 CST(Concrete Syntax Tree)解析器。和传统 AST 不同,CST 保留了所有语法信息,包括空格、注释、括号位置等。这意味着:

  • Lint 检查可以直接在 CST 上进行,不需要额外的格式信息
  • Format 格式化可以基于同一棵 CST 重新输出代码,不需要二次解析
  • Import 排序也是 CST 上的节点操作
源代码 → CST 解析(一次) → Lint 检查
→ Format 格式化
→ Import 排序
→ 输出结果

这种「单次解析、多通道处理」的架构,是 Biome 性能碾压的根本原因。

2.2 在 Vue 3 项目中接入 Biome#

从 Biome 1.9+ 开始,.vue 文件已经得到了良好支持。以下是完整的接入流程:

Terminal window
# 安装
pnpm add -D @biomejs/biome
# 初始化配置
pnpm biome init

生成的 biome.json 需要做一些调整:

{
"$schema": "https://biomejs.dev/schemas/2.0/schema.json",
"vcs": {
"enabled": true,
"clientKind": "git",
"useIgnoreFile": true
},
"organizeImports": {
"enabled": true
},
"linter": {
"enabled": true,
"rules": {
"recommended": true,
"complexity": {
"noExcessiveCognitiveComplexity": {
"level": "warn",
"options": { "maxAllowedComplexity": 15 }
}
},
"suspicious": {
"noConsoleLog": "warn",
"noDebugger": "error"
},
"style": {
"useConst": "error",
"noNonNullAssertion": "warn"
},
"correctness": {
"noUnusedVariables": "error",
"noUnusedImports": "error"
}
}
},
"formatter": {
"enabled": true,
"indentStyle": "space",
"indentWidth": 2,
"lineWidth": 100
},
"javascript": {
"formatter": {
"quoteStyle": "single",
"semicolons": "asNeeded",
"trailingCommas": "es5"
}
},
"files": {
"ignore": ["dist", "node_modules", ".nuxt", ".output", "*.min.js"]
}
}

添加 npm scripts:

{
"scripts": {
"lint": "biome check .",
"lint:fix": "biome check --write .",
"format": "biome format --write ."
}
}

2.3 从 ESLint 迁移#

Biome 提供了一个非常实用的迁移命令:

Terminal window
pnpm biome migrate eslint --write

这个命令会读取你现有的 ESLint 配置,把能对应的规则自动迁移到 biome.json。不能一一对应的规则会以注释形式列出,方便你手动处理。

实际迁移中需要注意几个点:

1. Vue 特定规则的对应关系

// ESLint (eslint-plugin-vue) → Biome 对应规则
'vue/no-unused-vars'correctness/noUnusedVariables
'vue/no-mutating-props' → (Biome 暂无直接对应 Vue 编译器检查
'vue/multi-word-component-names' → (Biome 暂无可忽略或自定义
'vue/require-default-prop' → (Biome 暂无建议 TypeScript 类型约束替代

2. TypeScript 规则的迁移

大部分 @typescript-eslint 规则在 Biome 中有对应:

// @typescript-eslint → Biome
'@typescript-eslint/no-explicit-any'suspicious/noExplicitAny
'@typescript-eslint/no-unused-vars'correctness/noUnusedVariables
'@typescript-eslint/consistent-type-imports'style/useImportType

3. 渐进式迁移策略

不建议一次性切换。推荐的做法是:

// 第一阶段:只启用 format,关闭 lint
{
"linter": { "enabled": false },
"formatter": { "enabled": true }
}
// 第二阶段:启用 lint 的 recommended 规则
{
"linter": { "enabled": true, "rules": { "recommended": true } }
}
// 第三阶段:添加严格规则,移除 ESLint

2.4 IDE 集成#

VSCode 用户安装 biomejs.biome 扩展即可。配置 settings.json

{
"editor.defaultFormatter": "biomejs.biome",
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"quickfix.biome": "explicit",
"source.organizeImports.biome": "explicit"
},
// 禁用旧的 ESLint 和 Prettier
"eslint.enable": false,
"prettier.enable": false
}

保存时自动 lint + format + import 排序,体验非常丝滑。

三、AI 代码审查:从规则到智能#

Biome 解决了「确定性规则」的检查——变量未使用、格式不统一、import 未排序。但有一类问题是传统 lint 工具搞不定的:

  • 这段逻辑有没有边界 case 没考虑?
  • 这个函数命名是否准确表达了意图?
  • 这段代码有没有更优雅的实现方式?
  • 是否引入了潜在的性能问题?

这正是 AI 代码审查工具的价值所在。

3.1 主流 AI 代码审查工具对比#

工具集成方式支持语言核心特点价格
CodeRabbitGitHub/GitLab PR全栈深度 PR Review,上下文理解强免费版够用
SourceryGitHub PR + IDEPython/JS/TS重构建议精准开源免费
Amazon CodeGuruAWS 集成Java/Python/JS安全漏洞检测按行收费
Cursor 内置IDE全栈实时 inline 建议$20/月
Claude Code ReviewCLI/CI全栈深度理解业务逻辑API 按量

对于前端项目,我推荐 CodeRabbit + Biome 的组合:Biome 管确定性规则,CodeRabbit 管智能审查。

3.2 CodeRabbit 实战接入#

在项目根目录创建 .coderabbit.yaml

language: "zh-CN"
reviews:
profile: "assertive" # 严格模式
request_changes_workflow: true
high_level_summary: true
poem: false # 关掉诗歌模式(认真的)
path_instructions:
- path: "src/composables/**"
instructions: |
这是 Vue 3 Composable 函数目录。审查时请特别注意:
1. 是否正确处理了组件卸载时的清理逻辑
2. 响应式数据是否有内存泄漏风险
3. 是否遵循 useXxx 命名约定
- path: "src/stores/**"
instructions: |
这是 Pinia Store 目录。请检查:
1. State 是否使用了正确的响应式类型
2. Actions 中是否有未处理的异步错误
3. 是否有跨 Store 的循环依赖
auto_review:
enabled: true
drafts: false
chat:
auto_reply: true

这个配置的精髓在 path_instructions你可以针对不同目录给 AI 不同的审查指令。这比通用的 AI 审查精准得多。

3.3 自建 AI 代码审查 Hook#

如果不想依赖第三方服务,可以用大模型 API 自建一个 Git pre-commit hook:

scripts/ai-review.ts
import { execSync } from 'child_process'
interface ReviewResult {
file: string
severity: 'info' | 'warning' | 'error'
line: number
message: string
suggestion?: string
}
async function getChangedFiles(): Promise<string[]> {
const output = execSync('git diff --cached --name-only --diff-filter=ACM')
.toString()
.trim()
return output.split('\n').filter(f => /\.(ts|vue|js)$/.test(f))
}
async function reviewWithAI(
filePath: string,
diff: string
): Promise<ReviewResult[]> {
const prompt = `你是一个资深前端代码审查专家。请审查以下代码变更,关注:
1. 潜在的 bug 和边界 case
2. 性能问题(不必要的重渲染、内存泄漏)
3. 安全风险(XSS、敏感数据暴露)
4. 可维护性问题
文件:${filePath}
变更内容:
${diff}
请以 JSON 数组格式返回审查结果,每项包含 severity、line、message、suggestion 字段。
如果没有问题,返回空数组 []。`
const response = await fetch('https://api.openai.com/v1/chat/completions', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${process.env.OPENAI_API_KEY}`,
},
body: JSON.stringify({
model: 'gpt-4o',
messages: [{ role: 'user', content: prompt }],
temperature: 0.1,
response_format: { type: 'json_object' },
}),
})
const data = await response.json()
return JSON.parse(data.choices[0].message.content).results || []
}
async function main() {
const files = await getChangedFiles()
if (files.length === 0) {
console.log('✅ 没有需要审查的文件')
return
}
console.log(`🔍 AI 审查 ${files.length} 个文件...`)
let hasErrors = false
for (const file of files) {
const diff = execSync(`git diff --cached -- ${file}`).toString()
const results = await reviewWithAI(file, diff)
for (const r of results) {
const icon = r.severity === 'error' ? '❌' : r.severity === 'warning' ? '⚠️' : 'ℹ️'
console.log(`${icon} ${file}:${r.line} - ${r.message}`)
if (r.suggestion) {
console.log(` 💡 建议: ${r.suggestion}`)
}
if (r.severity === 'error') hasErrors = true
}
}
if (hasErrors) {
console.log('\n❌ AI 审查发现严重问题,提交被阻止')
process.exit(1)
}
console.log('\n✅ AI 审查通过')
}
main().catch(console.error)

.husky/pre-commit 中添加:

#!/bin/sh
# 先跑 Biome(快速,确定性检查)
pnpm biome check --staged --no-errors-on-unmatched || exit 1
# 再跑 AI 审查(慢一点,但更智能)
npx tsx scripts/ai-review.ts || exit 1

3.4 AI 审查的边界在哪#

用了一段时间后,我总结出 AI 代码审查的能与不能

AI 擅长的:

  • 发现逻辑漏洞(比如没处理 null/undefined 的 case)
  • 识别安全风险(未转义的用户输入、敏感信息硬编码)
  • 命名和可读性建议
  • 发现 API 使用中的反模式

AI 不擅长的:

  • 业务逻辑的正确性(它不懂你的业务)
  • 架构层面的判断(这应该是人的决策)
  • 性能的精确量化(它能说”可能慢”,但不能说”慢 300ms”)
  • 团队规范的一致性(这是 Biome 的活)

所以最佳实践是:Biome 管规范,AI 管智能,人管架构。三层防线,各司其职。

四、完整的 CI/CD 代码质量流水线#

把前面的内容整合起来,以下是一个完整的 GitHub Actions 配置:

.github/workflows/code-quality.yml
name: Code Quality
on:
pull_request:
branches: [main, develop]
push:
branches: [main]
jobs:
biome-check:
name: Biome Lint & Format
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: biomejs/setup-biome@v2
with:
version: latest
- name: Run Biome
run: biome ci .
type-check:
name: TypeScript Check
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: 'pnpm'
- run: pnpm install --frozen-lockfile
- run: pnpm vue-tsc --noEmit
unit-test:
name: Unit Tests
runs-on: ubuntu-latest
needs: [biome-check, type-check]
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: 'pnpm'
- run: pnpm install --frozen-lockfile
- run: pnpm vitest run --coverage
- uses: actions/upload-artifact@v4
with:
name: coverage
path: coverage/

流水线执行顺序:

PR 提交
├── Biome 检查(~5s) ← 最快,第一道门
├── TypeScript 类型检查 ← 并行执行
└── 通过后 → 单元测试 ← 依赖前两步
└── 通过后 → CodeRabbit AI 审查(自动)

Biome 放在第一位是因为它最快——如果代码连格式都不对,后面的检查没必要跑。

五、性能实测:真实项目数据#

我在一个 380 个组件的 Vue 3 项目上做了完整的对比测试:

项目规模:
- 380 个 .vue 文件
- 210 个 .ts 文件
- 45 个 .css 文件
- 总计约 12 万行代码
ESLint + Prettier(cold): 28.4s
ESLint + Prettier(cached): 6.2s
Biome(cold): 1.1s
Biome(cached): 0.3s
CI 环境(GitHub Actions):
ESLint + Prettier: 42s
Biome: 3s

在 CI 环境差距更大,因为没有本地缓存。

内存占用对比:

ESLint: 峰值 ~420MB
Prettier: 峰值 ~180MB
Biome: 峰值 ~95MB

对于 4G 内存的服务器(比如我的部署服务器),这个差距意味着 Biome 可以和构建任务并行跑,而 ESLint 就得排队。

六、Biome 的局限性和应对#

Biome 不是万能的,目前还有几个短板需要注意:

6.1 Vue 模板的深度检查不够#

Biome 对 .vue 文件 <script> 部分的检查很好,但 <template> 部分的检查能力还不如 eslint-plugin-vue。比如 v-for 没有 :key、事件修饰符的使用建议等。

应对方案:保留 eslint-plugin-vue 只跑模板相关规则,其他交给 Biome:

// eslint.config.js(最小化版本)
import pluginVue from 'eslint-plugin-vue'
export default [
...pluginVue.configs['flat/recommended'].map(config => ({
...config,
rules: {
// 只保留模板相关规则
'vue/no-unused-vars': 'off', // 交给 Biome
'vue/html-indent': 'off', // 交给 Biome
'vue/max-attributes-per-line': 'off', // 交给 Biome
// 保留这些
'vue/no-mutating-props': 'error',
'vue/require-v-for-key': 'error',
'vue/no-template-shadow': 'warn',
},
})),
]

6.2 自定义规则#

ESLint 的插件生态是其最大优势。如果你依赖大量自定义 ESLint 插件,迁移成本会比较高。

Biome 从 2.0 开始支持通过 GritQL 编写自定义 lint 规则,但生态还在早期:

biome.json
{
"linter": {
"rules": {
"nursery": {
"useConsistentMemberAccessibility": "warn"
}
}
}
}

6.3 Monorepo 支持#

Biome 支持项目级别的配置继承,但不如 ESLint 的 cascading config 灵活:

// 根目录 biome.json
{
"extends": ["./biome.shared.json"],
"linter": {
"rules": {
"recommended": true
}
}
}

七、我的推荐方案#

根据项目阶段和团队情况,我推荐三种方案:

新项目(强烈推荐)#

Biome(lint + format + import)
+ CodeRabbit(AI PR 审查)
+ vue-tsc(类型检查)
+ Vitest(单元测试)

配置量最小,速度最快,体验最好。

存量项目(渐进迁移)#

第一步:Prettier → Biome formatter(低风险)
第二步:ESLint 简单规则 → Biome linter(中风险)
第三步:ESLint 只保留 Vue 模板规则(最终状态)
全程保留:AI 代码审查

大型 Monorepo#

Biome(基础 lint + format)
+ ESLint(Vue 模板 + 自定义业务规则)
+ AI 审查(PR 级别)

大型项目通常有很多自定义 ESLint 规则,完全迁移成本太高。混用是务实的选择。

总结#

前端代码质量工程化正在经历一次范式转变:

  • 工具层面:从「多工具组合」到「单工具统一」(Biome)
  • 检查层面:从「纯规则驱动」到「规则 + AI 智能」
  • 流程层面:从「本地手动」到「CI 自动化全覆盖」

Biome 不是银弹,但它确实解决了前端工具链最痛的问题——太慢、太复杂、太多配置。再配合 AI 代码审查,代码质量的保障能力比两年前强了一个量级。

如果你还在忍受 ESLint + Prettier 的配置地狱,是时候试试 Biome 了。一个 pnpm add -D @biomejs/biome && pnpm biome init,5 分钟就能跑起来。

工具的终极目标不是让你花时间配置它,而是让你忘记它的存在。 Biome 正在朝这个方向走。

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

告别 ESLint + Prettier:Biome 统一工具链 + AI 代码审查实战
https://boke.hackerdream.xyz/posts/biome-unified-toolchain-ai-review/
作者
晴天
发布于
2026-04-21
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
晴天
Hello, I'm 晴天.
公告
欢迎来到我的博客!这是一则示例公告。
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
125
分类
17
标签
287
总字数
257,955
运行时长
0
最后活动
0 天前

目录