Chapter 03

format 命令实战

逐个参数吃透 biome format——既理解每个开关的效果,也看清楚它相对 Prettier 的少数行为差异。

3.1 命令基础

# 检查但不改(默认模式)
biome format ./src
→ 退出码 0 = 无差异; 非 0 = 有文件需要格式化

# 写入磁盘
biome format --write ./src

# 指定扩展名范围
biome format --write "src/**/*.{ts,tsx,js,jsx}"

# 只处理 staged 的改动
biome format --staged --write

3.2 核心风格参数

indentStyle / indentWidth
缩进。"tab"(默认)或 "space"。Prettier 默认 2 空格;Biome 默认 tab 体现其"无障碍友好"立场。
lineWidth
软行宽,默认 80,建议设 100–120。Biome 会尽量把表达式压到这个宽度内。
lineEnding
"lf" | "crlf" | "cr"。团队应显式写 lf,避免 Windows 提交 crlf。
javascript.formatter.quoteStyle
字符串引号,"single""double"(默认)。
javascript.formatter.jsxQuoteStyle
JSX 属性引号,独立于 JS。React 惯例 "double"
javascript.formatter.semicolons
"always"(默认)或 "asNeeded"(只在必要时)。选 asNeeded = 你选了 no-semi 风格。
javascript.formatter.trailingCommas
"all"(ES2017+,默认)、"es5""none"。all 让 git diff 更干净。
javascript.formatter.arrowParentheses
"always"(x) => x)或 "asNeeded"x => x)。always 有利于后续加类型。
javascript.formatter.bracketSpacing
对象字面量是否加空格:{ a: 1 } vs {a: 1}。默认 true。
javascript.formatter.bracketSameLine
JSX 开闭标签的 > 是否单独成行。
javascript.formatter.attributePosition
"auto""multiline"。multiline 让 JSX 属性逐行排列,diff 更易读。

3.3 常用配置组合

标准 React/Next 风格

"javascript": {
  "formatter": {
    "quoteStyle": "double",
    "jsxQuoteStyle": "double",
    "semicolons": "always",
    "trailingCommas": "all",
    "arrowParentheses": "always",
    "lineWidth": 100
  }
}

Airbnb/Node 风格(单引号、no-semi)

"javascript": {
  "formatter": {
    "quoteStyle": "single",
    "semicolons": "asNeeded",
    "trailingCommas": "all"
  }
}

3.4 Biome 与 Prettier 的已知差异

Biome 官宣 Prettier 兼容度 97%,剩下 3% 是刻意选择。常见差异:

场景PrettierBiome
默认缩进2 空格tab
三元表达式换行启发式断行更一致的规则
JSX 属性换行阈值略激进略保守
对象解构保留尾逗号
单行 import 不会被强拆多行

差异完整对照表见 https://biomejs.dev/formatter/#differences-with-prettier。团队切换 Biome 时建议先跑一次 biome format --write,把"一次性重排 diff"单独作为一次提交,后续 code review 就不会再有噪声。

3.5 stdin 模式

给编辑器/脚本用——从标准输入读代码、格式化后输出到标准输出:

echo "const x=1" | biome format --stdin-file-path=foo.ts
→ const x = 1;

必须带 --stdin-file-path,Biome 据此判断语言(ts/tsx/jsx/json/css)。

3.6 禁用格式化:魔法注释

有些场景(对齐表格、ASCII 图、生成的代码)不希望被格式化:

// biome-ignore format: keep this aligned
const matrix = [
  [1, 0, 0],
  [0, 1, 0],
  [0, 0, 1],
];

注释后面紧跟"下一个语句"会被整体跳过格式化。

3.7 多语言:JSON / CSS / GraphQL

biome format --write "**/*.{json,jsonc}"
biome format --write "**/*.css"
biome format --write "**/*.graphql"

CSS 格式化在 Biome v2 稳定,规则接近 stylelint 的默认 pretty 输出。

Markdown / YAML 呢?

Biome 目前不支持 Markdown 与 YAML 的格式化(在路线图上)。如果需要,可叠加 dprint 或 Prettier 专门处理这两类。

3.8 性能对比实测

# 一个 20 万行的真实 Next.js 项目(仅 format)
prettier .  # ~18.2s
biome format .  # ~0.52s
# 约 35× 加速

小结

biome format 的 10 来个参数决定了"你的代码长什么样"。先按团队风格在 biome.json 里定一次、用一次 --write 作为"格式化大爆炸"提交,之后就靠 IDE 保存时格式化 + pre-commit 把风格自动稳定下来。下一章转到 lint 规则。