React Compiler переписывают на Rust — в 10 раз быстрее, но AST остаётся от Babel
Команда React влила полный порт компилятора на Rust: примерно в 3 раза быстрее в роли Babel-плагина и в 10 раз быстрее на самом преобразовании, при этом все 1 725 фикстур проходят. Неожиданный выбор: публичным API по-прежнему служит AST от Babel.
Пришли пользователи из прода и подтвердили: сам компилятор тихо работает уже год — useMemo и useCallback убраны, производительность выросла.
Самый острый вопрос: зачем замораживать Babel AST как контракт вместо нативного Oxc? Мейнтейнеры ответили — Oxc не единственный потребитель.
Что влили и какие цифры
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.
Claude Desktop при запуске тихо поднимает VM на 1,8 ГБ — и выключить её нельзя
Открываешь приложение, чтобы отправить одно сообщение, а оно запускает виртуальную машину Hyper-V. Пользователи жалуются: песочница Cowork съедает 12 ГБ диска, хотя её никто не включал и удалить нельзя. Компания, которая продаёт качество, выпустила поделку.