Bundle analysis в Stencil — ключевой инструмент для оптимизации веб-приложений и компонентов. Он позволяет детально оценивать размер сгенерированных бандлов, выявлять «тяжелые» зависимости и контролировать структуру выходного кода.
Stencil предоставляет встроенную возможность анализа бандлов через
плагин stencil-bundle-analyzer. Для его активации
достаточно внести изменения в конфигурационный файл
stencil.config.ts:
import { Config } FROM '@stencil/core';
import { bundleAnalyzer } from 'rollup-plugin-bundle-analyzer';
export const config: Config = {
namespace: 'app',
outputTargets: [
{
type: 'www',
serviceWorker: null
}
],
plugins: [
bundleAnalyzer({
summaryOnly: true,
LIMIT: 500 // порог в килобайтах для предупреждения
})
]
};
Ключевые параметры плагина:
summaryOnly — выводит только общую информацию о бандле,
без детальной разбивки.limit — порог размера для предупреждения о слишком
больших файлах.open — автоматическое открытие отчета в браузере после
сборки (по умолчанию false).Stencil генерирует несколько типов бандлов для каждого компонента:
Bundle analysis помогает понять, какие модули потребляют наибольший вес, и определить, какие зависимости можно заменить или оптимизировать.
После сборки с включенным анализом создается подробный отчет, который включает:
Пример использования отчета:
Module Size (KB)
--------------------------------
lodash 120
my-component 15
other-component 8
vendor 200
На основе этих данных можно:
Bundle analysis в Stencil можно интегрировать в процесс CI/CD для автоматического контроля за ростом размера бандлов. Например, в GitHub Actions:
name: Build and Analyze
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: '20'
- run: npm ci
- run: npm run build
- run: npm run bundle-analyze
При превышении установленных лимитов сборка может завершаться с ошибкой, предотвращая внедрение «тяжелого» кода в продакшн.
После анализа бандлов выявляются следующие возможности оптимизации:
Tree-shaking сторонних библиотек Некоторые
пакеты можно импортировать частично, например:
import { debounce } from 'lodash-es'; вместо полного
импорта.
Разделение компонентов Если один компонент генерирует большой бандл, его можно разделить на несколько lazy-компонентов.
Кеширование и preloading Отчеты показывают,
какие модули чаще всего загружаются сразу, и какие можно отложить с
помощью <link rel="preload">.
Минификация и сжатие Проверка размера до и после
минификации помогает выбрать оптимальный инструмент (terser
или встроенный stencil minify).
Для наглядного анализа можно использовать графические визуализаторы, совместимые с отчетами Stencil, такие как:
webpack-bundle-analyzer для визуализации отдельных
модулей.rollup-plugin-visualizer для построения интерактивного
графа зависимостей.Такая визуализация помогает быстро обнаруживать «узкие места» и принимать решения по оптимизации.