Vite 8 з’еднаў своіх пакетавальніків у Rolldown — што зламалося
Vite 8 парадыгмальна падтрымлівае режым Rolldown для разработкі і працы ў продакшэне. Існуюць проблемы зі супрацоўкай з практычным CJS, адзінакавасці пад час міграцыі частак, а таксама безпечны список пераканальненняя пры тым, калі жадаеце даваць пазитывны рэзультат CI.
Працюючы гадзіны, Vite таямніча працаваў з двума разнымі інструментамі для пакетавання — адним пад час розрабатвання, іншым пад час выклікання продукту. Rolldown заканчывае гэты розлік. Прырост скорасці ёсць рэальным, а таксонамія проблем таксама.
Багато команд знае сімптамы, але не называе прычыну: локальны сервер показвае статус «зелены», продакшн — «чырвоны», і прычына не ў опечатцы. Сервіс, які выдаваў модулі пад час розрабатвання, і інструментарыя, якіе пакетавалі ўсё для продакшну, не пагодзіліся ў адным спецыяльным кейсе. У Vite гэты неспакоў быў структурным: esbuild перетвараў код пад час розрабатвання, Rollup ствараў версію для продакшну, і ўсё гэта было настолькі добра сумешана, што розлік заставался непазначальным — пакуль гэта не сталося.
Vite 8 заканчывае гэты розлік за дапамогою аднаго інструмента на базе Rust — Rolldown. Результаты тэстаў вельмі хорашыя, як і спіс прыложэнняў, якія зламаліся, калі гадзіны роботы двух інструментаў раптам не мелі куды сховацца. Як толькі вы знаеце обе стороны, вы можетэ апдейтаваць без неспакойных ситуацый.
Што змянілася ў Vite 8
Ідея двах двыжакоў была рашыдліва ў 2020 годзе. Стварэнне новага інструмента для пакетавання з нуля — це багаторычная праца. esbuild вже швытаўся да розвітку, а Rollup вялі ў сабе екосыстэму плагінамоў. Їх саюз быў прагматычны. Але гэта таксама створыла трывалы рызык: два інструмента, якія чытаюць тыя ж выхадныя данні по-рознаму, особліва ў чысці взаімадзеяння з CommonJS — незграбны мост між модулямі require() і сучасным ESM.
Rolldown — цэлая структура, якая рашае гэтую проблему ў аднам двыжаку. Реалізацыя на Rust, API плагінамоў у стылі Rollup (большасць плагінамоў продовжае працаваць), стабільная версія 1.0 7 мая 2026 года з зафіксаваным API, прызначаным для практычнага викорыстання. Сам Vite 8 стабілізаваўся 12 марца 2026 года і зробіў Rolldown стандартным варыянтом без можлівасці выбору. Прэтварэння та мініфікацыя, якія раней відбываліся за дапамогою esbuild, тепер відбываюцца за дапамогою Oxc — ўсё тады ж інструмента на Rust ад VoidZero (той самы організацыйны коллектыў, які стоіць за Rolldown).
Загаловак: версіі для працы можу запускаться на 10–30 разоў быстрэй, чым класычны Rollup. Режым разработкі — гэта менш выражаны эфект. “Режым цэлага пакета” упаковвае аплікацыю ў режыме разработкі так сама, як і для працы, замест таго, каб служыць неапранутымі файламі ESM. Пачатковыя даны паказваюць прыблізна 3 разы быстрэйшы старт, ~40% быстрэйшыя повныя перзагрузкі та прыблізна у 10 разоў меншыя запиты да сеті. Большыя базы коду вже перасталі падходзіць для неупакованага ESM у режыме разработкі; гэта закрывае гэты прыемак.
Структурныя перавагі простыя: аднолькі двайчорак для обох режымаў. Старыя багі типу “інтероперабельнасць у режыме разработкі ≠ інтероперабельнасць у режыме працы” становяцца немагчымымі, таму што больш няма другога інструменту для пакетавання, з якім можна было б не пагадзіцца.
Што на самай працы зламалася
Міграцыя не была безкоштовная, і адмахванне ад гэтага нікому, хто плануе апгрэйд, не дапамагае.
Жорсткейшыя правілы взаімадзеяння CommonJS спанулілі пакеты. Неясныя экспорты CJS адрабатваюцца інакш, чым у старой пары esbuild+Rollup. Без module.exports.__esModule і без атрыбута default Rolldown можа прыўязваць імпорт да всіго об’екта module.exports, замест таго каб, як робіла болей прагледна стака, западзячыць значэнне за замовчанням:
// This used to just work under Vite 7 (esbuild + Rollup)
import DOMPurify from 'dompurify';
DOMPurify.sanitize(input);
// Under Rolldown's stricter CJS interop, this can throw:
// TypeError: e is not a function
// because the import resolved to the whole exports object,
// not the function you expected
Апакоўжны атрыбут гэтага класу: CI зазвычай яго не фіксуе. jsdom чы сім’і для мокавання рэдка калі запускаюць рэальны продакшн-файл. Адказы з’яўляюцца, калі браузер завантажае готавы выход. Параметр legacy.inconsistentCjsInterop: true у Vite вярнаўляе старае, болей прагледнае поваджэнне, пакуль вы шукаеце прычыну проблемы.
manualChunks ўстарэўшы для advancedChunks. Ён не заменяецца простым пошукам і заменай. Команды сталкнуліся з падазрам ReferenceError: Cannot access 'x' before initialization чынамен тым, што пасля перагрупавання чакетаў выступалі побачны эфекты, і прынеймна адна занотка описвала 575 чакетаў пад стандартным спосабам Rolldown чакетавання пры ручной наладзе.
// Old, now-deprecated approach
build: {
rollupOptions: {
output: {
manualChunks: {
vendor: ['react', 'react-dom'],
},
},
},
}
// Rolldown's replacement - more powerful, but a real migration
build: {
rolldownOptions: {
output: {
advancedChunks: {
groups: [
{ name: 'vendor', test: /node_modules/, priority: 100 },
],
},
},
},
}
Запісаны прыклад: пакет Cloudflare’s @cloudflare/style-provider (гібрыдны ESM+CJS) патрапіў у стан, калі выйшла падазра createRenderer is not a function, таму што Rolldown выдала анонімны, недоступны ініцыялайзер для часткі CJS. Патч перенёс аляскі пакета на яго вхід у конфігурацыі Vite — звычны CJS через інтэроперабельнасць Rolldown працаваў нормальна; гібрыдны формат — неяк.
За межамі коду прыложэння: натыўныя біндынгі Rust у Rolldown не маглі быць завантажаныя ў StackBlitz WebContainers, што выключала багато шаблонаў для тэставання ў прыгледачах, пакуль проекты не перайшлі на Vite 7, паказваючы тым часам проблему разработчыкам.
Спіс пераканальных крокаў для безбеднай міграцыі
Команды, якія завершылі міграцыю, фокусуюцца на конкрэтных деталях, а не проста на “апдэйты і надзея”.
Загадковыя багі типу “Vite 7 працавае, Vite 8 не працуе”: спачатку прабуйце experimental: { enableNativePlugin: false }. Натыўныя плагіні Rust тепер є стандартам; іх выключэнне дапамагае паспеліць з большай часткай незрозумелых працэсных аберанцэй.
Перад развяртаннем завантажыце рэальны пакет для працы ў рэальным прыгледачы. jsdom не зможа выявіць класы для взаімадзеяння CJS, якщо толькі не запусціце створаны файл.
Рассматрывайце змену з manualChunks на advancedChunks як справжні проект з адным сваім тэстам. Багі, стосаваныя порядку чакунков, здаюцца нормальнымі, пакуль не будзе запусканы конкрэтны маршрут.
Зменшыце рызыкі за дапамою rolldown-vite (Vite 7 + прэвю Rolldown) для вашай базы коду перш чым здаброўваць яе на Vite 8.
Якщо калькольны элемент не гатовы для Rolldown, застаўка на Vite 7 для такога будавання ёсць правільным выборам — гэта краща, чым ствараць нестабільныя рашэнні пад тайм-контролем.
Каму можа быць клопатна
Стандартныя залежнасці ESM і лёгкае/стандартнае разбіянне на чакі: апгрэйды зазвычай праходзяць гладка, і сама парнасць вартая ўвагі. Адзінственныя manualChunks, гібрыдныя пакеты CJS/ESM або нестандартныя хосты (сандбоксы браузераў, WebContainers): планаваце час міграцыі і тэставайце продукт у браузеры. Такія неудачы праходзяць пераканальнае тэставанне і праказуюцяся толькі для рэальных корыстнікаў у рэальных пакетах.
Большая наука
Калі два системы, які ранейш часткова перакрывалі аспекты іншай, з’едынаюцца ў одну, раней невидны швы выяўляюцца адразу. Гэта не значыць, што аб’еднанне было неправым. Равенасць версій разработчыкскай та прымэнной сістэм — гэта справжня структурная павышэння, а показателі швальбы застаюцца на высокам. Гэта означае, што фразы «мы усунулі розбіжнасці» та «падчас переходу з’явіцца хвіля спецыфічных, можна знайсці багоў» — гэта адно і тое ж явішча, проста на разныя даты. Скептыцизм ўжо да Rolldown — гэта неправы падход; скептыцизм ўжо да зеленага CI без прымэннага пакета, завантажанага браузерам, — гэта правы падход.
Што напісаць у тыкете на міграцыю
Запісуйце павышэння як інжынерскія змены з критэрамі адзначкі, а не як падвышэння залежнасцяў.
Прапанованыя критэрыі:
- Процес стварэння прымэннай версіі завершаецца пад Rolldown з тымі ж публічнымі ресурсамі, якія вы чакаеце.
legacy.inconsistentCjsInterop з вказаным власнікам і тэрміном выкарыстання.manualChunks пераключаецца на advancedChunks з адпаведным тэстам.Якщо які-небудзь крэтарыя не паспелі, трэба застацца на Vite 7 або на rolldown-vite пакуль яны не будуць выпанаваны. Выпуск быстрэйшага пакетніка, який нарабляе проблемы ў продакшэне, не ўлучае ў павышэння працоўных характарыстыкаў.
Чаму багі парапаты здаюцца персональнымі
Разработчыкі паверяюцца локальным серверам. Калі локальны сервер і продакшн-версія перестаюць суперсваяцца между сабой, багі, які раней хаваліся ў этых суперсваяннях, праказваюцца ў адным месцы. Гэта можа здацца так, нібы проблемы «з’явіліся» внаследаке тэхніки Rolldown, якая раней маскавала проблемы, якія завжды існавалі ў неодназначнасцях CJS чыраў графаў. Названне такога патэрану зменшвае паніку: вы не пераследжуеце випадковыя регрэсіі; вы проста адкрываете слабыя месцы, якія эра двойных двайнэў прыкрывала.
Зберагаюце ціфры, якія паказваюць швальнасць. Зберагаюце дизайн з адным двайнэм. Толькі не плутайце зеленую сукупнасць показнікаў з доказам таго, што створаны продукт працуе.