Lovable переписала Vite на Rust… (почти)

BBetter Stack
Computing/SoftwareSmall Business/StartupsInternet Technology

Transcript

00:00:00Можете прибавить единицу к счётчику переписанного на Rust, на этот раз сервером
00:00:03разработки Vite, который был переписан командами из Lovable, и якобы потребляет
00:00:07в 4 раза меньше памяти и запускается на холодную в 2 раза быстрее. Давайте проверим
00:00:12это заявление, так как оно может слегка вводить в заблуждение, и решим, стоит ли
00:00:15переходить на это в будущем, а также узнаем мнение создателя Vite о будущем open source.
00:00:24Проект, о котором идет речь, называется OJ (Orange Juice). Его идея в том, что это один
00:00:29бинарник на Rust, который можно натравить на существующий Vite-проект, и он просто работает. Он читает
00:00:33конфиг Vite, запускает текущие плагины, но под капотом dev-сервер — то есть отслеживание
00:00:38файлов, граф модулей, HMR и React Fast Refresh — полностью переписаны на Rust.
00:00:44Как ни странно, это сделано с помощью Rolldown и Oxc, которые использует и сам Vite, а разрабатывает
00:00:49их VoidZero. Чтобы протестировать всё лично, я собрал приложение на TanStack, чтобы проверить разницу
00:00:53между запуском через Vite dev и OJ dev. На первый взгляд, работают они почти одинаково:
00:00:58SSR, гидратация, серверные функции, Fast Refresh,
00:01:03динамический роутинг файлов, серверные роуты, Tailwind и импорт ассетов. Но если копнуть глубже,
00:01:07я заметил пару мелких различий. Первое — это Fast Refresh. Если отредактировать файл,
00:01:13счётчик у Vite сохраняет состояние, а под OJ счётчик сбрасывается в ноль,
00:01:17что указывает на то, что OJ делает полную перезагрузку вместо обновления изменившегося компонента. Я решил
00:01:22проверить это же поведение на обычном React-приложении без TanStack Start,
00:01:26и, что интересно, здесь всё сработало. То же редактирование сохраняет счётчик,
00:01:30страница целиком не обновляется, то есть происходит настоящее горячее обновление. Не знаю,
00:01:35почему возникла разница между TanStack Start и чистым React-приложением, возможно, это просто
00:01:39один из граничных случаев, который ещё не учли. Второе различие, которое я заметил, было связано с
00:01:42серверной функцией. Она измеряет память всего дерева процессов dev-сервера изнутри
00:01:46приложения, и у Vite вышло около 380 МБ на два процесса, а у OJ —
00:01:53около 320 МБ также на два процесса. То есть на небольшом приложении потребление
00:01:59памяти примерно одинаковое, и OJ вырывается вперёд лишь незначительно. Значит ли это, что проект
00:02:04абсолютно бесполезен? На самом деле нет, потому что OJ создавался не для этого. OJ лучше всего
00:02:09показывает себя на очень крупных приложениях. Я протестировал его на React-приложении с 5000 компонентов,
00:02:14используя скрипт, который запускает dev-сервер, открывает страницу в реальном Chrome, останавливает таймер при
00:02:19появлении самого глубокого компонента в DOM и замеряет память дерева процессов. Обычный режим OJ
00:02:24отрисовывает страницу примерно в 1.7 раза быстрее стандартного Vite и использует вчетверо меньше
00:02:29памяти. Ради справедливости отмечу, что в Vite 8.1 появилась экспериментальная функция bundled dev mode,
00:02:34и если её включить, Vite укладывается в 1.18 секунды, что даже чуть быстрее обычного режима OJ,
00:02:40но это не спасает по памяти. У OJ тоже есть бандл-режим, который при включении
00:02:45ускоряет работу до 0.89 секунды, сохраняя потребление памяти на уровне четверти от показателей Vite.
00:02:51Так что у OJ действительно есть преимущества по памяти, и именно ради этого Lovable
00:02:55и создали этот проект. Вьюверы Lovable запускают реальный dev-сервер Vite, и, по их словам, они
00:03:00выполняют около миллиона таких песочниц в день. На таких масштабах расход ресурсов
00:03:04становится критически важным. Поэтому Lovable создали OJ, чтобы превью запускались мгновенно и экономили ресурсы,
00:03:09без необходимости отказываться от экосистемы, благодаря которой работает приложение.
00:03:13Также они приняли интересное архитектурное решение под сценарий с ИИ-агентами. При редактировании
00:03:17человек обычно сохраняет файлы по одному, но агент может записать с десяток за раз,
00:03:22и Vite обрабатывал бы каждое из этих сохранений как отдельное обновление. Но в OJ вочер,
00:03:26граф модулей, компилятор и HMR объединены в один пайплайн, поэтому пачка изменений объединяется в одно обновление.
00:03:32Кроме того, можно включить режим, при котором обновления задерживаются до тех пор, пока сам агент
00:03:35не отправит запрос на эндпоинт сброса, так что превью применяет только готовый результат. Как видите, это
00:03:40очень узкоспециализированный проект под задачи Lovable, что подтвердил и создатель Vite Эван Ю
00:03:45(Юй Юаньци). В своём твите он отметил, что это впечатляющий проект, отлично решающий задачу Lovable,
00:03:49но это не полная перезапись Vite. Это лишь dev-сервер,
00:03:54построенный поверх Rolldown и Oxc от VoidZero, так что он их едва ли заменяет.
00:04:00Парсер, трансформер и продакшн-бандлер в OJ взяты у VoidZero,
00:04:04а Lovable просто написали сервер вокруг них. По сути, Vite — это Node-процесс,
00:04:08управляющий Rust, в то время как OJ — это Rust-процесс, управляющий Rust, с прослойкой на JavaScript
00:04:13посредине для связи с API плагинов Vite. Эван также подчёркивает,
00:04:17что OJ работает быстро, потому что поддерживает только один тип приложений. OJ работает исключительно
00:04:22с React-приложениями, которые и генерирует Lovable. Vite же должен
00:04:27поддерживать любые фреймворки, специфичные конфиги и сопутствующие инструменты, намеренно оставляя
00:04:31вещи вроде esbuild или плагина для React отдельными пакетами, чтобы вы подключали их при необходимости.
00:04:36Затем он указывает на изъяны в бенчмарках. В блоге при замере холодного старта Vite
00:04:40использовался vite-plugin-checker, запускающий TypeScript в фоновом воркере, а OJ не поддерживает
00:04:45этот плагин и полностью пропускает эту работу. Он также отмечает, что в Vite с режимом bundled dev
00:04:50показатели ближе к холодному старту OJ, что совпадает с нашими тестами, но он признаёт,
00:04:55что OJ использует значительно меньше памяти, и Vite стоит к этому стремиться.
00:04:59Самым интересным мне показался финальный тезис Эвана. Динамика open source
00:05:03меняется, стоимость переписывания рухнула из-за ИИ, поэтому мы увидим больше
00:05:08того, что он называет «узкоспециализированными проекциями» open-source инструментов — когда ту же зависимость
00:05:13пересобирают под ограничения конкретного компонента. В качестве примера он приводит redact от TanStack.
00:05:19Возможное будущее в том, что вместо перегрузки мейнтейнеров тысячами узких PR,
00:05:23каждый будет поддерживать свой форк под узкую задачу. Честно говоря, он не уверен, хорошо ли это,
00:05:28но считает весьма вероятным такой сценарий через пару лет. С одной стороны, узкие форки предпочтительнее
00:05:33для авторов, чем куча PR, но с другой — мы рискуем получить фрагментацию экосистемы.
00:05:39Полагаю, только время покажет, как развиваются события и каким будет будущее open source.
00:05:43В целом, этот инструмент едва ли пригодится кому-то, кроме Lovable, если только вы
00:05:47не сталкиваетесь с той же проблемой запуска миллионов dev-серверов Vite в песочницах.
00:05:52Замечали ли вы когда-нибудь медлительность Vite на своём ноутбуке или избыток памяти? Я лично
00:05:57нет, но проект в любом случае крутой, и здорово, что они это сделали.
00:06:01Делитесь мнением в комментариях, подписывайтесь на канал и, как всегда,
00:06:04до встречи в следующем видео!
00:06:09До встречи в следующем видео!

