В экосистеме Webpack существует два базовых пакета:
webpackwebpack-cliНесмотря на тесную связь, они решают разные задачи и работают на разных уровнях архитектуры сборщика.
webpackПакет webpack содержит:
Именно webpack выполняет:
Без пакета webpack сама система сборки не
существует.
webpack-cliПакет webpack-cli представляет собой интерфейс командной
строки для управления ядром Webpack.
Он обеспечивает:
build, serve,
watch;webpack-cli не выполняет сборку самостоятельно. Он лишь
управляет ядром webpack.
Разделение на webpack и webpack-cli
основано на принципе разделения ответственности.
webpack отвечает за:| Область | Описание |
|---|---|
| Компиляция | Преобразование модулей |
| Dependency Graph | Построение графа зависимостей |
| Chunk System | Формирование чанков |
| Optimization | Оптимизация сборки |
| Plugin API | Подключение расширений |
| Loader Pipeline | Обработка файлов |
webpack-cli отвечает
за:| Область | Описание |
|---|---|
| Командная строка | Работа с terminal-командами |
| Аргументы | Парсинг CLI-параметров |
| Конфигурация | Загрузка webpack.config.js |
| Dev Workflow | Watch mode и dev server |
| UX | Взаимодействие с пользователем |
| Инициализация | Генерация проектов |
Исторически Webpack развивался как инструмент с большим количеством сценариев использования:
Если бы CLI был встроен непосредственно в ядро:
Разделение позволило:
Обычно оба пакета устанавливаются одновременно.
npm install webpack webpack-cli --save-dev
yarn add webpack webpack-cli -D
pnpm add webpack webpack-cli -D
webpackЕсли установить только ядро:
npm install webpack --save-dev
появится API сборщика, но команды терминала работать не будут.
Например:
npx webpack
может завершиться ошибкой:
CLI for webpack must be installed.
webpack-cli (https://github.com/webpack/webpack-cli)
Причина заключается в том, что ядро не содержит terminal-интерфейс.
webpack-cliУстановка только CLI:
npm install webpack-cli --save-dev
не имеет смысла без ядра.
CLI — лишь оболочка над webpack.
При запуске возникнет ошибка отсутствия основного компилятора.
webpack-cli с ядромПроцесс взаимодействия выглядит следующим образом.
Пользователь выполняет:
npx webpack
или:
npm run build
webpack-cliCLI:
CLI ищет:
webpack.config.js
или альтернативные варианты:
webpack.config.cjs
webpack.config.mjs
webpack.config.ts
После чтения конфигурации CLI вызывает API ядра:
const webpack = require('webpack');
const compiler = webpack(config);
На этом этапе начинается работа самого Webpack.
CLI инициирует:
compiler.run();
или:
compiler.watch();
Ядро Webpack:
webpack-cli получает результат и выводит:
webpack-cliCLI не является обязательным компонентом.
Webpack можно запускать напрямую через Node.js.
const webpack = require('webpack');
const config = require('./webpack.config');
const compiler = webpack(config);
compiler.run((err, stats) => {
if (err) {
console.error(err);
return;
}
console.log(stats.toString());
});
В этом случае:
webpack-cli не нужен;webpack-clinpx webpack
npx webpack --mode production
npx webpack --mode development
npx webpack --watch
npx webpack --config webpack.prod.js
npx webpack --env production
npx webpack --help
webpack-cli анализирует параметры командной строки и
преобразует их в настройки ядра.
Например:
npx webpack --mode production
превращается в:
{
mode: 'production'
}
npx webpack --watch --progress --profile
CLI:
webpack-cli в
dev workflowCLI значительно упрощает разработку.
| Возможность | Описание |
|---|---|
| Watch Mode | Автоматическая пересборка |
| Progress Bar | Отображение прогресса |
| Build Stats | Статистика сборки |
| Environment Flags | Передача env-переменных |
| Config Selection | Выбор конфигураций |
| Multi Config | Работа с несколькими конфигами |
webpack-dev-serverРанее webpack-dev-server запускался через отдельные
команды, однако современный webpack-cli интегрирован с dev
server.
Пример:
npx webpack serve
CLI:
npx webpack
Подходит для:
compiler.run();
Подходит для:
webpack-cli
ищет конфигурациюПо умолчанию используется поиск:
webpack.config.js
Если файл не найден, CLI:
npx webpack --config configs/webpack.prod.js
Webpack поддерживает массив конфигов:
module.exports = [
clientConfig,
serverConfig
];
CLI автоматически запускает multiple compilation.
Внутренне взаимодействие между CLI и ядром выглядит как последовательность стадий:
CLI START
↓
Parse Arguments
↓
Load Config
↓
Create Compiler
↓
Initialize Plugins
↓
Build Dependency Graph
↓
Apply Loaders
↓
Optimize Chunks
↓
Emit Assets
↓
Show Statistics
webpack-cli вынесен отдельноCLI-логика:
CLI можно обновлять отдельно:
npm update webpack-cli
Webpack можно встроить:
{
"devDependencies": {
"webpack": "^5.102.0",
"webpack-cli": "^6.0.1"
}
}
webpack-cli{
"scripts": {
"build": "webpack --mode production",
"dev": "webpack --watch",
"start": "webpack serve"
}
}
При запуске:
npm run build
npm автоматически вызывает бинарник webpack-cli.
После установки пакета создаётся:
node_modules/.bin/webpack
Этот бинарник связан именно с webpack-cli.
Он:
Важно учитывать совместимость:
| webpack | webpack-cli |
|---|---|
| webpack 4 | webpack-cli 3 |
| webpack 5 | webpack-cli 4/5/6 |
Несовместимые версии могут вызывать:
webpack command not found
TypeError: compiler.getInfrastructureLogger is not a function
Invalid configuration object
Failed to load webpack.config.js
webpack-cli
особенно важенCLI особенно полезен в:
webpack-cliCLI можно не использовать:
Архитурно Webpack можно представить следующим образом:
webpack-cli
↓
webpack API
↓
Compiler
↓
Plugins + Loaders
↓
Assets
CLI выступает внешним управляющим слоем, а ядро Webpack — системой компиляции и трансформации модулей.