Что Такое Core Web Vitals?
Core Web Vitals — это набор из трёх метрик производительности, определённых Google, которые измеряют реальный пользовательский опыт на веб-страницах. Они напрямую влияют на поисковые рейтинги и представляют собой то, что Google считает наиболее важными аспектами взаимодействия с страницей.
Для QA-инженера понимание этих метрик важно, потому что:
- Они влияют на SEO-рейтинги (видимость в поиске)
- Они коррелируют с вовлечённостью пользователей и конверсией
- Они предоставляют объективные, измеримые критерии для приёмочного тестирования производительности
- Они всё чаще включаются в бюджеты производительности и критерии релиза
Три Core Web Vitals
LCP — Largest Contentful Paint
Что измеряет: Время от начала загрузки страницы до рендеринга самого большого элемента контента во viewport.
Хороший порог: Менее 2.5 секунд
Что считается «самым большим элементом»:
- Изображения (
<img>,<image>внутри SVG) - Постеры видео
- Фоновые изображения, загруженные через
url() - Блочные текстовые элементы (
<h1>,<p>и т.д.)
Типичные причины плохого LCP:
- Медленное время ответа сервера (высокий TTFB)
- JavaScript и CSS, блокирующие рендеринг
- Медленная загрузка ресурсов (большие изображения, неоптимизированные шрифты)
- Задержки рендеринга на стороне клиента (SPA-фреймворки)
INP — Interaction to Next Paint
Что измеряет: Отзывчивость страницы на действия пользователя (клики, тапы, нажатия клавиш) на протяжении всего жизненного цикла. INP — это наихудшая задержка взаимодействия, исключая выбросы.
Хороший порог: Менее 200 миллисекунд
Как это работает:
- Пользователь нажимает кнопку
- Браузер обрабатывает event handler (JavaScript)
- Браузер обновляет визуальное отображение
- INP измеряет общее время от шага 1 до шага 3
Типичные причины плохого INP:
- Длительные JavaScript-задачи, блокирующие основной поток
- Избыточный размер DOM (>1500 элементов)
- Сложные event handlers без оптимизации
- Сторонние скрипты, конкурирующие за основной поток
CLS — Cumulative Layout Shift
Что измеряет: Сумму всех неожиданных сдвигов макета за всё время жизни страницы. Сдвиг макета происходит, когда видимый элемент меняет позицию от одного кадра к следующему без взаимодействия пользователя.
Хороший порог: Менее 0.1
Расчёт CLS:
Оценка Layout Shift = Доля воздействия × Доля расстояния
- Доля воздействия: Площадь viewport, затронутая сдвигом
- Доля расстояния: Насколько далеко сместился элемент относительно viewport
Типичные причины плохого CLS:
- Изображения и реклама без явных размеров width/height
- Динамически внедряемый контент выше существующего
- Веб-шрифты, вызывающие перерисовку текста (FOIT/FOUT)
- Поздно загружающиеся встраиваемые элементы третьих сторон
Измерение Core Web Vitals
Лабораторные Данные (Разработка/Тестирование)
Лабораторные данные собираются в контролируемой среде. Они воспроизводимы, но не отражают реальные условия пользователей.
| Инструмент | LCP | INP | CLS | Примечания |
|---|---|---|---|---|
| Chrome DevTools (вкладка Performance) | Да | Да | Да | Наиболее детальный |
| Lighthouse | Да | Нет (использует TBT) | Да | Агрегированные оценки |
| PageSpeed Insights | Да | Да | Да | Лаб + полевые данные |
| WebPageTest | Да | Частично | Да | Мультилокационное тестирование |
Полевые Данные (Реальные Пользователи)
Полевые данные поступают от реальных пользователей сайта. Они отражают реальные условия, но требуют объёма трафика.
| Источник | Тип данных | Доступность |
|---|---|---|
| Chrome UX Report (CrUX) | Скользящее среднее за 28 дней | Публичный (сайты с достаточным трафиком) |
| PageSpeed Insights | Данные CrUX с обзором по домену | Публичный |
| Search Console | Отчёт Core Web Vitals | Только владельцы сайта |
| JavaScript-библиотека web-vitals | Данные в реальном времени по каждому пользователю | Требует реализации |
Использование Вкладки Performance в DevTools
- Откройте DevTools > вкладка Performance
- Нажмите на шестерёнку и включите Web Vitals
- Нажмите Record и перезагрузите страницу
- Остановите запись после полной загрузки страницы
- Найдите дорожку Web Vitals с маркерами LCP, CLS
- Панель Summary показывает детализацию по времени
Стратегии Тестирования Core Web Vitals
Чек-лист Тестирования LCP
- Измерьте LCP на лендинге, страницах продуктов и статьях блога
- Тестируйте с ограниченной сетью (Slow 3G, Fast 3G, 4G)
- Тестируйте с ограничением CPU (4x, 6x замедление)
- Проверьте, что LCP-элемент — это нужное hero-изображение/текст, а не случайный элемент
- Убедитесь, что LCP не деградирует после новых деплоев
- Тестируйте с пустым и прогретым кэшем
Чек-лист Тестирования INP
- Кликните на каждый интерактивный элемент и отметьте, если какой-то ощущается медленным
- Протестируйте отправку форм, выпадающие меню и открытие модальных окон
- Тестируйте во время загрузки страницы (частично загруженное состояние)
- Используйте DevTools Performance для поиска длинных задач (>50 мс)
- Тестируйте с ограничением CPU для имитации слабых устройств
Чек-лист Тестирования CLS
- Наблюдайте за загрузкой страницы от начала до конца — фиксируйте визуальные прыжки
- Прокрутите всю страницу, наблюдая за сдвигами
- Тестируйте с медленной сетью для выявления сдвигов при прогрессивной загрузке
- Проверьте, что у всех изображений есть явные атрибуты width и height
- Тестируйте с отключёнными блокировщиками рекламы (реклама — частая причина CLS)
- Проверьте загрузку шрифтов — перерисовывается ли текст при загрузке веб-шрифтов?
Упражнение: Аудит Core Web Vitals
Проведите аудит Core Web Vitals на веб-сайте по вашему выбору (сайт вашей компании, личный проект или известный публичный сайт).
Шаг 1: Сбор Лабораторных Данных
Откройте сайт в Chrome с DevTools:
- Перейдите на вкладку Performance
- Включите Web Vitals в настройках
- Настройте throttling: CPU 4x замедление, сеть Fast 3G
- Запишите свежую загрузку страницы (сначала очистите кэш через Ctrl+Shift+Delete)
- Зафиксируйте следующие значения:
| Метрика | Значение | Хороший порог | Пройдено/Не пройдено |
|---|---|---|---|
| LCP | ___с | <2.5с | |
| CLS | ___ | <0.1 | |
| TBT (прокси для INP) | ___мс | <200мс |
Шаг 2: Определение LCP-Элемента
В записи Performance:
- Найдите маркер LCP на дорожке Web Vitals
- Кликните на него, чтобы увидеть, какой элемент вызвал LCP
- Задокументируйте: Какой это элемент? Является ли он ожидаемым hero-контентом?
Шаг 3: Поиск Сдвигов Макета
- В записи найдите розовые полосы в строке Experience
- Кликните на каждый layout shift, чтобы увидеть, какие элементы сдвинулись
- Задокументируйте каждый сдвиг: Какой элемент? На сколько сдвинулся? Что стало причиной?
Шаг 4: Тестирование Взаимодействий
- Запишите новую сессию performance
- Кликните на 5-10 интерактивных элементов (кнопки, ссылки, меню, поля формы)
- Ищите длинные задачи (жёлтые блоки >50 мс), вызванные вашими взаимодействиями
- Задокументируйте любое взаимодействие, которое занимает более 200 мс для визуального отклика
Решение: Пример Отчёта об Аудите
Проверенный сайт: example-ecommerce.com (главная страница)
Лабораторные результаты (Chrome, CPU 4x, Fast 3G):
| Метрика | Значение | Порог | Статус |
|---|---|---|---|
| LCP | 3.8с | <2.5с | НЕ ПРОЙДЕНО |
| CLS | 0.24 | <0.1 | НЕ ПРОЙДЕНО |
| TBT | 890мс | <200мс | НЕ ПРОЙДЕНО |
Анализ LCP:
- LCP-элемент: Hero-баннер (JPEG 2.4 МБ)
- Корневая причина: Изображение не оптимизировано, нет responsive srcset, нет preload hint
- Исправление: Конвертировать в WebP, добавить
loading="eager", добавить<link rel="preload">, реализовать srcset для адаптивных размеров
Найденные проблемы CLS:
| Элемент | Оценка сдвига | Причина |
|---|---|---|
| Hero-изображение | 0.12 | Нет атрибутов width/height |
| Рекламный баннер | 0.08 | Внедрён после загрузки страницы |
| Cookie-согласие | 0.04 | Сдвигает контент вниз |
Проблемы INP/TBT:
- Основной поток заблокирован на 450 мс пакетом аналитики
- Инициализация карусели товаров блокирует на 320 мс
- Виджет чата третьей стороны добавляет 120 мс к загрузке
- Исправление: Отложить аналитику, lazy-load для карусели, загружать виджет чата по взаимодействию
Приоритет рекомендаций:
- Оптимизировать hero-изображение (LCP: ожидаемое улучшение с 3.8с до ~1.8с)
- Добавить размеры изображениям (CLS: ожидаемое улучшение с 0.24 до ~0.04)
- Отложить некритичный JavaScript (TBT: ожидаемое улучшение с 890мс до ~200мс)
Автоматизированный Мониторинг Core Web Vitals
Для непрерывного контроля качества интегрируйте Core Web Vitals в CI/CD pipeline:
# Используя Lighthouse CI
npm install -g @lhci/cli
# Запуск Lighthouse с assertions
lhci autorun --config=lighthouserc.json
Пример lighthouserc.json с порогами Core Web Vitals:
{
"ci": {
"assert": {
"assertions": {
"largest-contentful-paint": ["error", {"maxNumericValue": 2500}],
"cumulative-layout-shift": ["error", {"maxNumericValue": 0.1}],
"total-blocking-time": ["error", {"maxNumericValue": 200}]
}
}
}
}
Это проваливает сборку при превышении порогов Core Web Vitals, предотвращая деградацию производительности в продакшене.
Ключевые Выводы
- Core Web Vitals состоит из трёх метрик: LCP (загрузка), INP (интерактивность) и CLS (визуальная стабильность)
- INP заменил FID в марте 2024 года и измеряет отзывчивость на протяжении всего жизненного цикла страницы
- Используйте как лабораторные данные (DevTools, Lighthouse), так и полевые данные (CrUX, Search Console) для полной картины
- Каждая метрика требует специфических стратегий тестирования — не ограничивайтесь проверкой агрегированной оценки
- Интегрируйте пороги Core Web Vitals в CI/CD для предотвращения регрессий
- Плохие Core Web Vitals напрямую влияют на SEO-рейтинги и вовлечённость пользователей