moex-vibe/apps/docs/docs/adr/ADR-017-biome-linter-formatter.md

3.9 KiB
Raw Blame History

ADR-017: Biome как единый инструмент линтинга и форматирования

Дата: 2026-06-23 Статус: Принято Автор: AI Agent (codex/frontend-infrastructure-tooling)

Контекст

Проект использует ESLint v8 + Prettier для линтинга и форматирования. ESLint 8 устарел: ESLint 9 имеет полностью изменённый конфиг, миграция потребует переписывания .eslintrc. Оба инструмента написаны на JavaScript и работают медленно на больших кодовых базах.

Появились современные Rust-альтернативы, объединяющие линтинг и форматирование в одном CLI со значительным приростом производительности.

Рассмотренные варианты

Biome v2.5

  • Linter + Formatter в одном CLI
  • 500+ правил (ESLint + TypeScript ESLint + others)
  • 97% совместимость форматтера с Prettier
  • ~35x быстрее Prettier, ~35x быстрее ESLint
  • Поддержка: JS, TS, JSX, TSX, JSON, HTML, CSS, GraphQL
  • Стабильный LTS, продакшн у AWS, Google, Vercel
  • Встроенная миграция: biome migrate eslint

Oxlint + Oxfmt (Oxc Project)

  • Linter отдельно (800+ правил, 50-100x быстрее ESLint)
  • Formatter отдельно (Oxfmt, beta, 3x быстрее Biome, 30x быстрее Prettier)
  • Type-aware linting через tsgo
  • Два отдельных инструмента с разными конфигами
  • Oxfmt в статусе beta

Оставить ESLint + Prettier

  • Знакомый стек
  • Медленная производительность
  • Необходимость мигрировать на ESLint 9 в любом случае
  • Два набора конфигов

Решение

Перейти на Biome как единый инструмент для линтинга и форматирования.

Причины:

  1. Один инструмент вместо двух — меньше конфигов, один CI-степ, одна команда
  2. Production-ready — стабильный LTS, используется крупными компаниями
  3. Плавная миграцияbiome migrate eslint переносит правила автоматически
  4. Производительность — ~35x быстрее как линтинг, так и форматирование
  5. Встроенный import sorting — замена eslint-plugin-import

Ограничения

FSD-правила из @conarti/eslint-plugin-feature-sliced не имеют аналога в Biome. Если не удаётся портировать через plugin system — сохраняется минимальный .eslintrc.cjs только для FSD layer boundaries.

Последствия

Положительные

  • Единый конфиг biome.json вместо .eslintrc.cjs + .prettierrc
  • Ускорение CI (lint + format за один проход)
  • Автоматический import sorting
  • Меньше зависимостей в package.json

Риски

  • FSD-правила могут не портироваться — потребуется костыль с минимальным ESLint
  • Biome может не поддерживать какое-то редкое правило ESLint — потребуется адаптация
  • Команде нужно привыкнуть к новому CLI

Связанные документы

  • docs/research/frontend-infrastructure-tooling/biome-vs-oxlint.md
  • docs/features/frontend-infrastructure-tooling/plan.md (Phase 2)