Браузер уміє виконувати ES-модулі, тож чому не віддати йому файли як є? Тому що код, який зручно писати, і код, який швидко завантажується, - різні.
Що робить збирач під час розробки (Vite npm run dev):
- розв'язує імпорти пакетів:
import axios from 'axios'браузер не розуміє - Vite перетворює на шлях до файлу вnode_modules; - перетворює те, що браузер не вміє: TypeScript,
.vue-файли, JSX, Tailwind і PostCSS; - гаряча заміна модулів (HMR): змінили компонент - оновився лише він, без перезавантаження сторінки й зі збереженням стану;
- віддає модулі браузеру майже без обробки, тож сервер стартує за мілісекунди незалежно від розміру проєкту - у цьому головна перевага Vite над старими збирачами.
Що робить збирач для продакшену (npm run build):
- об'єднує модулі в невелику кількість файлів - сотні дрібних запитів повільніші за кілька великих;
- мініфікує: прибирає пробіли й коментарі, скорочує імена змінних;
- tree shaking: викидає код, який ніде не імпортується;
- розділення коду: спільні залежності - в окремий файл, сторінки й важкі компоненти - в окремі частини, що завантажуються за потреби;
- хешовані імена файлів (
app-3f9a1c.js): вміст змінився - змінилася назва. Тоді файли можна кешувати в браузері «назавжди», а після деплою користувачі гарантовано отримають нову версію; - маніфест - відповідність вихідних файлів і зібраних. Саме з нього директива
@vite('resources/js/app.js')у Laravel дізнається, який файл підключити.
У Laravel-проєкті:
npm run dev- сервер розробки,@viteпідключає файли з нього (адресу записано уpublic/hot);npm run build- збірка вpublic/build,@viteбере шляхи зpublic/build/manifest.json;- помилка «Unable to locate file in Vite manifest» означає, що збірку не виконано або файл не вказано в
inputконфігураціїlaravel-vite-plugin.
Альтернативи: webpack (старіший, гнучкіший, повільніший), esbuild і Rollup (на яких побудовано Vite), Rolldown (новий швидкий збирач для майбутніх версій Vite). Можна й зовсім без збирача - import maps і нативні модулі, - для невеликих проєктів без TypeScript чи .vue-файлів.