Зачем измерять LCP
LCP (Largest Contentful Paint) - время, за которое браузер отрисовывает самый крупный видимый элемент на экране: hero-изображение, баннер, основной заголовок или крупный блок текста. Google использует LCP как один из трёх Core Web Vitals для оценки скорости загрузки. Если LCP больше 2,5 секунд - страница считается медленной, и это напрямую влияет на ранжирование.
По моему опыту, LCP - самая понятная метрика из трёх Core Web Vitals. Пользователь открывает страницу и ждёт, пока появится основной контент. Если ждать дольше 2,5 секунд - часть аудитории уходит. В коммерческих нишах каждая секунда задержки снижает конверсию на 7-12%. А для Яндекса скорость загрузки тоже входит в поведенческие факторы: медленный сайт получает больше отказов, что снижает позиции.
Целевые значения LCP
- Хорошо: до 2,5 секунд - страница загружается быстро, Google не понижает позиции за скорость
- Требует улучшения: 2,5-4 секунды - жёлтая зона, нужна оптимизация, позиции могут страдать
- Плохо: больше 4 секунд - критическая проблема, прямые потери трафика и позиций в обоих поисковиках
Пошаговая инструкция: как измерить LCP
Шаг 1. Проверьте полевые данные в PageSpeed Insights
Откройте PageSpeed Insights и введите URL страницы. В верхней части отчёта отображаются реальные данные пользователей (CrUX - Chrome User Experience Report). Это полевые метрики - именно их Google учитывает при ранжировании. Если у сайта достаточно трафика из Chrome, вы увидите распределение LCP по зонам: зелёная, жёлтая, красная.
Полевые данные - приоритет. Лабораторный тест может показывать отличные результаты, но если реальные пользователи заходят с медленных смартфонов через мобильный интернет - полевой LCP будет хуже. Именно полевые данные определяют, получит ли сайт бонус за скорость в ранжировании.
Шаг 2. Запустите лабораторный тест в Lighthouse
В Chrome DevTools (F12) перейдите на вкладку Lighthouse. Выберите категорию Performance, режим Mobile и нажмите Analyze. В результатах найдите строку Largest Contentful Paint - это лабораторное значение. Оно полезно для диагностики: лабораторный тест стабилен и воспроизводим, можно сравнивать результаты до и после оптимизации.
Для чистого теста используйте режим инкогнито - расширения браузера искажают результат. Также учитывайте, что мощность вашего компьютера влияет на лабораторные метрики. Для объективности используйте несколько инструментов.
Шаг 3. Определите LCP-элемент
В отчёте Lighthouse раскройте секцию «Largest Contentful Paint element». Там указан конкретный HTML-элемент, который браузер определил как самый крупный видимый. Чаще всего это:
- Hero-изображение в шапке страницы
- Фоновое изображение, заданное через CSS (background-image)
- Крупный блок текста (заголовок H1 или первый абзац)
- Видео-постер или первый кадр встроенного видео
Запомните этот элемент - именно его загрузку нужно ускорять в первую очередь. Оптимизация любых других элементов не повлияет на LCP, пока самый крупный грузится медленно.
Шаг 4. Проверьте данные в Google Search Console
В Search Console откройте отчёт «Основные интернет-показатели» (Core Web Vitals). Здесь собраны данные по всем страницам сайта, сгруппированные по статусу. Отчёт показывает тренд за 90 дней - можно отследить, улучшается ситуация после ваших оптимизаций или ухудшается.
Страницы с одинаковыми проблемами группируются вместе. Если у вас 50 страниц с плохим LCP и все они используют один шаблон - достаточно оптимизировать шаблон один раз, чтобы исправить все 50 страниц.
Шаг 5. Используйте Web Vitals Extension для быстрого мониторинга
Установите расширение Web Vitals для Chrome. Оно показывает LCP, CLS и INP в реальном времени при обычном просмотре сайта. Удобно для быстрой проверки отдельных страниц без запуска полного аудита.
Основные причины медленного LCP и как их исправить
Медленный ответ сервера (TTFB)
TTFB (Time to First Byte) - время от запроса до первого байта ответа сервера. Если сервер отвечает дольше 600 мс - LCP автоматически будет плохим, потому что браузер даже не начал получать HTML.
Проверьте TTFB в Lighthouse (секция «Server Response Time»). Решения по приоритету:
- Серверное кеширование страниц. Для WordPress - плагины WP Super Cache, W3 Total Cache или LiteSpeed Cache (если сервер на LiteSpeed). Кешированная страница отдаётся за 50-100 мс вместо 500-2000 мс.
- Object Cache (Redis или Memcached). Кеширует результаты запросов к базе данных. На сайтах с большим количеством плагинов это может ускорить генерацию страницы в 3-5 раз.
- CDN (Content Delivery Network). Раздаёт статику (CSS, JS, изображения) с ближайшего к пользователю сервера. Для российской аудитории хорошо работают Cloudflare, а также CDN от Selectel и VK Cloud.
- Переход на более быстрый хостинг. Если TTFB стабильно выше 1 секунды даже с кешем - проблема в хостинге. Связка nginx + PHP-FPM + Redis на VPS даёт TTFB 50-200 мс для WordPress.
Пример из практики: на одном проекте перевод с shared-хостинга на VPS с nginx и Redis уменьшил TTFB с 1800 мс до 120 мс. LCP упал с 4,2 до 1,8 секунд на мобильных. Это было самое результативное изменение за весь проект - ни одна оптимизация изображений не дала бы такого эффекта при медленном сервере.
Тяжёлые изображения - главная причина плохого LCP
Если LCP-элемент - изображение (а это в 70-80% случаев), оптимизация картинки даёт самый быстрый результат.
Конвертация в современные форматы. WebP весит на 25-35% меньше JPEG при том же качестве. AVIF - ещё на 20% меньше WebP, но поддержка браузеров пока неполная. Для WordPress используйте плагины ShortPixel, Imagify или EWWW Image Optimizer - они конвертируют автоматически и отдают WebP/AVIF через тег <picture> или правила .htaccess.
Правильные размеры. Hero-баннер шириной 1920px не нужен на мобильном экране 375px. Используйте атрибут srcset для отдачи разных размеров изображения разным устройствам. Для LCP-изображения на десктопе достаточно ширины контейнера, на мобильных - ширины экрана.
Целевой вес. Hero-изображение не должно весить больше 100-150 КБ. Если после сжатия в WebP картинка весит 300+ КБ - уменьшите разрешение или повысьте степень сжатия. Качество 75-80% в WebP визуально не отличается от 100%, но весит в 2-3 раза меньше.
Предзагрузка LCP-изображения. Добавьте в <head> страницы:
<link rel="preload" as="image" href="/path/to/hero.webp" type="image/webp">
Это сообщает браузеру: «Начни загрузку этого изображения сразу, не дожидаясь парсинга CSS и HTML.» Предзагрузка может улучшить LCP на 200-500 мс.
Атрибут fetchpriority=»high». Добавьте к LCP-изображению:
<img src="hero.webp" fetchpriority="high" width="1200" height="600" alt="...">
Этот атрибут повышает приоритет загрузки изображения в очереди браузера. И обязательно: не ставьте loading="lazy" на LCP-изображение - это задержит его загрузку и резко ухудшит метрику.
Пример до/после: PNG-баннер 1920×800, вес 820 КБ, LCP 3,8 с. После: WebP 1200×500 с srcset, вес 95 КБ, preload + fetchpriority=»high». LCP стал 1,6 с. Разница - 2,2 секунды только за счёт оптимизации одного изображения.
Critical CSS - убираем блокировку рендеринга
Браузер не начнёт отрисовку, пока не загрузит и не обработает весь CSS. Если файл стилей весит 200 КБ, а для первого экрана нужно только 15 КБ - остальные 185 КБ блокируют отрисовку впустую.
Решение - Critical CSS: вынести стили первого экрана в инлайновый блок <style> прямо в HTML, а остальной CSS загружать асинхронно. Для WordPress это делают плагины Autoptimize (с опцией Critical CSS) или WP Rocket. Ручной способ - использовать Critical от Addy Osmani.
Некритичный CSS загружайте отложенно:
<link rel="stylesheet" href="style.css" media="print" onload="this.media='all'">
Этот приём говорит браузеру: «Загрузи файл, но не блокируй рендеринг.» После загрузки атрибут media переключается на all, и стили применяются.
JavaScript - убираем блокирующие скрипты
Синхронный JavaScript блокирует парсинг HTML. Каждый <script src="..."> без атрибута defer или async останавливает рендеринг, пока скрипт не загрузится и не выполнится.
- defer - скрипт загружается параллельно с HTML, выполняется после полного парсинга. Подходит для большинства скриптов.
- async - скрипт загружается параллельно и выполняется сразу после загрузки, не дожидаясь парсинга. Подходит для независимых скриптов (аналитика, виджеты).
Сторонние скрипты (Яндекс Метрика, чат-виджеты, рекламные пиксели) особенно опасны для LCP, если загружаются синхронно. Перенесите их загрузку после события DOMContentLoaded или используйте загрузку по взаимодействию: скрипт чата загружается только после первого скролла или клика пользователя.
Веб-шрифты
Загрузка кастомных шрифтов может блокировать отрисовку текста на 1-3 секунды. Если LCP-элемент - текстовый блок (заголовок H1), медленная загрузка шрифта напрямую увеличивает LCP.
Решения:
- Добавьте
font-display: swapв объявления @font-face - текст сразу отрисуется системным шрифтом, а после загрузки перерисуется кастомным. - Предзагрузите критические шрифты:
<link rel="preload" href="font.woff2" as="font" type="font/woff2" crossorigin> - Если шрифт подключается с Google Fonts - добавьте
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>в head для ускорения DNS-резолвинга. - Используйте формат WOFF2 - он сжат на 30% лучше, чем WOFF, и поддерживается всеми современными браузерами.
Типичные ошибки
- Оптимизировать только лабораторные метрики. Google учитывает полевые данные CrUX. Можно получить 100 баллов в Lighthouse на мощном компьютере и при этом иметь красный LCP в Search Console - если реальные пользователи заходят с бюджетных смартфонов через 3G.
- Ставить lazy loading на LCP-изображение. Атрибут
loading="lazy"отложит загрузку главного элемента, и LCP резко ухудшится. Lazy loading - только для изображений ниже первого экрана. - Игнорировать мобильную версию. Google оценивает Core Web Vitals отдельно для мобильных и десктопных устройств. На мобильных LCP почти всегда хуже из-за медленного процессора и сети. Mobile-first индексирование означает, что мобильные метрики приоритетнее.
- Не учитывать разный LCP-элемент на разных устройствах. На десктопе LCP-элемент может быть hero-изображением 1920×800, а на мобильном - заголовком H1. Оптимизировать нужно оба варианта.
- Оптимизировать всё, кроме сервера. Никакое сжатие изображений не поможет, если сервер отвечает 2 секунды. Всегда начинайте с TTFB - это фундамент.
- Предзагружать слишком много ресурсов. Preload конкурирует за пропускную способность. Если предзагрузить 10 файлов, ни один не загрузится быстро. Предзагружайте только LCP-изображение и критический шрифт - максимум 2-3 ресурса.
Что проверить в итоге
- LCP в полевых данных PageSpeed Insights ниже 2,5 секунд для мобильных и десктопных.
- В Search Console нет страниц со статусом «Плохо» по LCP.
- LCP-элемент определён и оптимизирован: если изображение - сжато в WebP/AVIF, имеет fetchpriority=»high» и preload.
- TTFB сервера не превышает 600 мс (в идеале - до 200 мс с кешем).
- Серверное кеширование настроено и работает (проверьте заголовок X-Cache или HIT/MISS).
- Critical CSS инлайнится для первого экрана, некритичный CSS загружается отложенно.
- Все скрипты загружаются с defer или async, синхронных блокирующих скриптов нет.
- Шрифты используют font-display: swap и preload для критических начертаний.
- Сторонние скрипты не блокируют рендеринг первого экрана.
- На LCP-изображении нет атрибута loading=»lazy».