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

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

Bundle budgets: чтение конфига и вывода

Суть Читай реальный конфиг бандлера, паттерны import, сниппет size-limit в CI и заголовок Priority, предсказывай эффект на поставляемые байты и выбирай фикс с наибольшим рычагом.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на senior-высоте — в орбите
◷ 14 min

Проблемы bundle диагностируются в конфигах, строках import, treemap анализатора и логе CI. Читай каждый сниппет как сеньор, затем выбирай фикс, который реально двигает поставляемые байты — а не тот, что двигает только провод.

Цель

Отработай цикл, который ты гоняешь на каждом bundle-ревью: читай import или конфиг, предсказывай, тащит ли он мёртвый вес, и берись за фикс с наибольшим рычагом — режь или shake байты раньше, чем тянуться к compression или к ручке.

Сниппет 1 — barrel re-export

// components/index.ts
export * from './Button';
export * from './Modal';
export * from './RichTextEditor';   // тянет 180 KB editor-либу

// потребитель
import { Button } from '@/components';   // здесь используется только Button
Викторина

Роут использует только Button, но анализатор показывает 180 KB editor в этом чанке. Что происходит и каков фикс?

Сниппет 2 — dynamic import

// грузит chart-панель, которой нет на первой отрисовке
function openPanel(name) {
  return import(`./panels/${name}`);   // переменная в специфайере
}

// в другом месте — настоящий lazy-boundary
const Editor = React.lazy(() => import('./Editor'));
Викторина

Обе строки выглядят как code-splitting. Какая реально даёт чистый, по отдельности shakeable чанк и почему?

Сниппет 3 — CI-gate size-limit

// package.json
"size-limit": [
  { "name": "Homepage JS", "path": ".next/static/**/_app-*.js", "limit": "100 KB" },
  { "name": "All pages total", "path": ".next/static/**/*.js", "limit": "500 KB" }
]
$ npx size-limit
  Homepage JS:     132 KB  (limit 100 KB)   FAIL  +32 KB
  All pages total: 471 KB  (limit 500 KB)   PASS
Викторина

PR триггерит этот вывод. Автор просит смержить и 'починить в следующем спринте'. Какова верная сеньорская реакция?

Сниппет 4 — HTTP/3 priority

# Запрос браузера на критический app-чанк
GET /_next/static/app.abc123.js
Priority: u=1

# Запрос браузера на большой отложенный vendor-чанк
GET /_next/static/vendor.def456.js
Priority: u=5

# Конфиг CDN (misconfigured): игнорит клиентский Priority, отдаёт FIFO
Викторина

Приложение корректно code-split, и браузер шлёт вменяемые приоритеты RFC 9218, но CDN их игнорит и отдаёт first-come-first-served. Каков вероятный эффект и где это проверить?

Итог

Каждая регрессия bundle читается в конфиге и выводе: barrel с export * и dynamic import с переменным специфайером тихо побеждают splitting и tree-shaking; провал size-limit — это жёсткий gate, а не предложение отложить; и даже идеально сплитнутый bundle недодаёт, если CDN игнорит приоритеты HTTP/3. Диагностируй по анализатору и логу CI, чини убирая байты с критического пути первым делом, затем подтверждай порядок доставки — перемеряй, а не предполагай.

Продолжить восхождение ↑Bundle budgets: затащи роут под budget и удержи его
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources2
expand
  1. 01
  2. 02

Trademarks belong to their respective owners. Editorial reference only.