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

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

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

1296 слоў

Працюючы гадзіны, 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 чыраў графаў. Названне такога патэрану зменшвае паніку: вы не пераследжуеце випадковыя регрэсіі; вы проста адкрываете слабыя месцы, якія эра двойных двайнэў прыкрывала.

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