Core Web Vitals: измерение и улучшение веб-производительности
Вы создали современное веб-приложение, но пользователи жалуются на медлительность. Поисковые рейтинги тоже могут пострадать. Core Web Vitals (CWV) — это метрики Google для оценки пользовательского опыта: Largest Contentful Paint (LCP), Interaction to Next Paint (INP) и Cumulative Layout Shift (CLS). Это руководство покажет, как точно их измерять и эффективно улучшать.
Что такое Core Web Vitals?
Core Web Vitals — это три метрики, количественно оценивающие ключевые аспекты пользовательского опыта:
- LCP измеряет производительность загрузки. Он отмечает момент, когда самый крупный элемент контента (изображение, текстовый блок, видео) становится видимым. Цель — ≤2,5 секунды.
- INP измеряет отзывчивость. Он фиксирует задержку всех взаимодействий (клики, нажатия, ввод с клавиатуры) и сообщает о наихудшей (или близкой к наихудшей) задержке. Цель — ≤200 миллисекунд.
- CLS измеряет визуальную стабильность. Он количественно оценивает неожиданные сдвиги макета во время загрузки. Цель — ≤0,1.
Эти метрики измеряются в полевых условиях (от реальных пользователей) и в лабораторных условиях (в контролируемой среде). Важны оба подхода.
Как измерять Core Web Vitals
Для диагностики проблем нужны как полевые, так и лабораторные данные.
Полевые данные (мониторинг реальных пользователей)
Полевые данные отражают реальный опыт пользователей на разных устройствах и сетях. Используйте следующие источники:
- Chrome User Experience Report (CrUX): публичный набор данных о метриках реальных пользователей для миллионов сайтов. Доступен через PageSpeed Insights или CrUX API.
- Google Search Console: отчёт Core Web Vitals показывает группы URL, требующие внимания, на основе данных CrUX.
- JavaScript-библиотека Web Vitals: добавьте библиотеку
web-vitalsна свой сайт и отправляйте измерения в вашу аналитику.
import {onLCP, onINP, onCLS} from 'web-vitals';
function sendToAnalytics(metric) {
const body = JSON.stringify(metric);
navigator.sendBeacon('/analytics', body);
}
onLCP(sendToAnalytics);
onINP(sendToAnalytics);
onCLS(sendToAnalytics);
Лабораторные данные (синтетическое тестирование)
Лабораторные инструменты имитируют загрузку в контролируемой среде, что делает их отличными для отладки и интеграции в CI.
- Lighthouse: встроен в Chrome DevTools, доступен как CLI и интегрирован в PageSpeed Insights. Он сообщает лабораторные метрики и возможности для улучшения.
- WebPageTest: расширенное тестирование с настраиваемыми сетевыми условиями и раскадровкой.
- Панель Performance в Chrome DevTools: записывайте и анализируйте производительность во время выполнения, включая длинные задачи, влияющие на INP.
Лучшая практика: используйте лабораторные данные для выявления исправлений, а полевые — для проверки их влияния.
Улучшение Largest Contentful Paint (LCP)
LCP обычно определяется главным изображением или крупным текстовым блоком. Оптимизируйте их:
- Оптимизируйте ресурс LCP: сжимайте изображения (используйте WebP/AVIF), предоставляйте адаптивные размеры с помощью
srcsetи предзагружайте изображение LCP, если оно критично. - Устраните блокирующие рендеринг ресурсы: встраивайте критический CSS, откладывайте некритический CSS и JavaScript.
- Улучшите время ответа сервера (TTFB): используйте CDN, включите кэширование и оптимизируйте запросы к бэкенду.
- Сократите рендеринг на стороне клиента: для SPA рассмотрите серверный рендеринг (SSR) или статическую генерацию для начального представления.
Пример: предзагрузка изображения LCP:
<link rel="preload" as="image" href="/hero.avif" imagesrcset="/hero-480.avif 480w, /hero-800.avif 800w" imagesizes="(max-width: 600px) 480px, 800px">
Улучшение Interaction to Next Paint (INP)
INP измеряет задержку между взаимодействием пользователя и следующей отрисовкой. Длинные задачи и тяжёлый JavaScript — частые виновники.
- Разбивайте длинные задачи: используйте
setTimeout,requestIdleCallbackили API scheduler, чтобы уступить главному потоку. - Оптимизируйте обработчики событий: применяйте debounce или throttle для дорогих обработчиков; избегайте layout thrashing.
- Сократите время выполнения JavaScript: разделяйте код, применяйте tree-shaking и откладывайте некритические скрипты.
- Используйте веб-воркеры для ресурсоёмких вычислений.
Пример: уступка главному потоку:
async function yieldToMain() {
if ('scheduler' in window && 'yield' in scheduler) {
return scheduler.yield();
}
return new Promise(resolve => setTimeout(resolve, 0));
}
async function handleClick() {
// ... do some work
await yieldToMain();
// ... continue
}
Улучшение Cumulative Layout Shift (CLS)
CLS возникает, когда элементы неожиданно смещаются. Предотвратите это:
- Всегда указывайте атрибуты width и height для изображений и видео или используйте CSS
aspect-ratio. - Резервируйте место для динамического контента (реклама, встраиваемые элементы, iframe) с помощью min-height или плейсхолдеров.
- Избегайте вставки контента над существующим контентом, если это не вызвано взаимодействием с пользователем.
- Используйте
font-display: optionalили предзагрузку шрифтов, чтобы избежать сдвигов FOIT/FOUT.
Пример: резервирование места для рекламы:
<div>
<!-- ad loads here -->
</div>
Инструменты и рабочий процесс для непрерывного улучшения
Производительность — это не разовое исправление. Интегрируйте измерения в свой рабочий процесс:
- Установите бюджеты: используйте Lighthouse CI для соблюдения порогов в пул-реквестах.
- Мониторьте полевые данные: настройте дашборды с CrUX или собственным RUM.
- Расставляйте приоритеты исправлений: сосредоточьтесь на метриках с наибольшим разрывом до «хороших» порогов.
- Тестируйте на реальных устройствах: эмулируйте мобильные устройства среднего уровня, чтобы выявлять проблемы.
Для быстрой проверки запустите свою страницу через PageSpeed Insights; он объединяет лабораторные и полевые данные.
FAQ
Каковы текущие пороги для Core Web Vitals?
LCP: хорошо ≤2,5 с, требует улучшения ≤4 с, плохо >4 с. INP: хорошо ≤200 мс, требует улучшения ≤500 мс, плохо >500 мс. CLS: хорошо ≤0,1, требует улучшения ≤0,25, плохо >0,25.
Как часто обновляются данные CrUX?
Данные CrUX обновляются ежедневно, но набор данных отражает скользящее 28-дневное окно. Search Console обновляется периодически.
Можно ли улучшить Core Web Vitals без изменения дизайна?
Да. Многие улучшения носят технический характер: оптимизация изображений, откладывание скриптов, резервирование места для динамического контента и сокращение работы главного потока.
Готовы проанализировать производительность вашего сайта? Используйте наш анализатор логов Nginx, чтобы выявить медленные ответы сервера, влияющие на TTFB и LCP.