Интеграция Rolldown
Vite планирует интегрировать Rolldown — JavaScript-бандлер на Rust, чтобы улучшить производительность сборки и расширить возможности.
Что такое Rolldown?
Rolldown — это современный высокопроизводительный JavaScript-бандлер, написанный на Rust. Он разработан как замена Rollup с сохранением совместимости, но с существенным приростом производительности.
Ключевые принципы Rolldown:
- Скорость: Реализация на Rust для максимальной производительности
- Совместимость: Работает с существующими плагинами Rollup
- Оптимизация: включает функции, выходящие за рамки возможностей esbuild и Rollup
Почему Vite переходит на Rolldown
Унификация: Сейчас Vite использует esbuild для предварительной сборки зависимостей и Rollup для продакшн-сборки. Rolldown объединит эти процессы в один высокопроизводительный инструмент, упрощая архитектуру.
Производительность: Реализация на Rust дает значительный прирост скорости по сравнению с JavaScript-решениями. Хотя конкретные показатели зависят от проекта, первые тесты показывают впечатляющие результаты.
Дополнительные возможности: Rolldown предоставляет функции, недоступные в Rollup или esbuild, такие как расширенный контроль разделения чанков, встроенный HMR (горячая замена модулей) и плагин Module Federation.
Подробнее о причинах создания Rolldown можно узнать в официальной документации.
Преимущества тестирования rolldown-vite
- Более быстрая сборка, особенно для крупных проектов
- Улучшение будущей интеграции Rolldown в Vite, благодаря обратной связи
- Подготовка своих проектов к официальному переходу на Rolldown
Как попробовать Rolldown
Версия Vite на базе Rolldown доступна в виде отдельного пакета rolldown-vite
. Для тестирования добавьте переопределения в ваш package.json
:
{
"overrides": {
"vite": "npm:rolldown-vite@latest"
}
}
{
"resolutions": {
"vite": "npm:rolldown-vite@latest"
}
}
{
"pnpm": {
"overrides": {
"vite": "npm:rolldown-vite@latest"
}
}
}
{
"overrides": {
"vite": "npm:rolldown-vite@latest"
}
}
После добавления переопределений переустановите зависимости и запускайте сервер разработки или сборку проекта как обычно. Дополнительные изменения конфигурации не требуются.
Известные ограничения
Хотя Rolldown стремится быть полной заменой Rollup, некоторые функции всё ещё находятся в разработке, а также есть небольшие преднамеренные различия в поведении. Полный список можно найти в этом PR на GitHub, который регулярно обновляется.
Ошибки валидации опций
Rolldown выбрасывает ошибку при передаче неизвестных или некорректных опций. Поскольку некоторые опции, доступные в Rollup, не поддерживаются Rolldown, вы можете столкнуться с ошибками в зависимости от опций, которые вы или используемый мета-фреймворк задали. Ниже приведён пример такого сообщения об ошибке:
Error: Failed validate input options.
- For the "preserveEntrySignatures". Invalid key: Expected never but received "preserveEntrySignatures".
Если вы не передаёте эту опцию самостоятельно, проблема должна быть исправлена в используемом фреймворке. Временно можно отключить эту ошибку, установив переменную окружения ROLLDOWN_OPTIONS_VALIDATION=loose
.
Подключение нативных плагинов
Благодаря Rolldown и Oxc многие внутренние плагины Vite (например, для алиасов или резолвинга модулей) были переписаны на Rust. На момент написания документации эти плагины по умолчанию отключены, так как их поведение может отличаться от JavaScript-версий.
Для тестирования можно активировать их, установив опцию experimental.enableNativePlugin
в true
в конфигурации Vite.
Сообщение о проблемах
Поскольку это экспериментальная интеграция, вы можете столкнуться с проблемами. Если это произошло, пожалуйста, сообщайте о них в репозитории vitejs/rolldown-vite
, а не в основном репозитории Vite.
При сообщении о проблемах пожалуйста, следуйте соответствующему шаблону issue и укажите запрашиваемую информацию, которая обычно включает:
- Минимальный пример для воспроизведения проблемы
- Данные о вашем окружении (ОС, версия Node, пакетный менеджер)
- Соответствующие сообщения об ошибках или логи
Для оперативного обсуждения и решения проблем присоединяйтесь к Discord Rolldown.
Планы на будущее
Пакет rolldown-vite
— это временное решение для сбора отзывов и стабилизации интеграции Rolldown. В будущем эта функциональность будет перенесена в основной репозиторий Vite.
Мы призываем вас опробовать rolldown-vite
и внести вклад в его развитие через отзывы и сообщения о проблемах.
В будущем мы также представим «режим полной сборки» (Full Bundle Mode) для Vite, который будет обслуживать собранные файлы как в продакшене, так и в режиме разработки.
Зачем нужен режим полной сборки?
Vite известен своим подходом к серверу разработки без сборки (unbundled), что стало одной из основных причин его скорости и популярности при первом выпуске. Изначально этот подход был экспериментом, чтобы проверить, насколько можно повысить производительность сервера разработки без традиционной сборки.
Однако по мере роста масштабов и сложности проектов возникли две основные проблемы:
Несоответствие между разработкой и продакшеном: JavaScript без сборки в разработке и собранный пакет в продакшене ведут себя по-разному. Это может приводить к ошибкам, которые проявляются только в продакшене, усложняя отладку.
Снижение производительности в режиме разработки: Подход без сборки приводит к раздельной загрузке каждого модуля, что создаёт большое количество сетевых запросов. Хотя это не влияет на продакшен, это вызывает значительные накладные расходы при запуске сервера разработки и обновлении страницы в процессе разработки. Особенно заметно это проявляется в крупных приложениях, где необходимо обрабатывать сотни или даже тысячи отдельных запросов. Эти узкие места становятся ещё более серьёзными при использовании сетевых прокси, что приводит к увеличению времени перезагрузки и ухудшению опыта разработчиков.
Благодаря интеграции с Rolldown у нас появилась возможность унифицировать процесс разработки и продакшена, сохраняя при этом фирменную производительность Vite. Режим полной сборки позволит использовать собранные файлы не только в продакшене, но и во время разработки, сочетая преимущества обоих подходов:
- Быстрый запуск даже для крупных приложений
- Единообразное поведение в разработке и продакшене
- Снижение сетевой нагрузки при обновлении страниц
- Сохранение эффективного HMR поверх ESM-вывода
Изначально режим полной сборки будет доступен как опциональная функция. Как и в случае с интеграцией Rolldown, мы планируем сделать его режимом по умолчанию после сбора отзывов и достижения необходимой стабильности работы.
Руководство для авторов плагинов и фреймворков
СОВЕТ
Данный раздел в первую очередь будет полезен разработчикам плагинов и создателям фреймворков. Обычным пользователям можно смело пропустить эту часть.
Обзор ключевых изменений
- Для сборки теперь используется Rolldown (ранее использовался Rollup)
- Для оптимизации теперь используется Rolldown (ранее использовался esbuild)
- Поддержка CommonJS теперь обрабатывается Rolldown (ранее использовался @rollup/plugin-commonjs)
- Для понижения синтаксиса теперь используется Oxc (ранее использовался esbuild)
- Для минификации CSS по умолчанию используется Lightning CSS (ранее использовался esbuild)
- Для минификации JS по умолчанию теперь используется Oxc minifier (ранее использовался esbuild)
- Для сборки конфигурации теперь используется Rolldown (ранее использовался esbuild)
Определение rolldown-vite
ПРЕДУПРЕЖДЕНИЕ
В большинстве случаев вам не нужно определять, работает ли ваш плагин с rolldown-vite
или обычным vite
. Следует стремиться к одинаковому поведению в обеих средах без условных ветвлений.
Если вам всё же требуется разное поведение для rolldown-vite
, есть два способа его определить:
Проверка существования this.meta.rolldownVersion
:
const plugin = {
resolveId() {
if (this.meta.rolldownVersion) {
// логика для rolldown-vite
} else {
// логика для rollup-vite
}
},
}
Проверка существования экспорта rolldownVersion
:
import * as vite from 'vite'
if (vite.rolldownVersion) {
// логика для rolldown-vite
} else {
// логика для rollup-vite
}
Если у вас есть vite
в зависимостях (не peer dependency), экспорт rolldownVersion
полезен, так как его можно использовать из любого места вашего кода.
Игнорирование проверки опций в Rolldown
Как уже упоминалось выше, Rolldown выбрасывает ошибку при передаче неизвестных или некорректных опций.
Эту проблему можно решить, условно передавая опцию после проверки, что код выполняется с rolldown-vite
, как показано выше.
Хотя подавление ошибки через установку переменной окружения ROLLDOWN_OPTIONS_VALIDATION=loose
работает в данном случае, вам в конечном итоге всё равно потребуется прекратить передачу неподдерживаемых Rolldown опций.
transformWithEsbuild
требует отдельной установки esbuild
Аналогичная функция transformWithOxc
, использующая Oxc вместо esbuild
, экспортируется из rolldown-vite
.
Слой совместимости для опций esbuild
Rolldown-Vite включает слой совместимости, преобразующий опции esbuild
в соответствующие опции Oxc или rolldown
. Как протестировано в ecosystem-ci, это работает во многих случаях, включая простые плагины esbuild
.
Однако важно отметить, что поддержка опций esbuild
будет удалена в будущем. Мы рекомендуем использовать соответствующие опции Oxc или rolldown
.
Вы можете получить опции, установленные слоем совместимости, через хук configResolved
.
const plugin = {
name: 'log-config',
configResolved(config) {
console.log('options', config.optimizeDeps, config.oxc)
},
},
Фильтрация хуков
Rolldown представил функцию фильтрации хуков для уменьшения накладных расходов на взаимодействие между средами выполнения Rust и JavaScript. Использование этой функции позволяет повысить производительность вашего плагина.
Эта возможность также поддерживается в Rollup 4.38.0+ и Vite 6.3.0+. Для обеспечения обратной совместимости вашего плагина со старыми версиями убедитесь, что фильтрация также выполняется внутри обработчиков хуков.
Преобразование контента в JavaScript в хуках load
или transform
Если вы преобразуете контент других типов в JavaScript в хуках load
или transform
, возможно, потребуется добавить moduleType: 'js'
к возвращаемому значению.
const plugin = {
name: 'txt-loader',
load(id) {
if (id.endsWith('.txt')) {
const content = fs.readFile(id, 'utf-8')
return {
code: `export default ${JSON.stringify(content)}`,
moduleType: 'js',
}
}
},
}
Это связано с тем, что Rolldown поддерживает модули, отличные от JavaScript, и определяет тип модуля по расширению файла, если он не указан явно.
Обратите внимание, что rolldown-vite
не поддерживает ModuleTypes в режиме разработки (dev).