Lighthouse — аудит качества сайта

Lighthouse — автоматический аудитор Google, который обкатывает страницу в безжалостной среде и ставит оценки от 0 до 100 по четырём категориям: Performance, Accessibility, Best Practices и SEO. Это верный способ понять, готов ли сайт к реальным пользователям.

Уровень: средний 18 разделов ⏱ 2 часа

1. Где запускается Lighthouse

npm install -g lighthouse
lighthouse https://example.com --only-categories=performance --output=json --output-path=./lh.json
lighthouse https://example.com --view   # открыть отчёт в браузере
В DevTools Lighthouse просто выбирается устройство (Mobile/Desktop) и нажимается Analyze. Отчёт сохраняется на месте, с разбором по каждой метрике.

2. Категории оценок

КатегорияЧто проверяет
Performanceскорость загрузки и отзывчивость
Accessibilityдоступность для пользователей с ограничениями
Best Practicesбезопасность, HTTPS, современные API
SEOоптимизация для поисковых систем

Шкалы: 0–49 красный, 50–89 жёлтый, 90–100 зелёный.

3. Performance: ключевые метрики

Оценка Lighthouse в упрощённом виде эмулирует «медленный» 4G-телефон. Если сайт быстрый в таком окружении — в реальности он летает.

4. Core Web Vitals

Три метрики, которые Google реально использует в ранжировании: LCP, INP, CLS. Целевые значения:

МетрикаХорошоСреднеПлохо
LCP< 2.5s< 4.0s> 4.0s
INP< 200ms< 500ms> 500ms
CLS< 0.1< 0.25> 0.25
Реальные данные о виталах твоих пользователей — в PageSpeed Insights (вкладка Field Data) или в Search Console.

5. Причины плохого LCP

<img src="hero.webp" width="1200" height="600"
     fetchpriority="high" decoding="async" alt="Герой" />

<link rel="preload" href="/fonts/inter.woff2" as="font" crossorigin />
<link rel="preload" href="/styles.css" as="style" />

6. Accessibility (доступность)

Аудит проверяет: контраст, альт-тексты, aria-роли, структуру заголовков и доступность с клавиатуры:

<button aria-label="Закрыть окно">×</button>
<img src="logo.svg" alt="Логотип компании" />
<input aria-describedby="hint" />
<p id="hint">От 6 до 20 символов</p>
Доступность — не только этика, но и качество: сухая разметка проще для SEO-краулеров и умных ассистентов.

7. Best Practices

Проверки безопасности и современности:

Частая недооценка — попадание чувствительных данных в localStorage и использование библиотек с известными уязвимостями. Каталоги CVE (например, NVD) помогут мониторить зависимости.

8. SEO

Базовые проверки SEO в Lighthouse:

<title>Название страницы</title>
<meta name="description" content="Короткое описание" />
<link rel="canonical" href="https://site.ru/page" />
<html lang="ru">

Также проверяются: роботики файлы robots.txt, структура заголовков h1–h6, отсутствие дублей с meta robots, правильные атрибуты alt.

9. Как улучшить Performance

  1. смотри отчёт → жми самую низкую метрику → секцию с проблемой — Lighthouse объяснит каждую;
  2. оптимизируй изображения: WebP/AVIF, srcset, размеры;
  3. выноси CSS в критические inline-части, остальное — async;
  4. лениво грузи картинки/iframe: loading="lazy";
  5. сократи путь JS и разбей на чанки (курс Webpack, Vite);
  6. обнови кэш-стратегии и шрифты (unicode-range).
// отложенная инициализация некритичного скрипта
<script defer src="analytics.js"></script>
<img src="photo.webp" loading="lazy" alt="Фото" />

10. Lighthouse в CI

Следи за метриками при каждом деплое:

npm install -D @lhci/cli
// lighthouserc.json
{
  "ci": {
    "collect": { "url": ["https://example.com"], "numberOfRuns": 3 },
    "assert": {
      "assertions": {
        "categories:performance": ["error", { "minScore": 0.9 }],
        "categories:accessibility": ["error", { "minScore": 0.95 }],
        "categories:seo": ["error", { "minScore": 0.95 }]
      }
    }
  }
}
npx lhci autorun
Ставь пороги чуть ниже «идеала», чтобы не блокировать деплой из-за шума: 90+ по Performance, 95+ по Accessibility и SEO — разумная планка.

11. Устройства и эмуляция

Lighthouse по умолчанию прогоняет мобильную конфигурацию: эмуляция экрана, throttling CPU и сети. Для десктопа или реальной сети пресет меняется флагом:

lighthouse https://example.com --preset=desktop
lighthouse https://example.com --throttling-method=devtools
РежимЧто эмулируетсяКогда использовать
mobileэкраны, CPU 4x, Slow 4Gосновной прогон
desktopдесктоп, сети без троттлингасайты только для ПК

12. Чтение отчёта: trace загрузки

Самый информативный раздел — View Trace: водопад запросов, где каждая полоска показывает время запроса, размер и длительность обработки. Ищи длинные «островки» работы главного потока и ресурсы, блокирующие рендер.

Смотри на водопад в порядке приоритета: сначала блокирующие запросы, затем размер самих ресурсов — многие страницы выигрывают минуты ужесточением только верхних 10% полосок.

13. Прогон из Node.js и Puppeteer

Библиотека lighthouse позволяет запускать аудит программно и встраивать в свои скрипты:

