Механизм stats в Webpack представляет собой
централизованный способ контроля объёма и структуры информации, которая
выводится во время сборки. Он влияет на консольный вывод, содержимое
JSON-отчётов, а также на данные, которые используются плагинами и
внешними инструментами анализа сборки.
Основная цель stats — баланс между информативностью и
производительностью: от минимального логирования до максимально
подробного отчёта о каждом модуле, чанке и зависимости.
Объект stats формируется после завершения компиляции и
содержит агрегированную информацию:
Внутренне stats строится из инстанса компилятора и может
быть преобразован в JSON через:
compilation.getStats().toJson();
Или через CLI:
webpack --stats
Webpack поддерживает предустановленные режимы детализации, которые задаются строкой:
stats: "none"Полное отключение вывода.
stats: "errors-only"Отображаются только ошибки.
stats: "minimal"Минимальный информативный режим:
stats: "normal"Стандартный режим (по умолчанию).
stats: "detailed"Расширенный режим:
stats: "verbose"Максимальная детализация:
Помимо пресетов используется объект StatsOptions,
который позволяет управлять отдельными секциями вывода.
stats: {
modules: true,
modulesSpace: 10,
chunkModules: true
}
modules — отображение списка модулейchunkModules — модули внутри чанковmodulesSpace — форматирование выводаПри больших проектах включение modules: true резко
увеличивает объём вывода и может замедлить сериализацию stats.
stats: {
chunks: true,
chunkOrigins: true,
chunkRelations: true
}
chunks — базовая информация о чанкахchunkOrigins — откуда чанк был созданchunkRelations — связи между чанкамиОсобенно полезно при анализе code splitting и динамических импортов.
stats: {
assets: true,
assetsSort: "size"
}
assets — список файлов результата сборкиassetsSort — сортировка (например, по размеру)Позволяет выявлять самые тяжёлые файлы бандла.
Один из ключевых диагностических инструментов:
stats: {
reasons: true
}
Выводит цепочку:
Это критически важно для анализа «почему этот код попал в сборку».
stats: {
dependencies: true
}
Позволяет увидеть низкоуровневые связи между модулями, включая:
Stats тесно связан с системой логирования компилятора:
stats: {
logging: "verbose"
}
Возможные уровни:
none — отсутствие логовerror — только ошибкиwarn — предупреждения и ошибкиinfo — общая информацияlog — стандартные сообщенияverbose — максимально подробные логиWebpack поддерживает управление визуальным представлением:
stats: {
colors: true,
context: "/project/root"
}
colors — включение цветного выводаcontext — базовый путь для сокращения абсолютных
путейКонтекст особенно важен для уменьшения «шума» в путях модулей.
Одно из ключевых применений stats — генерация JSON:
const stats = compilation.getStats().toJson({
all: false,
assets: true,
modules: true
});
Начиная с гибких конфигураций, используется параметр
all:
stats: {
all: false,
assets: true,
modules: true
}
all: false — отключает всё по умолчаниюЭто наиболее эффективный способ контроля размера stats-вывода.
Избыточный stats напрямую влияет на:
Особенно затратны параметры:
modules: truereasons: truechunkModules: trueoptimizationBailout: trueВ больших проектах это может увеличивать время завершения сборки, даже если сама компиляция уже завершена.
Webpack может включать дополнительную диагностическую информацию:
stats: {
optimizationBailout: true,
providedExports: true,
usedExports: true
}
usedExports — показывает, какие экспорты реально
используютсяprovidedExports — какие экспорты предоставляет
модульoptimizationBailout — причины отказа от
оптимизацийЭти поля используются при анализе tree-shaking.
Обычно используется минимальная конфигурация:
Используются расширенные stats:
Процесс формирования stats включает несколько этапов:
Каждый этап может быть расширен плагинами, влияющими на итоговую структуру отчёта.
Плагины Webpack часто используют stats для:
Пример:
compiler.hooks.done.tap("MyPlugin", (stats) => {
const json = stats.toJson({
modules: true
});
});
Включение слишком детализированных опций приводит к:
Некоторые CI-системы ограничивают размер логов, и verbose stats может приводить к:
При включении reasons и dependencies легко
неверно интерпретировать цепочку импортов, особенно при: