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

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

Core Web Vitals: LCP, INP и CLS

Суть Три Google-метрики от реальных пользователей. Размер bundle — главный рычаг LCP и INP. Этот урок отображает байты на пороговые значения.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на middle-высоте — в небе
◷ 14 min

Команда тратит два спринта на оптимизацию API. Server P99 падает с 400 мс до 90 мс. Google Search Console показывает: LCP «Poor» у 40% мобильных пользователей. API не был узким местом. 800 КБ JS-bundle, блокирующий main thread, — был.

Три метрики и что они меряют

Core Web Vitals от Google — три field-метрики, собираемые от реальных Chrome-пользователей через датасет CrUX, — измеряют разные аспекты пользовательского опыта.

LCP (Largest Contentful Paint) — время от начала навигации до рендера самого большого видимого элемента above the fold. Обычно hero image, H1 или фоновый блок. Target: менее 2,5 с — «Good»; 2,5-4,0 с — «Needs Improvement»; более 4,0 с — «Poor». Тяжёлый JS, блокирующий main thread, задерживает момент рисования — LCP страдает напрямую.

INP (Interaction to Next Paint) — введён в марте 2024, заменил FID. INP измеряет worst-case latency от любого пользовательского ввода (клик, нажатие, тап) до следующего visual update за всё время жизни страницы. Target: менее 200 мс — «Good»; 200-500 мс — «Needs Improvement»; более 500 мс — «Poor». Долгие JS-задачи на main thread — включая parse и execute большого bundle — поднимают INP.

CLS (Cumulative Layout Shift) — насколько видимый контент непредвиденно сдвигается при загрузке. Target: менее 0,1 — «Good»; 0,1-0,25 — «Needs Improvement»; более 0,25 — «Poor». Размер bundle не вызывает CLS напрямую; layout shifts возникают из-за картинок без размеров, поздней загрузки шрифтов и JS, вставляющего above-fold контент после initial paint.

МетрикаGoodNeeds ImprovementPoorBundle lever?
LCP< 2,5 с2,5 – 4,0 с> 4,0 сСильный — JS parse/execute блокирует paint
INP< 200 мс200 – 500 мс> 500 мсСильный — long tasks от большого bundle
CLS< 0,10,1 – 0,25> 0,25Косвенный — JS, вставляющий above-fold контент

Правило 100-170 КБ

Рекомендации Google Web Fundamentals: держи initial JS под 100-170 КБ gzip’d для fast first interactive на mid-range mobile. Математика: 170 КБ gzip’d разжимается примерно в 500 КБ. V8 парсит 200-400 КБ/сек на mid-range Android, значит parse занимает 1,5 с. Добавь compile и execute — итого 2-2,5 с CPU. Добавь 4G download ~500 мс — получается около 3 с до interactive. Это верхняя граница, удерживающая LCP под 2,5 с. Каждые дополнительные 100 КБ сверх неё добавляют примерно 300-500 мс к LCP на median устройстве.

Разные routes могут нести разные бюджеты: marketing homepage — жёстко (50-100 КБ), dashboard — средне (150-250 КБ), admin tools — мягче (300-500 КБ). Homepage несёт самый жёсткий cap, потому что это точка входа для конверсии.

Три инструмента: Lighthouse, PageSpeed Insights, RUM

Эти инструменты измеряют одни метрики, но с разных точек зрения.

Lighthouse запускает синтетический тест — DevTools или CLI — с CPU throttling. Надёжен для поимки регрессий в PR. Не field-данные; один синтетический запуск.

PageSpeed Insights — Google-managed Lighthouse плюс field-данные из CrUX-датасета (реальные агрегированные метрики от Chrome-пользователей на твоём домене). Полезен для public-facing анализа. Обновляется раз в день.

Real User Monitoring (RUM) — собственная выборка реальных юзеров через Web Vitals JS library, Sentry, Datadog RUM и подобные. Самый точный, но требует setup и бюджет. Senior pattern: Lighthouse в CI для поимки регрессий перед мержем; RUM в production для регрессий, которые CI пропустил; PageSpeed Insights ежеквартально для cross-reference.

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

INP заменил FID (First Input Delay) в марте 2024. FID измерял только первое взаимодействие; INP — worst-case за всю сессию. Страница, где первый клик быстрый, а пятый — медленный, получала «Good» по FID и «Poor» по INP. Изменение делает метрику сложнее для манипуляции за счёт быстрого обработчика только для первого события.

Викторина

P75 LCP команды — 3,2 с на mobile. Server TTFB — 80 мс. Наиболее вероятная причина?

Викторина

INP route — 380 мс. Bundle — 900 КБ uncompressed. После code splitting bundle до 200 КБ для этого route INP падает до 150 мс. Что улучшилось и почему?

Викторина

Почему CLS (Cumulative Layout Shift) почти не улучшается от уменьшения JS bundle?

Вспомните перед уходом
  1. 01
    Что измеряют LCP, INP и CLS? Назови порог «Good» для каждого.
  2. 02
    Почему быстрый TTFB сервера (80 мс) не гарантирует хороший LCP?
  3. 03
    Чем отличаются Lighthouse и RUM при поиске CWV-регрессий?
Итог

Core Web Vitals — field-метрики от реальных Chrome-пользователей. LCP и INP оба улучшаются при уменьшении JS bundle — время parse и execute задают нижнюю планку скорости paint и реакции. Правило 100-170 КБ gzip’d опирается на математику: каждые 100 КБ сверх неё добавляют 300-500 мс к LCP на mid-range mobile. У CLS отдельные root causes (картинки без размеров, шрифты, динамические вставки). Lighthouse ловит регрессии перед мержем; RUM ловит дрейф в production. Следующий урок посвящён code splitting — основной технике уменьшения per-route bundle.

Связанные уроки
встречается в159
Продолжить восхождение ↑Code splitting: route-level, component-level, vendor splitting
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources4
expand
  1. 01
  2. 02
  3. 03
  4. 04

Trademarks belong to their respective owners. Editorial reference only.