awesome-everything EN
↑ Обратно к восхождению

Производительность

CI enforcement и RUM: делаем бюджеты рабочими

Суть Без CI-gate bundle budget — пожелание. С size-limit в CI и RUM в production каждый PR, взрывающий бюджет, fail''''ит, а каждая production-регрессия пейджит команду-owner.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на middle-высоте — в небе
◷ 15 min

Команда тратит неделю, срезая homepage bundle с 900 КБ до 180 КБ. Три месяца спустя он снова 820 КБ. Никто не нарушил никакой политики. Каждый инженер делал разумно выглядящий импорт. Без CI-gate, fail’ящего PR, бюджет — аспирация — он размывается по одному PR за раз.

CI-gate: size-limit

size-limit — open-source инструмент, читающий per-route bundle targets из package.json или config-файла и fail’ящий build если любой лимит превышен. Запускается после сборки, читает gzip’d chunk sizes и завершается с не-нулевым кодом при превышении бюджета.

// package.json
"size-limit": [
  { "name": "Homepage JS", "path": ".next/static/**/_app-*.js", "limit": "100 KB" },
  { "name": "Dashboard JS", "path": ".next/static/**/dashboard-*.js", "limit": "250 KB" },
  { "name": "All pages total", "path": ".next/static/**/*.js", "limit": "500 KB" }
]
# .github/workflows/perf.yml
- name: Build
  run: bun run build
- name: Check bundle size
  run: npx size-limit
  # Fail'ит PR если любой лимит превышен

PR comment интеграция (size-limit-action) постит таблицу текущего vs бюджетного размера на каждый PR, делая эффект видимым перед мержем. Инженеры, добавляющие библиотеку, сразу видят дельту; либо обосновывают добавление (и команда явно поднимает бюджет), либо находят меньшую альтернативу.

Альтернативы: bundlewatch, Lighthouse CI

bundlewatch схож с size-limit с другим форматом конфига и GitHub check интеграцией. Lighthouse CI запускает полный Lighthouse audit на каждый PR — более комплексно, медленнее. Все три инструмента отвечают на один вопрос: «взрывает ли этот PR performance budget?»

Senior-команды используют size-limit для быстрой per-PR обратной связи (запускается за 5-10 с) и Lighthouse CI на merge в main для полного CWV snapshot.

Workflow с bundle analyzer

До того как CI может enforce бюджет, команда должна понять текущий bundle. Стандартный workflow:

  1. Включить bundle analyzer: ANALYZE=true bun run build (Next.js: @next/bundle-analyzer; Vite: rollup-plugin-visualizer; Webpack: webpack-bundle-analyzer).
  2. Отсортировать по размеру. Найти top 5-10 contributors.
  3. Для каждого: нужен ли он на critical path этого route?
  4. Типичные находки: moment.js (220 КБ, заменить на date-fns); полный lodash (80 КБ, cherry-pick); admin panel, импортированный глобально (170 КБ, lazy-load); все вариации иконок (110 КБ, cherry-pick).
  5. Поставить initial budget at current size + 20% (место для роста, но не неограниченно).
ИнструментЦельКогда использовать
size-limitFail’ит PR если bundle > бюджетаКаждый PR
Bundle analyzerVisual treemap модулейДо и после оптимизаций
Lighthouse CIПолный синтетический CWV auditПри merge в main
RUMReal-user LCP/INP/CLS метрикиНепрерывный production monitoring

RUM в production

CI ловит регрессии перед мержем. RUM ловит то, что CI пропустил в production: device-классы, работающие медленнее throttled теста, географии с медленными сетями, и медленные регрессии, накапливающиеся за многие маленькие PR, каждый в рамках бюджета.

Implementations: Web Vitals JS library (Google, бесплатно), Sentry Performance, Datadog RUM, New Relic Browser, Vercel Speed Insights, Cloudflare Web Analytics.

Senior RUM dashboard: P75 LCP per route, per device class (mobile vs desktop), per geography. Alert при P75 LCP для любого route деградирует более 20% за 24 часа.

Связывая RUM с bundle size: некоторые команды шлют gzip’d bundle size per route как custom RUM метрику рядом с LCP, так что при деградации LCP первый dashboard для проверки показывает bundle size дельту для того же деплоя. Делает корреляцию видимой без inference.

Протокол повышения бюджета

Когда PR легитимно нуждается в превышении бюджета: инженер открывает budget-raise PR. Требует sign-off от performance-owning team lead, документирует обоснование (новая фича, vendor requirement, ценность для юзера) и записывает старые и новые лимиты в perf-budgets.json. Без этого протокола бюджеты дрейфуют вверх по одному неявному approval за раз.

Почему это работает

Почему initial budget включает +20% буфер? Установка бюджета на текущем измеренном размере означает, что следующее добавление фичи немедленно fail’ит CI — это деморализует и контрпродуктивно. 20% буфер признаёт, что фичи увеличивают bundle, и вынуждает явное обоснование только при превышении буфера. Затягивать бюджет на 10% в квартал как ratchet — непрерывное улучшение без cliff.

Викторина

PR добавляет 60 КБ chart-библиотеку на homepage. CI-gate fail'ит. Инженер говорит, что chart важен. Корректный процесс?

Викторина

Lighthouse CI запускается на каждый PR и сообщает P75 LCP 2,1 с. Production RUM показывает P75 LCP 4,8 с на mobile. Почему расхождение?

Викторина

Команда ставит size-limit бюджет 100 КБ для homepage JS. Через месяц бюджет повышается до 150 КБ, потом 180 КБ, потом 200 КБ — каждый раз ради 'критичной' фичи. Какая структурная проблема и как исправить?

Вспомните перед уходом
  1. 01
    Опиши полный bundle-budget enforcement стек: PR time, merge и production.
  2. 02
    Почему Lighthouse CI иногда показывает Good LCP, пока production RUM показывает Poor LCP для того же route?
Итог

Bundle budget без CI-gate — предложение. size-limit, bundlewatch или Lighthouse CI делают каждый over-budget PR fail’ящим автоматически. Bundle analyzer обеспечивает видимость понять, что внутри каждого chunk и где резать. RUM замыкает цикл в production, ловя медленные регрессии и device-class проблемы, которые synthetic тесты пропускают. Протокол бюджет-raise гарантирует явность и проверку каждого изменения лимита. Следующий и последний урок рассматривает senior-уровень: JIT-пайплайн V8 и как HTTP/3 resource priorities взаимодействуют с bundle delivery.

Связанные уроки
встречается в260
Продолжить восхождение ↑V8 JIT-пайплайн, HTTP-приоритеты и безопасность bundle
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.