Skip to content

Oxfmt: альфа форматтера Oxc

Эта заметка анонсирует альфа-релиз Oxfmt. Oxfmt уже вышел в бету! См. анонс Oxfmt Beta про актуальные возможности и улучшения.

Мы рады объявить об альфа-релизе Oxfmt — форматтера кода на Rust, совместимого с Prettier. Первая версия ориентирована на JavaScript и TypeScript; поддержка других языков скоро.

Цели Oxfmt:

  • Производительность: более чем в 30 раз быстрее Prettier и более чем в 3 раза быстрее Biome на первом запуске без кэша (бенчмарк).
  • Совместимость: совместимость с Prettier для простого внедрения в существующие проекты.
  • Удобство: в планах сортировка импортов, расширенные опции форматирования и поддержка плагинов Prettier.

Быстрый старт

Добавьте oxfmt в проект:

sh
npm add -D oxfmt@latest
sh
pnpm add -D oxfmt@latest
sh
yarn add -D oxfmt@latest
sh
bun add -D oxfmt@latest
sh
deno add -D npm:oxfmt@latest

Oxfmt следует формату конфигурации Prettier. Если у вас JSON-конфиг Prettier, можно переименовать его в .oxfmtrc.jsonc:

bash
cp .prettierrc.json .oxfmtrc.jsonc

Пример стартового .oxfmtrc.jsonc:

jsx
{
  "$schema": "./node_modules/oxfmt/configuration_schema.json",
  // Use 80 if migrating from Prettier; 100 is the Oxfmt default!
  "printWidth": 80,
  "ignorePatterns": [] // Same as `.prettierignore`
}

Добавьте скрипт в package.json:

jsx
"scripts": {
  "format": "oxfmt"
}

Подробнее — руководство по установке.

Производительность

Oxfmt очень быстр. По репозиторию Outline:

  • более чем в 30 раз быстрее экспериментального CLI Prettier без кэша;
  • более чем в 20 раз быстрее Prettier с парсером Oxc через @prettier/plugin-oxc;
  • более чем в 3 раза быстрее Biome.

Детали настройки бенчмарка:

oxc-project/bench-formatter
https://github.com/oxc-project/bench-formatter

Дизайн

Команда Oxc ставит совместимость с экосистемой на первое место, чтобы миграции были простыми даже для больших кодовых баз.

Результат форматирования

Oxfmt совпадает с форматированием JS у Prettier. При миграции на Oxfmt сегодня различий с Prettier быть не должно.

Возможны мелкие отличия при миграции со старых версий Prettier (пример миграции): мы нашли места, где форматирование Prettier можно улучшить. Активно сотрудничаем с командой Prettier — часть улучшений попала в Prettier 3.7.

Oxfmt проходит около 95% тестов Prettier для JS и TS; рассчитываем со временем сойтись по форматированию.

printWidth: 100 по умолчанию

Мы выбрали printWidth: 100 вместо 80 у Prettier. Причины:

  • код на TypeScript часто длиннее из‑за аннотаций типов;
  • в импортах много элементов;
  • на больших экранах больше места по горизонтали;
  • немного меньше токенов для LLM.

Oxfmt остаётся совместимым с Prettier, но другая ширина по умолчанию — 100 символов. Чтобы избежать больших diff при миграции с Prettier, явно задайте ширину 80.

ignorePatterns

Помимо .prettierignore поддерживается опция ignorePatterns, чтобы держать всё в одном файле конфигурации.

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

JSON-конфиги Prettier совместимы с Oxfmt. Простейший случай миграции:

bash
cp .prettierrc.json .oxfmtrc.jsonc

Если в редакторе есть JSON language server, после добавления oxfmt в devDependencies можно начать с шаблона:

json
{
  "$schema": "./node_modules/oxfmt/configuration_schema.json",
  "ignorePatterns": []
}

В этой альфе поддерживаются не все опции Prettier, но уже есть основные: printWidth, tabWidth, useTabs, semi, singleQuote, quoteProps, jsxSingleQuote, trailingComma, bracketSpacing, objectWrap, bracketSameLine, arrowParens, endOfLine, singleAttributePerLine.

Полный список — в документации.

Вывод в терминале

Поведение по умолчанию эквивалентно prettier . --write: как у cargo fmt, без лишнего вывода. Флаг --check показывает отличия и подходит для CI.

Планы бета-релиза

Отслеживание прогресса к бете:

Formatter Beta · Milestone #15 · oxc-project/oxc
https://github.com/oxc-project/oxc/milestone/15

В будущих версиях планируем смягчить часть стилистических решений.

Дальнейшие шаги

Полное руководство — в документации Oxfmt.

Сообщения об ошибках

По расхождениям форматирования см. обсуждение на GitHub. Известные проблемы помечены лейблами.

Другие issue создавайте по шаблону.

Сообщество

RFC: Formatter · oxc-project/oxc · Discussion #13608
https://github.com/oxc-project/oxc/discussions/13608

Ждём вашего фидбека, чтобы сделать Oxfmt лучше!

Благодарности

Oxfmt опирается на форк инфраструктуры biome_formatter; благодарим команду Biome, особенно @ematipico и @MichaReiser. Спасибо команде Prettier и @fisker за совместную работу над совместимостью форматирования.