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

Браузер и фронтенд-рантайм

Core Web Vitals: чтение кода и трейсов

Суть Читай реальную разметку, обработчик клика и строку лога web-vitals, предсказывай, какая Core Web Vital ломается, и выбирай фикс с наибольшим рычагом.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на senior-высоте — в орбите
◷ 14 min

Проблемы vitals диагностируют в разметке, обработчиках и RUM-логе — не в определении. Читай каждый сниппет, предсказывай, какая vital ломается и почему, и выбирай фикс, который senior-инженер делает первым.

Цель

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

Сниппет 1 — hero без размеров

<!-- hero, LCP-элемент, вставлен после текста статьи -->
<section class="article">
  <p>Параграф один статьи…</p>
  <img src="/hero.avif" class="hero" alt="Product hero" />
  <p>Параграф два…</p>
</section>
.hero { width: 100%; }   /* height auto, intrinsic ratio неизвестен */
Викторина

Что здесь ломается, по какой vital бьёт и каков фикс?

Сниппет 2 — ленивый hero

<img
  src="/hero-2400.jpg"
  width="1200" height="800"
  loading="lazy"
  class="hero"
  alt="Product hero"
/>
Викторина

Размеры корректны, поэтому CLS в порядке — но LCP регрессировал после добавления этого атрибута. Какой атрибут и почему?

Сниппет 3 — обработчик клика

button.addEventListener('click', () => {
  const filtered = hugeList.filter(matchesQuery);  // ~180 мс, 50k элементов
  renderResults(filtered);                          // перерисовка списка
  highlightActiveTab();                             // крошечное обновление DOM
});
Викторина

INP на этой кнопке ~210 мс, хотя поток простаивает в момент тапа. Какая часть INP доминирует и каков фикс с наибольшим рычагом?

Сниппет 4 — строка лога web-vitals

[LCP] value: 4120 ms  rating: poor
  element: img.hero
  url: /assets/hero-original.jpg  (3.8 MB, JPEG, 4000x3000)
  phase split: ttfb 280ms | loadDelay 90ms | loadTime 3510ms | renderDelay 240ms
[INP] value: 38 ms  rating: good
[CLS] value: 0.02  rating: good
Викторина

Читая эту атрибутированную строку RUM, какой фикс правилен и чего делать НЕ надо?

Итог

Каждую регрессию vitals читают в коде или атрибутированном логе: img без width/height — это сдвиг CLS; loading=‘lazy’ на hero — самонанесённая регрессия load delay у LCP; тяжёлый синхронный обработчик — это processing time у INP, который ты убираешь с критического пути через startTransition или scheduler.yield; а разбиение по фазам в строке web-vitals говорит, какую фазу LCP чинить и какой фикс был бы впустую. Сначала читай атрибуцию, чини доминирующую фазу или часть, затем перемеряй для подтверждения.

Продолжить восхождение ↑Core Web Vitals: почини проваленную страницу статьи
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.