Галоўная / Артыкулы

Vite 8 з’еднаў своіх пакетавальніків у Rolldown — што зламалося

Vite 8 парадыгмальна падтрымлівае рэжым Rolldown для разработкі і працы ў продакшэне. Існуюць проблемы з супрацоўкай з практычным CJS, адзінакавасці пад час міграцыі частак, а таксама безпечны спіс пераканальненняя пры тым, калі жадаеце даваць пазітывны рэзультат CI.

Выдавец: REACTAPP.TOP6 хв чытання1296 слоў

Крыніцы: Vite Merged Its Two Bundlers Into One. Here’s Everything That Broke.

Працюючы гадзіны, 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 без прымэннага пакета, завантажанага браузерам, — гэта правы падход.

Што напісаць у тыкеце на міграцыю

Запісуйце павышэння як інжынерскія змены з крытэрамі адзначкі, а не як падвышэння залежнасцяў.

Прапанованыя крытэрыі:

  1. Працэс стварэння прымэннай версіі завершаецца пад Rolldown з тымі ж публічнымі рэсурсамі, якія вы чакаеце.
  • Крытычныя траекторыі вікорыстоўвання працуюць у рэальным браузеры на адпрацоўаным пакеце (не толькі за дапамогай тэстаў на адзелы).
  • Вядомыя гібрыдныя залежнасці CJS альіююцца, апгрэйдуюцца або пакрываюцца параметрам legacy.inconsistentCjsInterop з вказаным власнікам і тэрміном выкарыстання.
  • Стратэгія чакання явна пераглядаецца: або прыймаюцься стандартныя настройкі Rolldown пасля вылічэння колькісці запытанняў, або параметр manualChunks пераключаецца на advancedChunks з адпаведным тэстам.
  • Сераўысы, якія не можуць завантажыць натыўныя біндынгі (на прыклад, дзеяныя хосты WebContainer), маюць задокументаваныя рашэння або альтэрнатывы.
  • Калі які-небудзь крэтарыя не паспелі, трэба застацца на Vite 7 або на rolldown-vite пакуль яны не будуць выпанаваны. Выпуск быстрэйшага пакетніка, які нарабляе проблемы ў продакшэне, не ўлучае ў павышэння працоўных характарыстыкаў.

    Чаму багі парапаты здаюцца персональнымі

    Распрацоўшчыкі павераюцца локальным серверам. Калі локальны сервер і продакшн-версія перастаюць суперсваяцца между сабой, багі, які раней хаваліся ў этых суперсваяннях, праказваюцца ў адным месцы. Гэта можа здацца так, нібы проблемы «з’явіліся» внаследаке тэхнікі Rolldown, якая раней маскавала проблемы, якія завжды існавалі ў неодназначнасцях CJS чыраў графаў. Названне такога патэрану зменшвае паніку: вы не пераследжуеце віпадковыя рэгрэсіі; вы проста адкрываеце слабыя месцы, якія эра двойных двайнэў прыкрывала.

    Зберагаюце ціфры, якія паказваюць швальнасць. Зберагаюце дызайн з адным двайнэм. Толькі не плутайце зеленую сукупнасць показнікаў з доказам таго, што створаны продукт працуе.