Проверка результата: анализ бандла

Результат работы Webpack представляет собой набор скомпилированных модулей, объединённых в один или несколько бандлов, а также сопутствующие ресурсы: чанки, ассеты, source maps и служебный runtime-код. Проверка результата сборки является ключевым этапом оптимизации, поскольку именно на этом этапе выявляются избыточные зависимости, дублирование кода, неэффективное разделение чанков и проблемы с производительностью загрузки.

Анализ бандла в Webpack опирается не на один инструмент, а на совокупность данных: статистику сборки, визуализацию модулей, размер файлов, структуру графа зависимостей и поведение кода в рантайме.


Статистика сборки (stats.json)

Webpack способен формировать детализированный отчёт о сборке в формате JSON. Этот отчёт является основой для любого глубокого анализа.

webpack --profile --json > stats.json

Флаг --profile добавляет временные метрики, а --json формирует структурированное описание бандла.

Внутри stats.json содержится:

  • список модулей с путями и размерами
  • информация о чанках и их связях
  • зависимости между модулями
  • данные о плагинах и loader-цепочках
  • метрики времени компиляции

Ключевым элементом является раздел modules, где можно увидеть фактический вклад каждого файла в итоговый бандл.

Пример структуры:

  • module

    • identifier
    • name
    • size
    • reasons (почему модуль попал в граф)
    • usedExports (если включён tree shaking анализ)

Использование webpack-bundle-analyzer

Одним из наиболее практичных инструментов анализа является визуализатор бандла, который преобразует stats.json в интерактивную карту модулей.

Инструмент строит treemap, где площадь блока соответствует размеру модуля.

Основные возможности анализа:

  • выявление крупнейших зависимостей
  • обнаружение дублирующихся библиотек
  • анализ структуры node_modules
  • оценка эффективности code splitting

Типичный сценарий использования:

const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer');

module.exports = {
  plugins: [
    new BundleAnalyzerPlugin()
  ]
};

В результате формируется визуальный отчёт, где можно определить:

  • крупные зависимости, которые требуют замены или частичной загрузки
  • библиотеки, попавшие в основной бандл вместо ленивой загрузки
  • повторяющиеся части кода между чанками

Анализ размера модулей и библиотек

Размер бандла определяется не только количеством подключённых библиотек, но и их внутренней структурой. Современные npm-пакеты часто содержат:

  • ESM-версию
  • CommonJS-версию
  • UMD-сборку
  • дополнительные утилиты и полифилы

Webpack может включить в итоговый бандл не оптимальную версию библиотеки, если не настроено поле resolve.mainFields.

Особое внимание уделяется:

  • lodash (часто импортируется целиком вместо модулей)
  • moment.js (большой вес локалей)
  • charting-библиотеки
  • UI-фреймворки с неразделёнными импортами

Оптимальный анализ включает проверку:

  • фактического размера после tree shaking
  • gzip/brotli-эффективного размера
  • повторяющихся зависимостей в разных чанках

Проверка tree shaking в итоговом бандле

Tree shaking работает только при корректной ESM-структуре и при включённой оптимизации:

optimization: {
  usedExports: true,
  sideEffects: true
}

В результате анализа необходимо определить:

  • удалены ли неиспользуемые функции
  • остались ли “мертвые” экспорты
  • попадают ли целые библиотеки без необходимости

В stats.json полезным является поле:

  • usedExports — показывает, какие экспорты реально используются
  • providedExports — что предоставляет модуль

Если usedExports отсутствует или пуст, tree shaking не работает или блокируется CommonJS-модулем.


Анализ чанков и code splitting

Webpack формирует несколько типов чанков:

  • entry chunks
  • dynamic import chunks
  • runtime chunks
  • shared chunks (splitChunks)

Ключевой задачей анализа является проверка:

  • нет ли слишком крупных entry-бандлов
  • корректно ли выделены vendor chunks
  • отсутствуют ли дубли библиотек между чанками

Конфигурация splitChunks:

optimization: {
  splitChunks: {
    chunks: 'all',
    cacheGroups: {
      vendors: {
        test: /[\\/]node_modules[\\/]/,
        name: 'vendors',
        priority: -10
      }
    }
  }
}

При анализе результата важно выявить:

  • дублирование vendor-кода
  • слишком мелкие чанки (over-splitting)
  • слишком крупные чанки (under-splitting)

