Цель: на 75-м перцентиле добиться LCP ≤ 2.5 s, INP ≤ 200 ms, CLS ≤ 0.1 для мобильных и десктопных пользователей. Это текущие «зелёные» пороги Google для Core Web Vitals. (web.dev)
1) Начните с правильных измерений: поле + лаборатория
- Поле (RUM): Search Console (отчёт CWV), PageSpeed Insights (CrUX), собственный RUM на web-vitals.
- Лаба: Lighthouse/DevTools для воспроизведения проблем и профилирования.
- Почему: ранжирование учитывает реальный пользовательский опыт, а не синтетику. (Справка Google, Google for Developers)
<!-- Мини-RUM на web-vitals -->
<script type="module">
import {onLCP,onINP,onCLS} from 'https://unpkg.com/web-vitals@4?module';
const send = (m) => navigator.sendBeacon('/rum', JSON.stringify(m));
onLCP(send); onINP(send); onCLS(send);
</script>
2) Зафиксируйте цели по метрикам
- LCP ≤ 2.5 s (хорошо), >4 s — плохо.
- INP ≤ 200 ms (хорошо), >500 ms — плохо.
- CLS ≤ 0.1 (хорошо), >0.25 — плохо.
Оценивайте по 75-му перцентилю раздельно для мобайла/десктопа. (web.dev)
3) Ускорьте бэкенд и TTFB (фундамент LCP)
- HTTP/2/3, TLS-резюме, CDN/edge, кэширование на уровне сервера, компрессия, близость к пользователю.
- Сократите редиректы и холодные запросы к БД.
LCP в поле учитывает сетевую установку соединения и TTFB, поэтому быстрый сервер = быстрый LCP. (web.dev)
4) Сделайте LCP-ресурс «первогражданином»
- Поместите LCP-ресурс в исходный HTML (избегайте поздней загрузки через JS).
- Проставьте rel=preload и/или fetchpriority="high" для hero-изображения/шрифта заголовка; не ленизируйте LCP-картинку.
- Форматы AVIF/WebP, правильные sizes/srcset, decoding="async".
<link rel="preload" as="image" href="/hero.avif" imagesrcset="/hero.avif 1x, /hero@2x.avif 2x" fetchpriority="high">
<img src="/hero.avif" width="1280" height="720" alt="..." decoding="async">
5) Уберите блокирующий рендер
- Критический CSS инлайн, остальное — defer/async и media-загрузка.
- Минимизируйте и объединяйте CSS, отключайте неиспользуемые стили/поллифилы.
- preconnect/dns-prefetch к ключевым источникам.
Это снижает время до первого контента и ускоряет «путь» к LCP. (web.dev)
6) Диета для JavaScript (ключ к хорошему INP)
- Уберите неиспользуемый код, включите code-splitting/tree-shaking, грузите функциональность по требованию.
- Перенесите тяжёлые расчёты в Web Workers; избегайте синхронных операций на main thread.
7) Почините обработчики ввода (INP)
- Избегайте Long Tasks (>50 ms), дробите их; дебаунс/троттлинг на ввод.
- Не плодите таймеры; используйте passive-слушатели для скролла/тача; рендер — через requestAnimationFrame.
8) Упростите рендер (INP via rendering)
- Уменьшайте «стоимость» стилей: избегайте сложных селекторов и каскада.
- Боритесь с layout thrashing (чтение geom + запись — разнесите).
9) Стабилизируйте макет (CLS)
- Всегда задавайте width/height или aspect-ratio для изображений/видео/виджетов; резервируйте место под рекламу/баннеры.
- Для анимаций используйте transform вместо top/left/height.
.card img{ aspect-ratio: 16/9; object-fit: cover; }
.banner{ min-height: 250px; }
.animate{ transform: translateY(0); will-change: transform; }
10) Приручите сторонние скрипты
- Грузите async/defer, откладывайте инициализацию до пользовательского действия.
- Сведите к минимуму блокирующие теги, грузите виджеты «по клику», используйте data- конфиги вместо автозапуска.
11) Оптимизируйте шрифты
- Preload ключевых шрифтов, subset и unicode-range, вариативные шрифты — только при необходимости.
<link rel="preload" as="font" href="/Inter-Subset.woff2" type="font/woff2" crossorigin>
<style>html{font-display:swap;}</style>
12) Закройте цикл: контроль, алерты, бюджеты
- Отслеживайте проблемы в Search Console (CWV-отчёт), групповку по шаблонам URL и худшую метрику в группе.
- Введите performance budgets и автопровал CI при их нарушении (Lighthouse CI / WebPageTest API).
Частые вопросы (коротко)
INP — что это и куда делся FID?
INP с 12 марта 2024 официально заменил FID в составе Core Web Vitals. Теперь оценивается не задержка первой, а всех интеракций до следующей перерисовки. (web.dev)
Почему у меня «зелёный» в лабе и «жёлтый» в поле?
Разные устройства/сети и нестабильные моменты вроде TTFB и iframes; ориентируйтесь на полевые данные (CrUX/RUM) и 75-й перцентиль. (web.dev)
Мини-чеклист на неделю
- Вынести критический CSS инлайн, скрипты — defer.
- Настроить алерты, бюджеты и регрессионные прогоны в CI.
Полезные первоисточники
Обращайтесь в телеграмм @hesher92 или оставляйте заявку на сайте https://nbmit.ru/ и я адаптирую эти шаги к Вашей конкретной странице.