Biome vs ESLint+Prettier: стоит ли переходить
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%. Тренд явный.