const lighthouse = require('lighthouse');
const { launch } = require('chrome-launcher');

(async () => {
  const chrome = await launch({ chromeFlags: ['--headless'] });
  const result = await lighthouse('https://example.com', {
    port: chrome.port, onlyCategories: ['performance']
  });
  console.log(result.lhr.categories.performance.score);
  await chrome.kill();
})();

Так можно аудитить целые списки страниц, сравнивать версии и сохранять историю показателей в базу.

Версии Lighthouse и Chrome должны быть совместимы: обновляй пакет вместе с браузером, иначе аудит упадёт на старте с невнятной ошибкой про CDP.

14. Бюджеты производительности

Бюджеты фиксируют предельные метрики кода — превышение валит сборку. В Webpack они настраиваются декларативно:

performance: {
  budgets: [
    { resourceType: 'script', budget: 250000, resourceSizes: ['script'] },
    { resourceType: 'total', budget: 700000 }
  ]
}

Аналогично Lighthouse умеет брать бюджет из JSON-файла при прогоне (--budget-path=budget.json) и проверять, укладывается ли страница в лимиты по JS, CSS, изображениям и запросам.

Бюджеты работают, когда их поднимают медленно и сознательно: резкий лимит «в ноль» только сломает деплой. Обновляй порог вместе с реальными улучшениями, а не заранее.

15. SPA и клиентский рендеринг

Одностраничные приложения (React/Vue) аудируются иначе, чем статичные сайты: контент рендерится в браузере, и Lighthouse видит лишь то, что успело отобразиться:

npx lighthouse http://spa.example.com \
    --disable-storage-reset=false \
    --output=json --output-path=spa.json
Одинаковые бюджеты для SSR и CSR некорректны: у SPA метрики считаются после первой гидратации, а не при HTML. Прогоняй Lighthouse и на «пустой», и на «прогретой» странице.

16. Field Data: реальные метрики в проде

Лабораторный прогон на их машине — это эталон, а не правда. Полевые данные (RUM) собирает браузер реальных пользователей — через web-vitals:

import { onLCP, onCLS, onINP } from "web-vitals";
onLCP(({ value }) => sendToAnalytics("lcp", value));
Подключи CrUX API: агрегированные данные по всему сайту без своей аналитики — быстрый старт для подтверждения гипотез об LCP и CLS.

17. Мониторинг и алерты в проде

Производительность не останавливается после релиза. Регулярные прогоны и их сравнение держат метрики в бюджете, а не только на странице отчёта:

Вид прогонаЧто даётКогда
Deploy-time проверкабыстрая заслонка регрессийна каждый PR
Ночной полный прогонистория метрик, трендыраз в сутки
Синтетика с ноды мирамасштабная стабильностьраз в час

Алерты срабатывают по регрессу, а не по порогу: изменение LCP на 30% к базе — сигнал, даже если лимит не превышен.

Храни историю отчётов (JSON) и сравнивай одинаковые категории: без истории любое «зелёное» выглядит победой, хотя часть регрессий уже съела запас бюджета.

18. Чек-лист аудита перед релизом

Перед выкаткой собери обзорную картину: это и финальный самоконтроль, и документ для команды, где «хорошо», а где дыры.

npx lighthouse https://staging.example.com --preset=desktop \
    --output=json --output-path=release/lh.json \
    --only-categories=performance,accessibility
Не публикуй аудит «как есть»: укажи дату, окружение и эмуляцию — иначе текст-отчёт вводит в заблуждение через месяц, чем был измерен.

19. JavaScript: Long Tasks и INP

Медианный LCP может быть зелёным, а сайт всё равно «тупит» при взаимодействии. Причина — тяжёлые Long Tasks, блокирующие главный поток.

new PerformanceObserver((list) => {
  for (const e of list.getEntries()) {
    console.log('Long Task', e.duration, e.startTime)
  }
}).observe({ type: 'longtask', buffered: true })
Помните про деоптимизации V8: «кусочные» try/catch в горячих циклах и динамический доступ к полям обходят турбоящик.

20. Сторонние ресурсы

Метрики нередко падают не из-за сайта, а из-за тегов аналитики, чатов и consent-баннеров. Сторонний код надо включать в аудит.

web-vitals: check(INP, 200)
Consent-баннер — типичный «красный флаг»: загружайте теги и виджеты только после согласия, до принятия решения они не нужны.

21. Сетевой слой: HTTP/2/3 и кэширование

Браузер сам не догадается, как качать ресурсы: политику кэша, приоритизацию и протоколы настраивает сервер.

<link rel="preconnect" href="https://img.cdn.example.com">
<link rel="preload" as="image" href="hero.avif">
Не предзагружайте всё подряд: лишний preload генерирует трафик и заставлял браузер выбирать приоритеты. Только критический контент.

22. Стабильные прогоны и тренды

Lighthouse «прыгает» от прогона к прогону: фон процессов, сеть, кэш. Уберите шум и слушайте тенденцию, а не одиночный результат.

lighthouse https://site --preset=desktop --throttling-method=simulate
Ведите дашборд трендов: годовой рост библиотек и регрессы после релизов видны сразу, пока вы не запустили очередной прогон вручную.

Что дальше

Оптимизируй реальную страницу: сначала аудит → затем исправления → повторный аудит. Разметку потренируешь в HTML и CSS, картинки и анимации — в JavaScript, стили — в Sass. Смотреть в деталях данные сети и загрузки поможет Chrome DevTools.

← Вернуться к курсам