Бандл растёт незаметно — мы помогаем это контролировать
Вы добавили одну зависимость, коллега импортировал утилиту целиком — и через месяц JS-бандл потяжелел на 200 КБ. LCP просел на 30%, а виновник не найден. В 80% проектов разработчики замечают проблему только после деплоя в прод. Автоматическая проверка размера бандла в CI/CD останавливает деградацию до попадания в релиз. Наши инженеры с опытом 5+ лет настраивают такой контроль под ваш стек. Первичная консультация — бесплатно. Свяжитесь для аудита бандла.
Какие проблемы решаем
-
Невидимый рост бандла — каждая новая зависимость увеличивает размер, но в PR этого не видно, пока LCP не вырастет на 30%. Например, импорт
lodashцеликом вместоlodash.getдобавляет 20 КБ в gzip. - Дублирование кода — одна и та же библиотека в разных чанках после code splitting, что увеличивает общий размер на 10-15%.
- Раздутие initial bundle — lazy-загрузка не настроена, и пользователь качает всё сразу, увеличивая TTI на 2 секунды.
- Отсутствие baseline — без истории изменений сложно отследить, какая версия внесла регрессию.
Как это работает
На каждый PR или деплой собираем бандл, сравниваем его размер и размер отдельных чанков с baseline — значениями из предыдущего деплоя или фиксированными лимитами. Если порог превышен — CI падает или оставляет предупреждение в PR. Это позволяет экономить до 500$ в месяц на поддержке производительности.
Инструменты делятся на два класса:
| Инструмент | Подход | Когда использовать |
|---|---|---|
bundlesize / bundlewatch |
Сравнение с фиксированными лимитами | Простые проекты, быстрая настройка |
size-limit (NEAR Protocol) |
Лимиты + анализ импортов | JS-библиотеки, пакеты npm |
| Webpack Bundle Analyzer | Визуализация, без CI-блокировки | Ручной аудит |
Vite rollup-plugin-visualizer |
То же для Vite | Ручной аудит |
| Relative CI / BuildBuddy | Сравнение PR vs base branch | Командные проекты, богатый UI |
Как bundlewatch помогает контролировать размер бандла?
Устанавливаем:
npm install --save-dev bundlewatch Конфигурация в package.json:
{ "bundlewatch": { "files": [ { "path": "dist/assets/index-*.js", "maxSize": "150kB" }, { "path": "dist/assets/vendor-*.js", "maxSize": "400kB" }, { "path": "dist/assets/*.css", "maxSize": "50kB" } ], "ci": { "trackBranches": ["main", "master"], "repoBranchBase": "main" } } } В GitHub Actions:
name: Bundle Size Check on: [pull_request] jobs: bundlewatch: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 20 cache: npm - run: npm ci - run: npm run build - run: npx bundlewatch env: BUNDLEWATCH_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} CI_REPO_OWNER: ${{ github.repository_owner }} CI_REPO_NAME: ${{ github.event.repository.name }} CI_COMMIT_SHA: ${{ github.event.pull_request.head.sha }} CI_BRANCH: ${{ github.head_ref }} CI_BRANCH_BASE: ${{ github.base_ref }} bundlewatch оставляет комментарий в PR с таблицей: текущий размер, delta, статус. Подробнее в bundlewatch.
Настройка size-limit: глубже, чем просто лимиты
size-limit анализирует дерево импортов: показывает вес модуля с учётом tree-shaking и gzip.
npm install --save-dev size-limit @size-limit/preset-app .size-limit.json:
[ { "path": "dist/assets/index-*.js", "limit": "150 kB", "gzip": true }, { "name": "Vendor chunk", "path": "dist/assets/vendor-*.js", "limit": "380 kB", "gzip": true } ] В package.json:
{ "scripts": { "size": "size-limit", "analyze": "size-limit --why" } } --why запускает webpack-bundle-analyzer и показывает, что именно тянет размер.
Почему относительные лимиты удобнее абсолютных?
Абсолютные лимиты устаревают — проект растёт, и постоянно поднимать цифры надоедает. Альтернатива: проверять delta относительно base branch. Мы используем скрипт, который сравнивает размер текущей ветки с базовой. Скрипт выполняет сборку, сохраняет текущий размер, загружает размер базовой ветки из артефактов CI и вычисляет дельту. Если дельта превышает 10%, CI падает. Такой подход экономит время на настройку и не требует ручного обновления лимитов.
Что проверять помимо общего размера
- Количество чанков — рост числа чанков при code splitting может увеличить количество HTTP-запросов.
- Размер initial bundle отдельно от lazy-loaded чанков — именно он влияет на LCP и TTI.
- Дубли зависимостей — когда одна библиотека затягивается в несколько чанков в разных версиях. Для анализа:
npm ls <package>илиnpx duplicate-package-checker-webpack-plugin.
Сравнение подходов: bundlewatch vs size-limit
| Параметр | bundlewatch | size-limit |
|---|---|---|
| Сложность настройки | Низкая (5 минут) | Средняя (конфиг JSON) |
| Тип лимитов | Абсолютные | Абсолютные + относительные |
| Анализ импортов | Нет | Да (tree-shaking) |
| Уведомления в PR | Комментарий с таблицей | Комментарий + флажок |
| Рекомендация | Быстрый старт | Глубокий контроль |
Типичные ошибки и как их избежать
Некоторые команды забывают настроить кеширование, и проверка занимает 5+ минут. Мы используем кеширование node_modules и .vite, сокращая время до 40–60 секунд. Другая ошибка — устанавливают лимиты «на глаз». Правильно: замерить текущие размеры и задать с запасом 10–15%.
Что входит в работу
- Аудит текущего бандла и выявление проблемных мест.
- Настройка выбранного инструмента (bundlewatch или size-limit) с индивидуальными лимитами.
- Интеграция в CI/CD (GitHub Actions, GitLab CI, Bitbucket Pipelines).
- Документирование конфигурации и процесса поддержки.
- Обучение команды работе с уведомлениями и анализом.
- Пост-релизная поддержка в течение 1 месяца.
Сроки ориентировочно
Базовая настройка bundlewatch в существующий CI-пайплайн — от 4 до 8 часов. Настройка size-limit с анализом и уведомлениями в PR — от 1 до 2 рабочих дней. Стоимость рассчитывается индивидуально после оценки вашего проекта. Получите консультацию — мы расскажем, какой вариант оптимален. Закажите аудит бандла, и мы предложим конкретные решения.







