Перейти к содержимому

Webpack: Обзор

Webpack — это один из самых мощных и гибких инструментов в современном фронтенд-разработке. Это статический сборщик модулей (module bundler), который принимает ваш исходный код с множеством файлов и зависимостей и преобразует его в оптимизированные бандлы для браузера.

В современном JavaScript-проекте у вас могут быть сотни и тысячи модулей: компоненты React, утилиты, стили, изображения, шрифты. Браузер не умеет эффективно работать с тысячами отдельных HTTP-запросов. Бандлинг — это процесс объединения всех этих модулей в один или несколько файлов (бандлов), которые браузер может загрузить быстро.

src/
index.js ──imports──▶ App.js ──imports──▶ Button.js
──imports──▶ utils.js
──imports──▶ styles.css
──imports──▶ logo.png
dist/
bundle.js (всё объединено и оптимизировано)
styles.css
assets/logo.abc123.png

Webpack появился в 2012 году и долгое время был стандартом де-факто. Сегодня существуют альтернативы:

ИнструментОснован наОсобенности
Webpack 5Node.jsМаксимальная гибкость, огромная экосистема
ViteRollup + ESBuildБыстрый dev-сервер, HMR
ParcelRustZero-config
RollupNode.jsИдеален для библиотек
ESBuildGoЭкстремально быстрый

Webpack — правильный выбор когда:

  • Вы работаете с крупным enterprise-проектом с комплексными требованиями к сборке
  • Нужна Module Federation для микрофронтендов
  • Проект использует legacy конфигурации и плагины
  • Требуются сложные кастомные loader’ы
  • Вы поддерживаете существующий проект на Webpack
Entry → Dependency Graph → Loaders → Plugins → Output
  1. Entry — точка входа, с которой Webpack начинает строить граф зависимостей
  2. Output — куда и как записывать готовые бандлы
  3. Loaders — трансформируют файлы (TypeScript→JS, SASS→CSS и т.д.)
  4. Plugins — расширяют возможности (HTML генерация, оптимизация, анализ)
  5. Modedevelopment или production включают разные оптимизации
Окно терминала
npm init -y
npm install --save-dev webpack webpack-cli
# Запуск с конфигом
npx webpack --config webpack.config.js

Минимальный webpack.config.js:

const path = require('path');
module.exports = {
entry: './src/index.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'bundle.js',
},
mode: 'production',
};

Ниже интерактивная демонстрация того, как Webpack объединяет модули в бандлы. Нажимайте на модули, чтобы увидеть граф зависимостей и итоговые бандлы.