Biome
Biome은 JS, TS, JSX, JSON, CSS를 위한 유일한 포매터이자 린터입니다. SCSS는 예외입니다. Biome 2.5는 SCSS를 파싱하지 않으므로 stylelint가 .scss를 처리합니다(scss-bem 참조). ESLint나 Prettier는 사용하지 않습니다.
템플릿의 루트 biome.json이 진실 공급원(source of truth)입니다. 플러그인 훅은 Claude가 파일을 편집할 때마다 해당 파일 위에 biome.json이 있으면 pnpm exec biome check --write <file>을 실행합니다.
규칙
-
하나의 루트
biome.json으로, 스키마를 설치된 버전에 고정합니다."$schema": "https://biomejs.dev/schemas/2.5.15/schema.json"로 설정하고, 워크스페이스 카탈로그에서@biomejs/biome도 같은 버전으로 고정합니다. 스키마가 일치하지 않으면 편집기에서 알 수 없거나 이름이 변경된 옵션이 숨겨집니다. 업그레이드 시pnpm exec biome migrate --write를 실행하고 둘 다 업데이트합니다. -
git이 무시할 파일을 결정하도록 합니다:
vcs.useIgnoreFile: true. 그런 다음files.includes에!!로 빌드 출력물을 강제 무시합니다(!!**/.next,!!**/.turbo,!!**/dist,!!**/coverage). 이렇게 하면 Biome이 해당 폴더를 스캔하지 않습니다.!하나는 처리는 제외하지만 여전히 인덱싱합니다.files.ignoreUnknown: true는.scss및 기타 지원되지 않는 파일이 보고되지 않도록 합니다. -
포매터: 2칸 들여쓰기, 너비 100, LF, 쌍따옴표, 세미콜론, 후행 쉼표. 모든 레포지토리에 대해 이 값이 고정되어 있어 diff가 스타일로 싸우지 않습니다. 패키지별 포매터 오버라이드를 추가하지 마세요.
-
린터:
preset: "recommended",a11y: "error", 도메인react와next는recommended로.rules.recommended: true는 예전 표기이며 더 이상 사용되지 않습니다.rules.preset을 사용하세요.a11y를error로 설정하는 이유는 nuvui가 자체 컴포넌트의 접근성을 처리하므로, 남은 부분(자체 마크업에서alt, 레이블, 버튼 타입 등)은 반드시 올바르게 되어야 하기 때문입니다.next도메인은noImgElement와 같은 규칙을 추가하고,react는 훅 규칙을 추가합니다. -
Nursery는 비활성화합니다. Nursery 규칙은 패치 릴리스 사이에 변경될 수 있으며, Biome 업그레이드 시 CI를 깨뜨릴 수 있습니다. 필요 시 이름을 명시하고 이유를 주석으로 남겨 하나씩 신중하게 활성화하고, 업그레이드할 때마다 다시 확인합니다.
-
noConsole은 경고(warn)로 설정하고,error와warn은 허용합니다. 구조화된 오류 로그(instrumentation.ts)는console.error를 사용하고, 잘못된console.log는 잡아냅니다. -
import를 수동이 아닌 도움(assist)으로 정렬합니다.
assist.actions.source.organizeImports: "on"으로 설정합니다.biome check --write가 이를 적용하고,biome ci는 정렬되지 않은 import에 대해 실패합니다. -
테스트 파일 등에 대해 glob별 오버라이드를 사용합니다. 템플릿은
*.test.ts(x)/*.test-d.ts에 대해서만test도메인을 활성화합니다. 다른 파일 타입의 차이는 별도 설정이 아닌 여기에 넣습니다. -
중첩 설정은 실제로 차이가 있는 패키지에만 사용하며, 루트를 확장(extends)합니다.
// 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 .를 실행하며, 쓰지 않고 포매팅, 린트, import 순서에 실패하면 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/