Key Takeaway

Проект OJ от Lovable сокращает потребление памяти dev-сервера Vite в 4 раза на узком классе React-приложений за счет переписывания пайплайна на Rust для обслуживания миллиона ежедневных ИИ-песочниц.

Highlights

  • Проект OJ (Orange Juice) от Lovable переписывает dev-сервер Vite на Rust с использованием Rolldown и Oxc.

  • На проекте с 5000 компонентов OJ сокращает потребление памяти Vite в 4 раза и снижает время отрисовки в 1.7 раза.

  • Включение экспериментального режима bundled dev mode в Vite 8.1 ускоряет его запуск до 1.18 секунды, что сопоставимо с базовым режимом OJ.

  • OJ объединяет вочер, граф модулей, компилятор и HMR в единый пайплайн, что сгруппировывает пачку одновременных правок от ИИ-агентов в одно обновление.

  • Снижение стоимости разработки из-за ИИ приведет к созданию узкоспециализированных проекций open-source инструментов вместо генерации тысяч PR в мейнстримные репозитории.

Timeline

Суть проекта OJ и первичная проверка функциональности

  • OJ представляет собой один бинарный файл на Rust, который читает конфиг Vite и запускает текущие плагины.
  • Архитектура dev-сервера OJ базируется на Rolldown и Oxc от команды VoidZero.
  • Горячая перезагрузка (Fast Refresh) сбрасывает состояние компонентов в TanStack Start, но корректно сохраняет его в стандартном React-приложении.

