Core Web Vitals и производительность

Скорость и стабильность — измеримый фактор ранжирования. Разбираем три ключевые метрики и как их улучшать.

Core Web Vitals (CWV) — набор метрик Google, измеряющих реальный пользовательский опыт: скорость загрузки, стабильность вёрстки и отзывчивость. Они — официальный сигнал ранжирования.

Три метрики

МетрикаЧто измеряетХорошо
LCP (Largest Contentful Paint)когда отрисовался крупнейший элемент экрана≤ 2.5 с
CLS (Cumulative Layout Shift)насколько «прыгает» вёрстка при загрузке≤ 0.1
INP (Interaction to Next Paint)задержку отклика на действия пользователя≤ 200 мс

LCP — скорость показа главного

LCP фиксирует, когда пользователь увидел основной контент (обычно крупную картинку или заголовок). Что портит LCP: тяжёлые неоптимизированные картинки, медленный сервер, блокирующий рендер CSS/JS. Что чинит: оптимизация картинок (WebP, нужный размер), CDN, приоритетная загрузка ключевого ресурса.

CLS — стабильность вёрстки

CLS наказывает за «скачки»: контент сдвигается, когда дозагружается картинка без размеров, шрифт или баннер. Бесит, когда вы целитесь в кнопку, а она «уезжает». Чинится тем, что мы уже проходили: width/height у картинок, резервирование места под динамические блоки.

INP — отзывчивость

INP измеряет, как быстро страница реагирует на клики и ввод. Высокий INP — признак тяжёлого JS, который блокирует главный поток. Чинится разбиением тяжёлых задач, ленивой загрузкой неважного JS, отказом от лишних библиотек.

Как работает под капотом: оценка по порогам

CWV оценивает каждую метрику по порогам «хорошо / нужно улучшить / плохо». Реализуем эту классификацию:

def rate(metric, value):
    thresholds = {
        "LCP": (2.5, 4.0),   # секунды
        "CLS": (0.1, 0.25),  # безразмерная
        "INP": (200, 500),   # миллисекунды
    }
    good, poor = thresholds[metric]
    if value <= good:
        return "хорошо"
    if value <= poor:
        return "нужно улучшить"
    return "плохо"

print("LCP 2.1с:", rate("LCP", 2.1))
print("LCP 3.5с:", rate("LCP", 3.5))
print("CLS 0.3: ", rate("CLS", 0.3))
print("INP 150мс:", rate("INP", 150))

Вывод:

LCP 2.1с: хорошо
LCP 3.5с: нужно улучшить
CLS 0.3:  плохо
INP 150мс: хорошо

Чем измерять

  • Lighthouse (в DevTools, вкладка Lighthouse, или CLI) — лабораторный замер на вашей машине; удобно для отладки.
  • PageSpeed Insights — Lighthouse + полевые данные реальных пользователей (CrUX).
  • Search Console → отчёт Core Web Vitals — агрегированные полевые данные по всему сайту.

Важно различать лабораторные (синтетический прогон) и полевые (реальные пользователи) данные — для ранжирования Google использует именно полевые.

Частые ошибки

  • Оптимизация только под лабораторный Lighthouse — зелёный балл в DevTools, но полевые данные плохие.
  • Картинки без размеров — главный источник плохого CLS.
  • Тонны клиентского JS — бьёт по INP и LCP.
  • Игнор мобильных — на слабых телефонах метрики хуже, а индексация mobile-first.

Итог

  • Core Web Vitals (LCP, CLS, INP) — официальный сигнал ранжирования, измеряющий реальный опыт.
  • Целимся: LCP ≤ 2.5 с, CLS ≤ 0.1, INP ≤ 200 мс; чиним картинками, резервированием места, лёгким JS.
  • Меряйте Lighthouse/PageSpeed, но ориентируйтесь на полевые данные — их использует Google.
Проверьте себя
1. Что измеряет метрика LCP (Largest Contentful Paint)?
AЗадержку отклика на клик
BКогда отрисовался крупнейший элемент экрана (скорость показа основного контента)
CНасколько прыгает вёрстка
DРазмер JS-бандла
2. Какая метрика отвечает за «скачки» вёрстки при загрузке?
ALCP
BINP
CCLS (Cumulative Layout Shift)
DTTFB
3. Какие данные Core Web Vitals использует Google для ранжирования?
AТолько лабораторные данные из Lighthouse в DevTools
BПолевые данные реальных пользователей (CrUX)
CСреднее по всем сайтам в интернете
DДанные, заданные вручную в robots.txt