Webpack предоставляет встроенный механизм генерации подробного отчёта о процессе сборки через объект stats. Этот механизм фиксирует все этапы компиляции: от резолва модулей до итоговой упаковки чанков, включая информацию о загрузчиках, плагинах и времени выполнения отдельных стадий.
Наиболее базовый способ получения данных:
webpack --stats detailed > stats.json
или через конфигурацию:
module.exports = {
stats: {
all: false,
errors: true,
warnings: true,
timings: true,
modules: true,
chunks: true,
assets: true,
}
};
Файл stats.json становится основой для анализа узких
мест. Его структура включает:
thread-loader,
fork-ts-checker)Ключевой момент заключается в том, что stats отражает не только результат, но и структуру работы сборщика, что позволяет выявлять неэффективные участки конфигурации.
Параметр timings позволяет оценить общую
продолжительность сборки и распределение времени между стадиями.
Внутри компиляции Webpack можно выделить следующие крупные этапы:
При анализе stats важно учитывать, что высокая длительность сборки редко связана с одним фактором. Обычно наблюдается комбинация:
Раздел modules в stats позволяет определить, какие
зависимости оказывают наибольшее влияние на время сборки.
Типичные сигналы проблем:
Пример анализа:
{
"name": "./src/index.js",
"size": 523412,
"buildTime": 1200,
"modules": [...]
}
Высокий buildTime у конкретного модуля часто указывает
на:
babel-loader + eslint-loader + ts-loader)Loader’ы выполняются последовательно, и каждый дополнительный шаг увеличивает стоимость сборки.
Типичная проблемная цепочка:
{
test: /\.ts$/,
use: [
'thread-loader',
'babel-loader',
'ts-loader'
]
}
Анализ stats позволяет увидеть, какие loader’ы занимают больше всего времени. При включённом профилировании появляются метрики по каждому loader’у.
Ключевые причины замедления:
В отличие от loader’ов, плагины работают на уровне компиляции и часто оказывают глобальное влияние.
В stats можно обнаружить медленные стадии:
TerserPlugin — минификация JSCssMinimizerPlugin — оптимизация CSSForkTsCheckerWebpackPlugin — type checkingHtmlWebpackPlugin — генерация HTMLТипичный паттерн узкого места:
Особенно затратной операцией является source-map генерация:
module.exports = {
devtool: 'source-map'
};
При больших проектах это может увеличивать сборку в несколько раз.
Webpack поддерживает профильный режим:
webpack --profile --json > profile.json
Флаг --profile добавляет точное время выполнения каждой
стадии компиляции, а --json формирует структурированный
отчет.
Внутри profile.json присутствуют:
Этот формат используется для глубокого анализа, когда stats.json недостаточно.
Одним из ключевых источников узких мест является избыточный dependency graph.
Типичные проблемы:
index.js с массовыми re-export)Пример проблемного паттерна:
import _ from 'lodash';
Вместо:
import debounce from 'lodash/debounce';
Stats позволяет увидеть, какие модули тянут за собой наибольшее количество зависимостей, формируя “раздутые” чанки.
Сырые JSON-данные плохо подходят для анализа без визуализации. Используются инструменты:
Webpack Bundle Analyzer строит дерево модулей:
Это позволяет выявить:
Stats также показывает влияние кеширования на повторные сборки. При правильной настройке наблюдается:
Пример настройки:
module.exports = {
cache: {
type: 'filesystem'
}
};
Без кеша Webpack вынужден пересобирать весь граф зависимостей, что делает stats стабильным, но медленным.
В stats можно отследить влияние параллельной обработки через:
thread-loaderworker-loader (устаревающий подход)Особенность заключается в том, что время выполнения распределяется между воркерами, но:
В stats это отображается как вложенные компиляции, усложняющие анализ общего времени.
Эффективный анализ узких мест основывается на сравнении stats между сборками.
Ключевые метрики для сравнения:
Любое изменение конфигурации (loader, plugin, resolve) должно сопровождаться сравнением stats.json, иначе регрессия производительности часто остаётся незамеченной.
Анализ stats позволяет классифицировать узкие места:
1. Input layer
2. Transform layer
3. Optimization layer
4. Output layer
Каждый слой имеет собственные характерные симптомы замедления, видимые в stats и profile.json.
Помимо скорости, stats позволяет оценить стабильность:
Если наблюдается нелинейный рост времени сборки, это обычно указывает на: