Webpack предоставляет встроенный механизм контроля размера итоговых артефактов, позволяющий отслеживать рост бандлов и предотвращать случайное увеличение веса клиентского кода. Этот механизм не влияет напрямую на процесс сборки, но формирует диагностические предупреждения и может быть использован как часть политики качества проекта.
Ключевая настройка — раздел performance, который
определяет пороговые значения и поведение при их превышении.
В конфигурации Webpack параметр performance задаёт
правила анализа размеров:
module.exports = {
performance: {
hints: 'warning',
maxAssetSize: 244 * 1024,
maxEntrypointSize: 244 * 1024
}
};
hints — режим реакции на превышение лимитов:
false — отключает проверкиwarning — выводит предупреждения в консольerror — трактует превышение как критическую ошибку
сборкиНа практике чаще используется warning, чтобы не
блокировать CI, но фиксировать деградацию.
maxAssetSize — максимальный размер отдельного файла (asset)
Контролирует вес каждого выходного файла, включая:
Размер измеряется в байтах, поэтому в конфигурации обычно используют выражения с умножением на 1024.
maxEntrypointSize — максимальный размер точки входа
В отличие от maxAssetSize, этот параметр оценивает
суммарный вес всех файлов, загружаемых одной entry point-группой. Он
особенно важен в приложениях с code splitting, где одна страница может
подтягивать несколько чанков.
Webpack выполняет анализ после формирования графа зависимостей и генерации output-ассетов. На этом этапе доступны финальные размеры файлов, включая результаты минификации и разбиения чанков.
Проверка выполняется по следующей логике:
maxAssetSizemaxEntrypointSizeВажно понимать различие между двумя метриками:
Отражает размер конкретного файла.
Пример:
main.js — 180 KBvendor.js — 300 KBКаждый файл проверяется отдельно.
Суммирует все зависимости одной точки входа:
main entrypoint:
- main.js (180 KB)
- vendor.js (300 KB)
- runtime.js (20 KB)
Итого: 500 KB
Даже если отдельные файлы в пределах нормы, entrypoint может превышать лимит.
Контроль performance имеет смысл только при понимании
факторов увеличения размера сборки.
Часто возникает при:
resolveПри использовании CommonJS:
const utils = require('utils');
Webpack сложнее анализировать неиспользуемые экспорты, что приводит к включению лишнего кода.
Если весь код попадает в один entrypoint, даже небольшие изменения приводят к превышению лимитов.
Типичные источники:
Универсальных значений не существует. Практика настройки строится вокруг текущего состояния приложения.
Используется в зрелых проектах:
hints: 'error'Подходит для активной разработки:
hints: 'warning'Webpack позволяет исключать определённые файлы из проверки через
assetFilter.
module.exports = {
performance: {
assetFilter: function (assetFilename) {
return !assetFilename.endsWith('.map');
}
}
};
.map)В режиме:
mode: 'production'
Webpack автоматически:
Однако performance работает независимо от mode и может
использоваться в любом окружении.
Оптимизация через splitChunks напрямую влияет на
показатели performance.
Пример конфигурации:
optimization: {
splitChunks: {
chunks: 'all',
cacheGroups: {
vendor: {
test: /[\\/]node_modules[\\/]/,
name: 'vendors',
chunks: 'all'
}
}
}
}
Эффект:
Использование динамического импорта позволяет дробить приложение:
import('./module').then(({ default: module }) => {
module.init();
});
Результат:
При срабатывании performance Webpack выводит
предупреждения вида:
asset size limit: The following asset(s) exceed the recommended size limit:
main.js (350 KiB)
Или для entrypoint:
entrypoint size limit: The following entrypoint(s) combined asset size exceeds the recommended limit:
main (420 KiB)
Эти сообщения являются отправной точкой для оптимизации.
В зрелых проектах performance используется как часть
автоматизированного контроля качества:
Аудит package.json и исключение неиспользуемых
библиотек.
Например:
Плохо:
import _ from 'lodash';
Хорошо:
import debounce from 'lodash/debounce';
Использование ESM-экспорта:
export function sum(a, b) {
return a + b;
}
Механизм performance фактически выступает как система
раннего предупреждения деградации клиентской части. Он не решает
проблему размера бандла, но фиксирует момент, когда архитектурные
решения начинают влиять на производительность доставки.
В связке с code splitting, tree shaking и анализом зависимостей он формирует базовый контур контроля веса фронтенда, позволяя удерживать размер сборки в предсказуемых границах.