Веб-производительность
Core Web Vitals: полное руководство 2026

LCP, INP и CLS — три метрики Google, которые напрямую влияют на ранжирование. Как измерить, диагностировать и улучшить каждую из них.
Core Web Vitals (CWV) — набор метрик Google, измеряющих реальный пользовательский опыт: скорость загрузки, отзывчивость интерфейса и визуальную стабильность. С мая 2021 они входят в Page Experience и учитываются алгоритмом ранжирования.
Три метрики применяются к каждому URL отдельно — хорошие показатели главной страницы не помогут карточкам товаров. Данные Google берёт из Chrome UX Report (реальные пользователи), а не из лабораторных тестов.
Что такое Core Web Vitals
LCP — хорошо
Крупнейший элемент отрисован
INP — хорошо
Интерфейс отреагировал на ввод
CLS — хорошо
Минимальный сдвиг разметки
Порог оценки
Доля пользователей в зелёной зоне
История: от FID к INP
Google ввёл Core Web Vitals в 2020 году с тремя метриками: LCP, FID (First Input Delay) и CLS. FID измерял задержку первого нажатия — это ценная метрика, но она охватывала лишь часть интерактивности страницы.
Google объявляет три метрики: LCP, FID, CLS. Инструменты начинают поддерживать новые показатели.
CWV официально входят в алгоритм ранжирования. Rollout завершается в августе 2021.
Interaction to Next Paint заменяет First Input Delay. INP охватывает все взаимодействия на странице, а не только первое.
Сайты с активным JS (SPA, e-commerce, фильтры) ощутили давление INP. Оптимизация Long Tasks стала приоритетом.
LCP — Largest Contentful Paint
LCP фиксирует момент, когда самый крупный видимый контентный блок страницы полностью отрисован. Обычно это hero-изображение, обложка статьи или крупный заголовок H1.
| Значение LCP | Оценка | Что делать |
|---|---|---|
| ≤ 2,5 с | Хорошо | Поддерживать, мониторить в GSC |
| 2,5 – 4,0 с | Нужно улучшение | Оптимизировать изображения, TTFB |
| > 4,0 с | Плохо | Критический приоритет, аудит немедленно |
Основные причины медленного LCP
- Медленный TTFB (сервер, CDN, отсутствие кеширования) — до 40% времени LCP
- Изображение не приоритизировано: нет
fetchpriority="high"на hero-img - Hero-изображение не предзагружено (
<link rel="preload">) - Render-blocking CSS/JS задерживает первую отрисовку
- Изображение слишком большое: нет WebP/AVIF, нет
srcset - LCP-элемент находится за JS-рендером (React SSR не завершён к моменту LCP)
<!-- Приоритизация LCP-изображения -->
<link rel="preload" as="image" href="/hero.webp" fetchpriority="high" />
<img
src="/hero.webp"
alt="Hero"
fetchpriority="high"
loading="eager"
decoding="async"
width="1280"
height="720"
/>loading="lazy" на hero-изображение — браузер отложит его загрузку и LCP вырастет. lazy подходит только для изображений ниже fold.INP — Interaction to Next Paint
INP измеряет задержку от любого взаимодействия пользователя (клик, нажатие клавиши, тач) до следующей визуальной отрисовки страницы. В отличие от FID, INP учитывает все взаимодействия за сессию и берёт наихудшее (с поправкой на выбросы).
Что ломает INP
- Long Tasks > 50 мс блокируют главный поток — браузер не успевает обработать ввод
- Тяжёлые обработчики событий: синхронный setState в React, массовый DOM update
- Нет
scheduler.yield()илиsetTimeout(0)для разбивки длинных задач - Сторонние скрипты (чат, реклама, аналитика) занимают main thread
- Анимации через JS вместо CSS
transform/opacity
// Разбивка Long Task через scheduler.yield()
async function processLargeList(items) {
for (let i = 0; i < items.length; i++) {
processItem(items[i]);
// Уступаем main thread каждые 50 элементов
if (i % 50 === 0) {
await scheduler.yield();
}
}
}CLS — Cumulative Layout Shift
CLS — безразмерная метрика, описывающая суммарный неожиданный сдвиг элементов страницы. Формула: impact fraction × distance fraction. Сдвиг нажатой кнопки не считается — только то, что сместилось без действия пользователя.
| Значение CLS | Оценка | Типичная причина |
|---|---|---|
| ≤ 0,1 | Хорошо | Зарезервировано место под все элементы |
| 0,1 – 0,25 | Нужно улучшение | Шрифты без font-display: swap, баннеры |
| > 0,25 | Плохо | Изображения без размеров, динамические вставки |
Частые источники CLS
- Изображения без атрибутов
widthиheight— браузер не знает размер до загрузки - Веб-шрифты без
font-display: optionalилиswap— FOUT сдвигает текст - Динамически вставляемые баннеры, cookie-уведомления сверху страницы
- CSS-анимации, меняющие
top/left/marginвместоtransform - Ads без зарезервированного места (
min-heightна контейнер)
/* Резервируем место под рекламный блок */
.ad-container {
min-height: 250px;
width: 100%;
}
/* Анимация без CLS: только transform/opacity */
.card:hover {
transform: translateY(-4px);
/* Нельзя: margin-top: -4px — это сдвиг разметки */
}Влияние на ранжирование
Google подтвердил: CWV — один из сигналов Page Experience, который участвует в ранжировании. Но это tiebreaker, а не основной фактор. Страница с отличным контентом, но плохим CWV обгонит страницу с хорошим CWV, но слабым контентом.
Важнее косвенный эффект: быстрые страницы снижают отказы, увеличивают глубину сессии и конверсию. Бизнес-кейс CWV сильнее SEO-кейса. Amazon посчитал: +100 мс к LCP = -1% выручки.
Как измерять CWV
Существуют два типа данных: лабораторные (симуляция — Lighthouse, WebPageTest) и полевые (реальные пользователи — CrUX, GSC). Google ранжирует по полевым данным. Лаборатория — для диагностики.
| Тип | Инструмент | Что показывает | Применение |
|---|---|---|---|
| Полевые | Google Search Console | CWV по всем URL сайта (p75) | Приоритизация проблемных страниц |
| Полевые | CrUX Dashboard (Looker) | Тренды 28-дневным окном | Отслеживание прогресса |
| Лабораторные | PageSpeed Insights | LCP/INP/CLS + рекомендации | Диагностика конкретного URL |
| Лабораторные | Lighthouse (DevTools) | Детальный waterfall, трейс | Глубокий анализ причин |
| Лабораторные | WebPageTest | Видеозапись загрузки, filmstrip | Сравнение до/после |
Инструменты диагностики
| Инструмент | Бесплатно | LCP | INP | CLS | Полевые данные |
|---|---|---|---|---|---|
| Google Search Console | Да | ✓ | ✓ | ✓ | ✓ |
| PageSpeed Insights | Да | ✓ | ✓ | ✓ | ✓ (CrUX) |
| Chrome DevTools | Да | ✓ | ✓ | ✓ | — |
| Lighthouse CI | Да | ✓ | ✓ | ✓ | — |
| WebPageTest | Да (лимиты) | ✓ | ✓ | ✓ | — |
| SpeedCurve | Платно | ✓ | ✓ | ✓ | ✓ |
| Sentry (web-vitals SDK) | Freemium | ✓ | ✓ | ✓ | ✓ |
// web-vitals v4 — сбор реальных CWV
import { onLCP, onINP, onCLS } from 'web-vitals';
function sendToAnalytics({ name, value, id }) {
// Отправка в GA4
gtag('event', name, {
value: Math.round(name === 'CLS' ? value * 1000 : value),
metric_id: id,
metric_delta: value,
});
}
onLCP(sendToAnalytics);
onINP(sendToAnalytics);
onCLS(sendToAnalytics);Чеклист оптимизации
LCP
- Добавить
fetchpriority="high"и убратьloading="lazy"с hero-изображения - Добавить
<link rel="preload" as="image">для hero в<head> - Конвертировать изображения в WebP или AVIF, настроить
srcset - Снизить TTFB до ≤ 800 мс: CDN, кеширование, Edge SSR
- Убрать render-blocking скрипты из
<head>(async/defer/module) - Настроить
Cache-Control: max-age=31536000для статических ресурсов
INP
- Профилировать Long Tasks в Chrome DevTools → Performance → Main Thread
- Разбить задачи > 50 мс через
scheduler.yield()илиsetTimeout(0) - Дебаунсировать обработчики
input/scroll(16–100 мс) - Оптимизировать React:
useMemo,useCallback,React.memo, виртуализация списков - Перенести сторонние скрипты в Web Worker или загружать после LCP
- CSS-анимации только через
transformиopacity
CLS
- Указать
widthиheightна всех<img>— браузер зарезервирует место - Использовать
aspect-ratioдля контейнеров с неизвестными размерами - Настроить
font-display: optionalдля критичных шрифтов - Зарезервировать
min-heightдля рекламных блоков и динамического контента - Размещать уведомления (cookie, баннеры) снизу, не сверху страницы
- Проверить FOUT: шрифты без fallback сдвигают текст при подгрузке