Biome
Biome 是 JS、TS、JSX、JSON 和 CSS 的唯一格式化器和检查器。SCSS 是例外:Biome 2.5 无法解析它,因此 stylelint 负责处理 .scss(参见 scss-bem)。没有 ESLint,没有 Prettier。
模板的根目录 biome.json 是真理之源。一个插件钩子在 Claude 每次编辑文件后,当目标文件上方存在 biome.json 时,运行 pnpm exec biome check --write <file>。
规则
-
一个根目录
biome.json,schema 固定到已安装版本。"$schema": "https://biomejs.dev/schemas/2.5.15/schema.json",并且@biomejs/biome在工作空间目录中固定到相同版本。不匹配的 schema 会在编辑器中隐藏未知或已重命名的选项。升级时,运行pnpm exec biome migrate --write并更新两者。 -
让 git 决定忽略什么:
vcs.useIgnoreFile: true。 然后通过在files.includes中使用!!强制忽略构建输出(!!**/.next、!!**/.turbo、!!**/dist、!!**/coverage),这也会阻止 Biome 扫描这些文件夹。单个!排除处理但仍会索引。files.ignoreUnknown: true防止报告.scss和其他不支持的文件的错误。 -
格式化器:2 空格、宽度 100、LF、双引号、分号、尾随逗号。 这些对于每个仓库都是固定的,因此差异不会因样式产生冲突。不要添加每个包的格式化器覆盖。
-
检查器:
preset: "recommended",a11y: "error",领域react和next设为recommended。rules.recommended: true是旧拼写,已弃用:请使用rules.preset。a11y设为error,因为 nuvui 处理其自身组件的可访问性,因此剩下的(alt、标签、在你自己的标记中的按钮类型)必须正确。next领域添加了例如noImgElement等规则;react添加了 hooks 规则。 -
Nursery 保持关闭。 Nursery 规则在补丁版本之间会变化,可能在 Biome 升级时破坏 CI。如果有意启用某个规则,请按名称启用,并附上原因注释,同时在每次升级时重新检查。
-
noConsole给出警告,但允许error和warn。 结构化错误日志(instrumentation.ts)使用console.error;零散的console.log会被捕获。 -
使用 assist 排序导入,不要手动。
assist.actions.source.organizeImports: "on"。biome check --write会应用它;biome ci会因未排序导入而失败。 -
按 glob 覆盖,用于测试文件等。 模板仅为
*.test.ts(x)/*.test-d.ts启用test领域。其他文件类型的差异也放在那里,而不是放在单独的配置中。 -
仅当包真正不同时才使用嵌套配置,并且它们继承根配置。
// packages/legacy-widget/biome.json { "extends": "//", "linter": { "rules": { "style": { "noNonNullAssertion": "off" } } } }"extends": "//"表示“根配置”,并隐含"root": false。任何其他嵌套配置必须设置"root": false。我们不使用共享的@repo/biome-config包:根文件加上//就足够了,无需构建或依赖。 -
本地使用
biome check --write;CI 中使用biome ci。pnpm lint运行biome check .(不写入);pnpm lint:fix运行biome check --write .。CI 运行pnpm exec biome ci --reporter=github .,从不写入,对格式化、检查和导入顺序失败,并注释 PR。只有当完整运行变慢时才添加--changed --since=origin/main;目前只需几毫秒。 -
抑制单行,并附上原因。
// biome-ignore lint/suspicious/noExplicitAny: third-party callback typed as any upstream永远不要为了通过一个文件而在整个仓库范围内禁用规则。如果规则对整个仓库来说是错误的,请在其自己的提交中修改
biome.json,并附上原因。 -
修复常见的,而不是静默它们。
useImportType:运行修复;它是verbatimModuleSyntax所要求的。noExplicitAny:使用unknown并解析(参见typescript-production)。useButtonType、noSvgWithoutTitle、useAltText:真正的可访问性缺陷。noImgElement:使用next/image。useExhaustiveDependencies:修复依赖列表或将值移出组件。
-
VS Code:Biome 是默认格式化器,保存时修复。 模板的
.vscode/settings.json设置editor.defaultFormatter: "biomejs.biome",保存时启用source.fixAll.biome和source.organizeImports.biome,并设置biome.requireConfiguration: true以使扩展在不包含 Biome 的仓库中保持安静。SCSS 保留 stylelint 扩展。在.vscode/extensions.json中推荐两者。 -
从 ESLint/Prettier 迁移:迁移,然后删除。 参见 references/migration.md。最终状态:没有
eslint*、prettier*或@typescript-eslint/*包,没有.eslintrc*、eslint.config.*、.prettierrc*、.prettierignore。
Biome 不覆盖的内容
| 文件 | 工具 |
|---|---|
.scss | stylelint (scss-bem) |
.yaml(工作流、Helm) | actionlint 用于工作流;helm lint + kubeconform 用于图表 |
.md | 无强制执行 |
| 类型错误 | tsc --noEmit(pnpm typecheck) |
验证
pnpm lint # biome check . && stylelint
pnpm exec biome ci --reporter=github . # 这是 CI 运行的内容
pnpm exec biome rage # 打印解析后的配置,如果某些内容看起来被忽略了
参考来源
- https://biomejs.dev/reference/configuration/
- https://biomejs.dev/guides/big-projects/
- https://biomejs.dev/linter/domains/
- https://biomejs.dev/linter/rules/
- https://biomejs.dev/reference/cli/
- https://biomejs.dev/reference/vscode/
- https://biomejs.dev/guides/migrate-eslint-prettier/
- https://biomejs.dev/internals/language-support/