Анализ runtime-кода Webpack

Webpack добавляет служебный runtime, который управляет:

  • загрузкой чанков
  • кэшированием модулей
  • выполнением динамических импортов
  • связью между модулями

Избыточный runtime может возникать при:

  • частых динамических импортов
  • множественных entry points
  • отсутствия оптимизации runtimeChunk

Оптимизация:

optimization: {
  runtimeChunk: 'single'
}

Анализ показывает:

  • размер runtime относительно всего бандла
  • количество вызовов JSONP-загрузчика
  • структуру module registry

Source Map анализ

Source maps позволяют сопоставить итоговый бандл с исходным кодом. Они критичны для анализа:

  • реального источника больших модулей
  • вкладов зависимостей
  • скрытых полифилов

Инструменты:

  • source-map-explorer
  • chrome devtools coverage

Пример анализа:

npx source-map-explorer dist/main.js dist/main.js.map

Результат показывает:

  • какой исходный файл занимает больше всего места
  • какие зависимости тянут дополнительные библиотеки
  • какие части кода не используются

Анализ дублирования зависимостей

Одной из частых проблем является повторное включение одной и той же библиотеки в разные чанки.

Причины:

  • разные версии зависимости в node_modules
  • отсутствие hoisting
  • неконсистентные импорты
  • использование локальных копий модулей

Методы выявления:

  • анализ stats.json (modules с одинаковыми именами)
  • визуализация через bundle analyzer
  • проверка package-lock / yarn.lock

Последствия:

  • увеличение общего размера бандла
  • ухудшение кешируемости
  • дублирование runtime-инициализации

Оценка эффективности кеширования

Webpack поддерживает long-term caching через:

  • contenthash
  • chunkhash
  • moduleIds: ‘deterministic’

Анализ результата сборки включает проверку:

  • стабильности хэшей между сборками
  • изменения vendor-бандла при изменении приложения
  • разделения кода по логическим границам

Пример:

output: {
  filename: '[name].[contenthash].js'
}

Проблемы, выявляемые при анализе:

  • частое изменение vendor chunk из-за неправильного разделения
  • отсутствие стабильных идентификаторов модулей
  • смешивание runtime и application code

Анализ веса ассетов (assets)

Помимо JS-бандлов Webpack формирует:

  • CSS файлы
  • изображения
  • шрифты
  • статические ресурсы

Анализ включает:

  • общий вес ассетов
  • влияние медиафайлов на загрузку
  • дублирование изображений
  • отсутствие оптимизации форматов

Часто выявляемые проблемы:

  • большие PNG вместо WebP
  • отсутствие минификации CSS
  • неиспользуемые шрифты

Проверка production-сборки

Анализ должен проводиться исключительно на production-конфигурации, поскольку:

  • development build содержит source maps и debug-код
  • отсутствует минификация
  • не применяется tree shaking в полном объёме

Production режим:

mode: 'production'

Дополнительные оптимизации:

  • TerserPlugin для JS
  • CssMinimizerPlugin для CSS
  • Image minimization plugins

Метрики производительности бандла

Ключевые метрики:

  • First Load JS Size
  • Total Bundle Size
  • Chunk Count
  • Duplicate Module Ratio
  • Unused Export Ratio

Эти показатели позволяют оценить:

  • скорость первичной загрузки
  • эффективность разделения кода
  • качество архитектуры зависимостей

Граф зависимостей как инструмент диагностики

Webpack строит внутренний dependency graph, который отражает:

  • связь между модулями
  • цепочки импортов
  • влияние одного модуля на другие

Анализ графа позволяет:

  • обнаружить “центральные узлы” зависимости
  • выявить чрезмерно связанные модули
  • оптимизировать архитектуру приложения

Особенно важно выявление модулей с высоким fan-out (много зависимостей) и fan-in (используются везде), так как они влияют на стабильность и размер бандла.


Итоговые направления анализа результата сборки

Анализ бандла в Webpack представляет собой многослойный процесс, включающий:

  • структурный анализ модулей
  • оценку размеров и дублирования
  • проверку tree shaking
  • анализ чанков и runtime
  • проверку кешируемости
  • визуализацию dependency graph

Совокупность этих данных формирует точное представление о том, как код превращается в конечный артефакт и какие участки системы требуют оптимизации.