Webpack — потужний бандлер з відкритим кодом, який став стандартом де-факто для збирання JavaScript-застосунків. Він приймає модулі із залежностями та генерує статичні ресурси, оптимізовані для браузера або іншого середовища виконання. За даними Webpack Documentation (2026), екосистема налічує понад 15 тисяч лоадерів і плагінів для будь-яких завдань збирання.
Головне
Webpack — це бандлер модулів, який аналізує залежності застосунку та пакує їх у статичні файли для браузера або сервера. Створений Тобіасом Копперсом у 2012 році, Webpack швидко став стандартом збирання завдяки концепції всі файли — модулі: JavaScript, CSS, зображення, шрифти і навіть HTML обробляються через єдину систему лоадерів.
Webpack запропонував революційну для свого часу ідею: завантажувачі (loaders) дозволяють підключати будь-які ресурси через import або require. Це позбавило розробників необхідності використовувати окремі інструменти для CSS-препроцесорів (SCSS), компіляторів TypeScript та оптимізаторів зображень. До 2020 року Webpack використовували понад 80% JavaScript-проєктів (дані npm stat: 2019–2024).
Конкуренти — Vite, Parcel і Turbopack — пропонують вищу швидкість розробки, але Webpack зберігає лідерство в enterprise-сегменті завдяки стабільності, зрілій екосистемі та зворотній сумісності. Міграція з Webpack на Vite у великих проєктах займає тижні й часто блокується несумісністю плагінів.
Webpack будує граф залежностей, починаючи з точки входу. Кожен знайдений import або require додається до графа, проходить через ланцюжок лоадерів і поміщається в чанк. Фінальний вивід залежить від конфігурації: один бандл, декілька чанків або бібліотечний вивід у форматах UMD, CommonJS або ES Module.
// Мінімальна конфігурація Webpack 5
const path = require('path');
module.exports = {
mode: 'production',
entry: './src/index.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: '[name].[contenthash:8].js',
clean: true,
},
module: {
rules: [
{ test: /\.ts$/, use: 'ts-loader', exclude: /node_modules/ },
],
},
optimization: {
splitChunks: {
chunks: 'all',
cacheGroups: { vendor: { test: /[\\/]node_modules[\\/]/, filename: 'vendor.[contenthash:8].js' } },
},
},
};
Webpack 5 представив вбудований кеш на основі файлової системи, який прискорює повторні збирання в 2–5 разів. Persistent caching зберігає результати трансформації модулів між запусками, що особливо важливо в CI/CD. Для ввімкнення достатньо додати cache: { type: 'filesystem' } у конфігурацію.
Webpack оперує чотирма базовими концепціями: Entry (точка входу), Output (вивід), Loaders (трансформації) та Plugins (розширення). Розуміння цих концепцій необхідне для налаштування будь-якого збирання від простого сайту до складного enterprise-застосунку.
Entry — масив або об'єкт, що визначає одну або кілька точок входу. Мульти-entry використовується для багатокомпонентних застосунків. Output — налаштування вихідних файлів: шлях, шаблон імені, публічний URL. Mode — development, production або none — автоматично вмикає оптимальні плагіни та дефолтні значення для кожного режиму.
Content Hash — включення хешу вмісту в ім'я файлу ([contenthash]) забезпечує довгострокове кешування. Браузер завантажує новий файл лише при зміні його вмісту. SplitChunksPlugin автоматично виділяє спільні залежності з різних entry в окремі чанки, запобігаючи дублюванню коду.
Loaders трансформують вихідні файли перед додаванням у граф залежностей. Кожен лоадер — це функція, що приймає вміст файлу та повертає JavaScript-модуль. Plugins — потужніші розширення, що мають доступ до всього життєвого циклу збирання: від запуску до генерації вихідних файлів.
| Лоадер | Призначення | Приклад використання |
|---|---|---|
| babel-loader | Транспіляція ES6+/JSX у ES5 | React компоненти з JSX |
| ts-loader | Компіляція TypeScript у JavaScript | Angular, TypeScript-проєкти |
| css-loader | Обробка @import та url() у CSS | CSS модулі, PostCSS |
| sass-loader | Транспіляція SCSS/SASS у CSS | Bootstrap, кастомні теми |
| file-loader | Копіювання файлів в output | Зображення, шрифти |
| svg-inline-loader | Інлайнінг SVG у JavaScript | Іконки, логотипи |
Plugins, на відміну від лоадерів, можуть виконувати дії на будь-якому етапі збирання. HtmlWebpackPlugin автоматично генерує HTML-файл із підключеними скриптами. MiniCssExtractPlugin виділяє CSS в окремі файли для паралельного завантаження. DefinePlugin дозволяє передавати змінні середовища в код застосунку під час збирання.
Webpack надає вбудовані механізми оптимізації: tree shaking, code splitting та стиснення. Tree shaking видаляє невикористовуваний експорт із ES-модулів. Code splitting через import() розбиває бандл на динамічні чанки. Minimizer — TerserPlugin для JS та CssMinimizerPlugin для CSS.
// webpack.config.js — оптимізація production збірки
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');
const TerserPlugin = require('terser-webpack-plugin');
module.exports = {
optimization: {
minimize: true,
minimizer: [
new TerserPlugin({
terserOptions: { compress: { drop_console: true }, mangle: true },
}),
new CssMinimizerPlugin(),
],
runtimeChunk: 'single',
splitChunks: {
chunks: 'async',
minSize: 20000,
maxAsyncRequests: 30,
},
},
};
Module Federation — найпотужніша функція Webpack 5 для мікрофронтендів. Вона дозволяє завантажувати модулі з інших самостійних збірок у runtime. Кожен мікрозастосунок розробляється та деплоїться незалежно, але збирається в єдиний інтерфейс для користувача. Segment Analytics використовує Module Federation у production з 2021 року, скоротивши час деплою на 80%.
Webpack рідко використовується безпосередньо в React Native — для цього існує Metro. Однак Webpack застосовується в проєктах React Native Web, коли одна кодова база збирається під мобільні платформи (через Metro) та веб (через Webpack). Також Webpack популярний у гібридних застосунках на Ionic та Cordova.
Для проєктів, де React Native Web використовується для веб-рендерингу, Webpack конфігурується з аліасами, що замінюють нативні модулі на веб-реалізації. Alias react-native → react-native-web дозволяє використовувати спільні компоненти без зміни імпортів. DefinePlugin передає прапорець платформи для умовної компіляції платформо-специфічного коду.
Оптимізація Webpack для мобільного вебу відрізняється від десктопної. Mobile-first збірка включає агресивну мініфікацію, lazy loading зображень та пріоритетне завантаження критичного CSS. CompressionPlugin з brotli-стисненням зменшує розмір бандла на 20–25% для мобільних мереж 3G/4G. Використовуйте webpack-merge для розділення конфігурацій під різні платформи: mobile-first та desktop-оптимізована збірки.
Module Federation — революційна функція Webpack 5, що дозволяє завантажувати JavaScript-модулі з інших самостійних збірок без публікації в npm. Кожен мікрозастосунок розробляється незалежно, має власну конфігурацію Webpack і деплоїться окремо. Host-застосунок підключає модулі віддалених збірок через спеціальну конфігурацію плагіна ModuleFederationPlugin.
Провайдер exposes вибрані модулі, а хост використовує remotes для їх підключення. Module Federation підтримує shared-бібліотеки: якщо React використовується у двох мікрозастосунках, Webpack завантажить його лише один раз. Це дає економію трафіку до 60% для користувача. Великі компанії, включаючи Segment та Best Buy, використовують Module Federation у production, скоротивши час деплою з годин до хвилин.
При роботі з Module Federation розробники часто стикаються з конфліктами shared-залежностей різних версій. Рішення — явно вказати requiredVersion та singleton: true для критичних бібліотек. Інша проблема — втрата контексту при імпорті компонентів із віддаленої збірки, особливо з React Context та Redux. Для вирішення використовуйте shared: { react: { singleton: true } }, щоб гарантувати, що всі мікрозастосунки використовують один екземпляр React. Для великих мікрофронтендальних архітектур рекомендується використовувати зв'язку Module Federation із системою монорепозиторіїв (Nx, Turborepo) для синхронізації версій спільних залежностей та забезпечення консистентності збірок.
Часті запитання
Webpack 5 представив persistent caching (прискорення повторних збірок до 5x), вбудовану підтримку Module Federation для мікрофронтендів та автоматичний clean output. Застарілі лоадери (raw-loader, url-loader) та багато поліфілів Node.js були видалені, що зменшило розмір конфігурації в середньому на 30%.
Використовуйте webpack-cli init для генерації базової конфігурації. Для типових проєктів застосовуйте create-react-app (CRA) або Next.js, які приховують Webpack-конфігурацію. Якщо потрібен кастом — webpack-merge дозволяє розбити конфігурацію на перевикористовувані модулі для різних середовищ.
Webpack Dev Server — вбудований dev-сервер із підтримкою HMR (Hot Module Replacement). Він відстежує зміни у файлах і оновлює модулі в браузері без повного перезавантаження сторінки. Для мобільної розробки dev-сервер можна налаштувати на доступ через локальну мережу, вказавши host: '0.0.0.0' та HTTPS-сертифікат.
Webpack 5 використовує вбудовані Asset Modules для обробки зображень: asset/resource копіює файл як є, asset/inline інлайнить як base64 (для файлів менше 8KB), asset вибирає між ними автоматично на основі розміру. Для оптимізації зображень додають image-webpack-loader зі стисненням WebP та lossless-оптимізацією.
Для нових проєктів — так, Vite дає значний приріст швидкості. Для існуючих enterprise-проєктів із сотнями плагінів Webpack — міграція може зайняти 2–4 тижні. Оцініть, наскільки критичною є швидкість dev-збірки: якщо час повної збірки перевищує 5 хвилин, міграція виправдана.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також