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До встречи в следующем видео!
Community Posts
No posts yet. Be the first to write about this video!
Write about this video