Перейти к содержимому
23 / 36

Что такое Lighthouse и какие метрики он измеряет?


Полный ответ

Lighthouse запускает страницу в контролируемом окружении и собирает метрики:

Bash

# Установка и запуск через CLI
npm install -g lighthouse

# Базовый аудит
lighthouse https://example.com --output html --output-path report.html

# Только performance
lighthouse https://example.com --only-categories=performance

# Мобильный (по умолчанию) и десктопный режимы
lighthouse https://example.com --preset=desktop
lighthouse https://example.com --preset=perf  # урезанный, только performance

Performance-метрики и их вес в общей оценке (Lighthouse 12):

JavaScript
Метрика                          Вес     Хорошо    Плохо
---------------------------------------------------------
First Contentful Paint (FCP)     10%     < 1.8s    > 3.0s
Largest Contentful Paint (LCP)   25%     < 2.5s    > 4.0s
Total Blocking Time (TBT)        30%     < 200ms   > 600ms
Cumulative Layout Shift (CLS)    25%     < 0.1     > 0.25
Speed Index (SI)                 10%     < 3.4s    > 5.8s

Программный запуск из Node.js:

JavaScript
import lighthouse from 'lighthouse';
import puppeteer from 'puppeteer';

async function runAudit(url) {
  const browser = await puppeteer.launch({ headless: true });
  const page = await browser.newPage();

  const result = await lighthouse(url, {
      port: new URL(browser.wsEndpoint()).port,
      output: 'json',
      onlyCategories: ['performance'],
    });

  const { categories, audits } = result.lhr;

  console.log(`Performance score: ${categories.performance.score * 100}`);
  console.log(`FCP: ${audits['first-contentful-paint'].displayValue}`);
  console.log(`LCP: ${audits['largest-contentful-paint'].displayValue}`);
  console.log(`TBT: ${audits['total-blocking-time'].displayValue}`);
  console.log(`CLS: ${audits['cumulative-layout-shift'].displayValue}`);

  // Конкретные рекомендации
  const opportunities = Object.values(audits).filter(
    (a) => a.details?.type === 'opportunity' && a.details.overallSavingsMs > 0
  );

  for (const opp of opportunities) {
    console.log(`${opp.title}: можно сэкономить ${opp.details.overallSavingsMs} ms`);
  }

  await browser.close();
  return result;
}

runAudit('https:// example.com');

Интеграция в CI/CD:

JavaScript
// lighthouserc.js
export default {
  ci: {
    collect: {
      url: ['http:// localhost:3000/', 'http:// localhost:3000/about'],
      numberOfRuns: 3, // среднее из трёх запусков
    },
    assert: {
      assertions: {
        'categories:performance': ['error', { minScore: 0.9 }],
        'categories:accessibility': ['warn', { minScore: 0.95 }],
        'first-contentful-paint': ['error', { maxNumericValue: 1800 }],
        'largest-contentful-paint': ['error', { maxNumericValue: 2500 }],
        'cumulative-layout-shift': ['error', { maxNumericValue: 0.1 }],
      },
    },
  },
};

Bash

# Запуск в CI
npm install -g @lhci/cli
lhci autorun --config=lighthouserc.js

📌 Реальные кейсы

Типичные ошибки при работе с Lighthouse:

JavaScript
// ❌ Сравнивать оценки между запусками напрямую

// Lighthouse показывает разные значения при каждом запуске из-за сети и CPU

// ✅ Делать несколько запусков и брать медиану
// lighthouse --output json | jq '.audits["first-contentful-paint"].numericValue'

// Запустить 5 раз, взять медиану

// ❌ Оптимизировать только DevTools Lighthouse (без throttling)

// DevTools по умолчанию эмулирует медленное соединение и CPU

// ✅ Тестировать в условиях, близких к реальным пользователям

// PageSpeed Insights показывает и лабораторные, и полевые данные (CrUX)

Резюме

Lighthouse -- стандартный инструмент аудита производительности от Google. Он даёт конкретные метрики и рекомендации, но важно помнить о вариативности результатов между запусками. Для достоверных данных нужно несколько запусков и сравнение с полевыми метриками из CrUX. Интеграция в CI предотвращает регрессии производительности.