Идея OJ заключается в прозрачной замене dev-сервера Vite для существующих проектов без изменения их инфраструктуры. При тестировании базовых возможностей SSR, гидратации, серверных функций, роутинга и Tailwind разница между Vite dev и OJ dev минимальна. Однако в TanStack Start обработка изменений вызывает полную перезагрузку страницы вместо локального обновления компонента.

Сравнение производительности и оптимизация под ИИ-агентов

  • На небольших приложениях потребление памяти разнится незначительно: 380 МБ у Vite против 320 МБ у OJ.
  • На крупном приложении из 5000 компонентов бандл-режим OJ показывает результат 0.89 секунды против 1.18 секунды у Vite 8.1 в bundled dev mode.
  • Единый пайплайн OJ позволяет задерживать применения обновлений до специального запроса от ИИ-агента.

OJ разрабатывался под специфический сценарий облачных песочниц Lovable, запускающих около миллиона серверов Vite ежедневно. Для обычного человека, сохраняющего файлы по одному, стандартных возможностей Vite достаточно. Однако ИИ-агенты за один шаг меняют десятки файлов, поэтому объединение вочера, графа модулей и компилятора в один процессор предотвращает каскад лишних перезапусков.

Разбор позиции Эвана Ю и трансформация open source

  • OJ является Rust-процессом, который управляет прослойкой на JavaScript для интеграции с API плагинов Vite.
  • Замеры холодного старта Vite в блоге Lovable были некорректными из-за использования плагина vite-plugin-checker, который OJ просто игнорирует.
  • Падение стоимости переписывания кода под воздействием ИИ приведет к появлению узкоспециализированных форков под задачи отдельных команд.

Создатель Vite Эван Ю отмечал, что OJ является не полноценной заменой Vite, а узкоспециализированной оберткой вокруг компонентов VoidZero для работы исключительно с React. Vite вынужден поддерживать любые фреймворки и экосистемы, сохраняя модульность. В условиях снижения затрат на написание кода авторам библиотек станет проще поддерживать частные узкие проекции проектов вроде redact от TanStack, чем обрабатывать бесконечные PR от сообщества.

Community Posts

No posts yet. Be the first to write about this video!

Write about this video