Дайджесты новостей
Предметный натюрморт рабочего места разработчика с ноутбуком, экраном консоли bun fmt и блокнотом на дубовом столе в мягком свете лампы.

Релиз Bun 1.4.4: встроенный форматировщик bun fmt и ускорение в 280 раз

Вспомни свой привычный рабочий процесс: ты вносишь точечный коммит на две строчки, нажимаешь сохранение, срабатывает pre-commit хук — и ноутбук замирает на добрые пятнадцать-двадцать секунд. Кулеры начинают раскручиваться, внимание рассеивается, а в терминале неспешно ворочается Prettier, перебирая тысячи файлов проекта. Если же эта проверка запускается на сервере непрерывной интеграции (CI), где параллельно стартуют десятки пайплайнов, драгоценные минуты ожидания превращаются в часы простоя всей инженерной команды и внушительные счета за облачные раннеры.

Команда Bun во главе с Джарредом Самнером (Jarred Sumner) методично развивает концепцию универсального тулчейна «всё в одном». Мы уже привыкли к тому, что Bun умеет быстро исполнять JavaScript и TypeScript, соревноваться с Node.js и мгновенно ставить зависимости. Но в мажорном обновлении Bun v1.4.4 среда выполнения делает долгожданный шаг в сторону чистоты кода: в бинарник добавлен нативный форматировщик bun fmt.

Я протестировал поведение инструмента на реальных монорепозиториях, заглянул в его внутреннюю архитектуру и готов подробно разобрать, за счет чего достигается фантастическая скорость, как устроена совместимость с устоявшимися стандартами и почему переезд на новый форматировщик не потребует переписывать правила стиля команды.

Анатомия скорости: почему классический Prettier упирался в потолок

Чтобы оценить масштаб инженерной работы, давай разберем, где именно терялось время в традиционном стеке. Prettier — великолепный инструмент, ставший стандартом де-факто для всего веба. Однако он написан на JavaScript и исполняется внутри виртуальной машины Node.js.

Когда Prettier запускается на крупном репозитории, конвейер сталкивается с неизбежными накладными расходами:

  1. Долгая инициализация самого рантайма Node.js и последовательная подгрузка сотен модулей из каталога node_modules.
  2. Построение абстрактного синтаксического дерева (AST) для каждого исходного файла с порождением сотен тысяч мелких объектов в динамической памяти (JS heap).
  3. Постоянная блокировка потока сборщиком мусора (Garbage Collector), который тратит ресурсы на очистку временных структур.
  4. Однопоточная природа разбора, с трудом утилизирующая современные многоядерные процессоры.

В Bun создатели пошли совершенно другим путем. Сам форматировщик bun fmt написан на системных языках Zig и C++. Движок форматирования для JavaScript и TypeScript был портирован непосредственно из oxc_formatter (проекта Oxc от команды VoidZero), вобравшего лучшие архитектурные находки форматировщика Biome. В результате синтаксический анализ и генерация форматированного текста происходят в монолитном блоке нативной памяти без накладных расходов виртуальной машины.

Взгляни на результаты контрольных измерений. В официальном репозитории проекта Prettier (2616 файлов) вызов проверки:

bun fmt --check

завершается всего за 59.7 мс при пиковом расходе памяти 48 МБ. Для сравнения: Prettier 3.9.10 на том же наборе файлов требует 17.1 с и съедает 459 МБ памяти. Ускорение достигает 286 раз при 10-кратной экономии RAM! А по сравнению с Rust-форматировщиком oxfmt 0.74.0 на базе Vite (2537 файлов), bun fmt финиширует за 65.2 мс против 406.7 мс (быстрее более чем в 6 раз).

Ранее мы уже разбирали, как в версии Bun v1.4.3 появилась нативная проверка типов bun check, снявшая проблему мучительно долгой работы tsc. Теперь связка из быстрой проверки типов и мгновенного форматирования закрывает обе главные задачи контроля качества перед коммитом.

Мультиязычность и разбор встроенных фрагментов

Ты можешь резонно спросить: «Неужели такая скорость достигнута за счет урезания функциональности? Наверняка разработчики поддержали только чистый JS, а на сложной верстке инструмент спотыкается?» Вовсе нет. bun fmt изначально проектировался как полноценная замена Prettier для широкого спектра языков веб-платформы:

  • JS, TS, JSX, TSX, Flow, CSS, SCSS, Less;
  • HTML, Vue, Svelte, Angular, LWC, Handlebars, MJML;
  • Markdown, MDX, GraphQL, JSON, JSONC, YAML, TOML.

Парсер Bun аккуратно определяет границы встроенных языков (например, <style> внутри Vue/HTML или CSS в шаблонных строках) и форматирует их в едином нативном процессе без межпроцессных переключений.

Совместимость с конфигурациями и встроенные плагины

Главный страх любого лида при смене форматировщика — получить в репозитории диф на сотни тысяч строк из-за мелких несовпадений в расстановке пробелов или переносе закрывающих скобок. Создатели Bun уделили совместимости пристальное внимание.

Инструмент автоматически находит и применяет существующие конфигурации: .prettierrc*, prettier.config.*, секцию "prettier" в package.json, правила .editorconfig, .prettierignore и конфиги Oxc (.oxfmtrc.json, oxfmt.config.ts).

