Skip to content
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 ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ рСгрСссии ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Lighthouse ΠΈ ΠΊΠ°ΠΊΠΈΠ΅ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ ΠΎΠ½ измСряСт? | JScriptiser