Core Web Vitals - три метрики Google, що описують досвід реального користувача. Вони впливають на ранжування в пошуку й показуються в Search Console.
| Метрика | Що вимірює | Добре |
|---|---|---|
| LCP (Largest Contentful Paint) | коли відмалювався найбільший видимий елемент: головне зображення, заголовок | до 2,5 с |
| INP (Interaction to Next Paint) | затримка від взаємодії (клік, натискання клавіші) до наступного відмальовування - найгірша з типових за весь візит | до 200 мс |
| CLS (Cumulative Layout Shift) | наскільки вміст «стрибає» під час завантаження | до 0,1 |
Оцінка - за 75-м перцентилем реальних відвідувань: сторінка «добра», якщо щонайменше 75% візитів укладаються в поріг. INP замінив FID у 2024 році: FID вимірював лише першу взаємодію й лише затримку до початку обробки.
Як вимірювати:
- польові дані (від реальних користувачів): звіт CrUX, Search Console, PageSpeed Insights, власний збір через бібліотеку
web-vitals:
import { onLCP, onINP, onCLS } from 'web-vitals';
const send = (metric) => navigator.sendBeacon('/vitals', JSON.stringify(metric));
onLCP(send);
onINP(send);
onCLS(send);
- лабораторні дані: Lighthouse, вкладка Performance у DevTools - відтворювані, але не замінюють польові (інший пристрій і мережа). INP у лабораторії майже не виміряти - немає реальних взаємодій.
Типові причини й виправлення:
LCP:
- головне зображення завантажується пізно -
fetchpriority="high", безloading="lazy"для першого екрана,preload; - повільна відповідь сервера (TTFB) - кешування сторінок, CDN;
- блокуючі CSS і JavaScript - менше критичного CSS,
deferдля скриптів; - шрифти, що затримують текст, -
font-display: swap.
INP:
- довгі задачі в головному потоці - розбити роботу (
scheduler.yield(),setTimeout), перенести обчислення у Web Worker; - важкі обробники подій - оновити інтерфейс одразу, а повільну роботу виконати після відмальовування;
- великий DOM і дорогі перерахунки стилів;
- сторонні скрипти (аналітика, чати, реклама).
CLS:
- зображення й відео без розмірів -
width/heightчиaspect-ratio; - вміст, що вставляється над наявним (банери, рекламні блоки), - зарезервувати місце;
- зміна шрифту після завантаження -
size-adjustдля запасного шрифту.
Для Laravel-сайту: Vite з розділенням коду, атрибути fetchpriority, width, height у Blade-компонентах зображень, Livewire wire:navigate для швидких переходів і кешування HTML на краю мережі для гостей.