Если же ты предпочитаешь единую точку настройки тулчейна Bun, все параметры форматирования можно задать прямо в bunfig.toml.

# bunfig.toml — централизованное управление форматированием в проекте
[fmt]
printWidth = 100
semi = false
singleQuote = true
trailingComma = "all"
indentWidth = 2
sortImports = true
sortTailwindcss = true
sortPackageJson = true
jsdoc = true

# Точечные правила для тестовых файлов
[[fmt.overrides]]
files = ["*.test.ts", "tests/**/*.ts"]
options = { printWidth = 120, semi = true }

Обрати внимание на встроенные опции sortImports и sortTailwindcss. Раньше в Prettier для сортировки директив импорта приходилось ставить внешний плагин вроде @trivago/prettier-plugin-sort-imports, а для правильного порядка служебных классов верстки — prettier-plugin-tailwindcss. Оба плагина серьезно тормозили проверку.

В bun fmt эта логика встроена в само ядро:

  • Сортировка импортов на лету группирует встроенные библиотеки, внешние npm-модули, локальные алиасы и относительные пути.
  • Сортировщик Tailwind поддерживает классы актуальных версий v3 и v4, приводя верстку к предсказуемому виду.
  • Нормализатор package.json расставляет системные ключи манифеста в общепринятом каноничном порядке.
Безопасная очистка node_modules через bun fmt --doctor

Если ты переводишь репозиторий на Bun, выполни команду bun fmt --doctor. Утилита проверит используемые конфиги и сформирует точный список пакетов Prettier и сторонних плагинов, которые можно безболезненно вычистить из зависимостей проекта.

Git-интеграция и автоматизация в CI/CD

Никто не любит вручную форматировать файлы перед каждой отправкой ветки. Для интеграции с Git разработчики предусмотрели режим bun fmt --staged.

Инфографический чертеж Git-индекса с прямой валидацией файлов через bun fmt и исключением промежуточного слоя lint-staged.

Раньше для этой задачи практически повсеместно использовалась утилита lint-staged. Она через Node.js запрашивала список измененных файлов у Git, передавала их внешнему Prettier и затем заново добавляла их в индекс через git add. bun fmt --staged делает всю эту цепочку напрямую: сам считывает подготовленные файлы, форматирует их на месте и моментально обновляет индекс Git без промежуточных накладных расходов.

#!/bin/sh
# .git/hooks/pre-commit — мгновенный pre-commit хук
bun fmt --staged

А для автоматических проверок на сервере сборки достаточно добавить стандартные скрипты в манифест:

{
  "scripts": {
    "format": "bun fmt",
    "format:check": "bun fmt --check"
  }
}

Команда bun fmt --check возвращает ненулевой код выхода при обнаружении любых отклонений от стиля, что делает ее идеальным и экономным шагом для любого пайплайна непрерывной интеграции.

Краевые случаи и нюансы совместимости

В подавляющем большинстве стандартных синтаксических конструкций результат работы bun fmt посимвольно неотличим от Prettier. Однако в тех редких ситуациях, где Prettier исторически допускал синтаксические ошибки, команда Bun предпочла сохранить корректность кода:

  • В стилях CSS со специфическими свойствами вроде font-family: Font\ Awesome классический Prettier ошибочно срезал экранирующий слэш, ломая отображение шрифтовых иконок. Bun сохраняет экранирование нетронутым.
  • В шаблонах Handlebars с директивой <!DOCTYPE html> старый парсер искажал структуру корневого узла.
  • В шаблонных строках JSX вида className={\btn ${active ? "on" : "off"}`}` старые версии Prettier иногда удаляли значащие пробелы перед интерполяцией. Bun гарантирует сохранность пробельных символов.

Единственное важное ограничение: если в твоем проекте используются сложные самописные плагины для Prettier, выполняющие произвольный код на JavaScript для конструирования нестандартных синтаксических деревьев, нативный движок Bun не сможет их выполнить. В таких случаях для специфических файлов имеет смысл временно сохранить классический Prettier, переведя весь остальной массив кода на bun fmt.

Сопутствующие оптимизации релиза Bun v1.4.4

Помимо форматировщика, релиз v1.4.4 включает комплекс улучшений других подсистем:

  • Ускорение bun install: оптимизация под Linux ускорила установку зависимостей из кэша до 3.2 раз, добавлена фильтрация бинарников под musl/glibc и поддержка peer dependencies по стандарту pnpm.
  • Оптимизация Bun.SQL и SQLite: снижена нагрузка на CPU до 48% на запрос, внедрена поддержка потоков COPY для PostgreSQL и сериализация массивов.
  • Сетевой стек WebSocket: исправлен хэндшейк закрытия сессии, исключающий потерю сообщений.

Практический итог

Появление bun fmt — наглядный пример того, как современный системный язык программирования и грамотная архитектура данных способны вдохнуть новую жизнь в привычные инструменты веб-разработки. Возможность проверить и отформатировать несколько тысяч файлов меньше чем за одну десятую секунды меняет саму культуру работы с кодом, навсегда избавляя разработчиков от утомительных пауз перед коммитом.