React Compiler переписывают на Rust — в 10 раз быстрее, но AST остаётся от Babel

Команда React влила полный порт компилятора на Rust: примерно в 3 раза быстрее в роли Babel-плагина и в 10 раз быстрее на самом преобразовании, при этом все 1 725 фикстур проходят. Неожиданный выбор: публичным API по-прежнему служит AST от Babel.

Вкратце

Пришли пользователи из прода и подтвердили: сам компилятор тихо работает уже год — useMemo и useCallback убраны, производительность выросла.

Самый острый вопрос: зачем замораживать Babel AST как контракт вместо нативного Oxc? Мейнтейнеры ответили — Oxc не единственный потребитель.

Что влили и какие цифры

Порт React Compiler на Rust
Порт React Compiler на Rust

Pull request, который открыл Джозеф Савона из React Core Team и который влили после 435 коммитов, приносит полный порт React Compiler на Rust. Ранние бенчмарки: «в 3 раза быстрее в роли Babel-плагина», а сама логика преобразования — «примерно в 10 раз быстрее» (автор отмечает, что цифры ещё надо проверить). Главное успокоение — про корректность: «Все 1 725 фикстур проходят при сравнении сгенерированного кода с TypeScript-версией», причём снапшоты совпадают после каждого прохода компилятора.

Архитектуру сохранили от TS-версии: исходник превращается в промежуточное представление (HIR) поверх графа потока управления в форме единственного статического присваивания (SSA). Примечательное решение — публичная граница: порт использует «Rust-представление Babel AST в качестве нашего „публичного API“», с конвертерами в Babel, OXC и SWC и обратно.

«Просто работает» — отзывы из прода

Тред ответил на тихое сомнение — а кто-нибудь вообще пользуется компилятором? — голосами тех, кто гоняет его уже год:

«Мы используем React Compiler в проде на крупном ecom/медиа-сайте около года… за это время не натыкались ни на один серьёзный баг, который можно было бы ему приписать». — paavohtl

«Все useMemo и useCallback можно удалить — и получить ту же производительность в рантайме, а то и лучше, ценой лишь небольшого роста размера кода». — molf

Один инженер назвал конкретный продукт и результат: «Мы начали использовать его на unifi.ui.com, и прирост производительности рендера оказался огромным».

Спор о дизайне: зачем оставлять AST от Babel?

Самая содержательная критика поставила под сомнение весь выбор публичного API: если уж платишь за переход на нативный код, зачем привязываться к парсеру из эпохи JavaScript?

«Зачем они портируют бейбелизмы? Им стоило бы напрямую использовать инструментарий Oxc… разве не в том смысл порта на Rust, что можно использовать быстрый нативный код? Странно, что они замораживают Babel AST в контракт совместимости». — LoganDark

Ответ пришёл от пользователя из прода, процитировавшего логику самого PR: Oxc — лишь один потребитель из нескольких, а преобразование в HIR можно поддерживать только в одном экземпляре:

«OXC не единственный потребитель, так что использовать AST от OXC особого смысла нет… „мы сошлись на Babel-подобном AST как публичном API… пока что мы требуем, чтобы данные областей видимости сериализовались“». — molf

Честная оговорка и зачем вообще переписали

Это не панацея: одна команда откатила компилятор, потому что «он несовместим с mobx, а на существующей кодовой базе мы не заметили прироста». И это верная настройка ожиданий: выигрыш реален на приложениях с тяжёлым рендером и отсутствует на остальных. Стратегический смысл порта на Rust — в зависимостях, а не только в скорости: отказ от требования Babel убирает самую медленную и тяжёлую часть сборки — именно то трение, из-за которого компилятор по умолчанию оставался выключенным. Как сказал один пользователь, причина, по которой о нём мало слышно, в том, что «он просто работает».

Получайте такие разборы каждый день

Главные истории Hacker News — на email, в Telegram или RSS.

Следующая новость · 7 из 22 Читать дальше
🚀Tech

Claude Desktop при запуске тихо поднимает VM на 1,8 ГБ — и выключить её нельзя

Открываешь приложение, чтобы отправить одно сообщение, а оно запускает виртуальную машину Hyper-V. Пользователи жалуются: песочница Cowork съедает 12 ГБ диска, хотя её никто не включал и удалить нельзя. Компания, которая продаёт качество, выпустила поделку.

★ 348 · 💬 243 · github.com · 3 мин