lenec ru

← все посты

Biome vs ESLint+Prettier: стоит ли переходить

13K

Biome — это объединённый линтер и форматтер, написанный на Rust. Он претендует на замену связки ESLint + Prettier, и в 2026 году эта замена становится реалистичной. Я перевёл два проекта с ESLint+Prettier на Biome и параллельно держу один на старом стеке. Расскажу, где Biome выигрывает, где проигрывает и стоит ли переезжать твоему проекту.

Что такое Biome

Это форк rome-tools, который команда Biome подняла после того, как rome закрылся. Сегодня Biome закрывает три задачи:

  • Форматирование кода (вместо Prettier).
  • Линтинг (вместо ESLint с базовыми правилами).
  • Анализ импортов (организация, sorting, группировка).

Отдельно — поддержка JS, TS, JSX, JSON, CSS. HTML и Markdown в работе.

Установка

pnpm add -D --save-exact @biomejs/biome
pnpm biome init

Создаётся biome.json. Базовая конфигурация:

{
  "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json",
  "organizeImports": { "enabled": true },
  "linter": {
    "enabled": true,
    "rules": { "recommended": true }
  },
  "formatter": {
    "enabled": true,
    "indentStyle": "space",
    "indentWidth": 2,
    "lineWidth": 100
  }
}

Дальше:

pnpm biome check .         # линт + формат
pnpm biome check --write . # с автофиксом
pnpm biome format .        # только формат
pnpm biome lint .          # только линт

Скорость

Главная причина переходить — скорость. На моём проекте из 1500 файлов:

  • ESLint + Prettier (lint + format): ~22 секунды.
  • Biome (check): ~1.4 секунды.

Это в 15 раз быстрее. На pre-commit хуке разница между «не замечаешь» и «секунды ожидания». На CI разница в реальные деньги.

На маленьких проектах (50-100 файлов) разница менее заметна, но всё равно ощутимая: 0.4 с против 2 с.

Полнота правил

Тут Biome пока проигрывает ESLint. У ESLint есть тысячи плагинов: react, vue, jsx-a11y, sonarjs, security и др. У Biome — встроенный набор примерно 200 правил, из которых половина соответствует базовому ESLint, а вторая половина — собственная.

В Biome есть аналоги:

  • react-hooks: useExhaustiveDependencies, useHookAtTopLevel.
  • jsx-a11y: значительная часть правил.
  • typescript-eslint: ~80% популярных правил.

Чего нет:

  • Сложных custom-плагинов команды (если у тебя свои правила в org).
  • Специализированных правил для Vue (на момент написания).
  • Часть редких правил из sonarjs и unicorn.

Конфигурация

Biome имеет одну конфигурацию biome.json вместо .eslintrc.js + .prettierrc. Это удобно: одна точка правды.

{
  "linter": {
    "rules": {
      "recommended": true,
      "style": {
        "useConst": "error",
        "noVar": "error"
      },
      "suspicious": {
        "noExplicitAny": "warn"
      }
    }
  },
  "overrides": [
    {
      "include": ["**/*.test.ts"],
      "linter": {
        "rules": {
          "suspicious": { "noExplicitAny": "off" }
        }
      }
    }
  ]
}

Правила сгруппированы по категориям: style, suspicious, complexity, performance, security, nursery (экспериментальные). Это упрощает понимание, но требует привыкания.

Совместимость с Prettier

Biome поддерживает почти весь синтаксис, что и Prettier, но есть мелкие различия. Главное — кавычки в JSX, точки с запятой и обработка длинных строк. На моих проектах после переноса было около 200 правок «формата», которые Biome изменил.

Для миграции есть утилита: импорт настроек из .prettierrc:

pnpm biome migrate prettier --write

Она читает .prettierrc и переносит совместимые опции. Несовместимые отбрасывает. Я после этого вручную проверял конфиг.

VS Code

Расширение Biome для VS Code существует и работает быстро. Один минус: не все настройки PrettierVSCode мапятся напрямую, но базовое «format on save» включается одной строкой:

{
  "editor.defaultFormatter": "biomejs.biome",
  "editor.formatOnSave": true,
  "editor.codeActionsOnSave": {
    "source.organizeImports.biome": "explicit",
    "source.fixAll.biome": "explicit"
  }
}

Когда я перешёл бы

Если у тебя простой проект на JS/TS/JSX без специфичных плагинов ESLint — Biome закрывает все нужды. Я перевёл лендинг и админку без боли. Скорость на CI выросла в 8-10 раз.

Если у тебя дизайн-система с собственными плагинами accessibility и архитектурными правилами — оставайся на ESLint. Biome пока не позволяет писать кастомные правила (фича в работе).

Если у тебя Vue или Svelte — пока ESLint, у Biome поддержка не такая зрелая. На React всё хорошо.

Не всё или ничего

Biome можно использовать частично. Самый простой сценарий: Biome для форматирования + ESLint для линтинга.

{
  "formatter": { "enabled": true },
  "linter": { "enabled": false }
}

В package.json:

{
  "scripts": {
    "format": "biome format --write .",
    "lint": "eslint .",
    "check": "pnpm format && pnpm lint"
  }
}

Это даёт скорость Biome для форматирования и сохраняет всю экосистему ESLint. У меня это работало на проекте, где нужны были специфические плагины ESLint, а форматирование хотелось ускорить.

Грабли

Импорт-сорт. Biome организует импорты иначе, чем eslint-plugin-import + prettier. После миграции порядок импортов в файлах может измениться. Это просто другой порядок, не хуже, но команда увидит большой diff.

JSX-форматирование. Есть несколько мест, где Biome форматирует JSX по-другому. Например, длинные пропсы переносятся не так, как в Prettier. На больших компонентах diff увеличивается.

Игноры. .gitignore читается автоматически, но если есть собственные паттерны игнора, нужно явно прописать в files.ignore:

{
  "files": {
    "ignore": ["dist/**", "node_modules/**", "*.snap"]
  }
}

Стоит ли переходить

Чек-лист, по которому я решаю:

  • Используется ли в проекте редкий плагин ESLint? Если да — оставайся.
  • Это Vue / Svelte / Angular? Оставайся.
  • Есть ли в команде кастомные правила линтинга? Оставайся.
  • Простой React / TS / Astro проект, и важна скорость CI? Переходи.
  • Хочется одну конфигурацию вместо двух? Переходи.

На моих проектах переход занял 3-4 часа: миграция конфига, прогон автофикса, ручное ревью diff'а. Дальше экономия в час-два на каждом CI-запуске и почти моментальный pre-commit.

Что копать дальше

Biome быстро развивается. С каждым релизом добавляют новые правила и фиксят несовместимости с Prettier. Если ты сегодня посмотрел и не подошло — попробуй через полгода. У меня сейчас на одном проекте Biome закрывает 95% потребностей в линтинге, год назад было около 70%. Тренд явный.

Комментарии 0

  • Будьте первым, кто оставит комментарий.

Войдите, чтобы оставить комментарий.