Lighthouse представляет собой инструмент для аудита веб-страниц, построенный на базе модульной архитектуры. Внутреннее устройство разделено на несколько ключевых уровней, каждый из которых отвечает за отдельный этап анализа:
Такое разделение обеспечивает расширяемость и независимость компонентов.
Полный цикл работы Lighthouse можно разбить на последовательные этапы:
На этом этапе формируется конфигурация:
Создаётся экземпляр Chrome через протокол Chrome DevTools Protocol (CDP).
Driver инициирует загрузку страницы:
Фиксируются ключевые события:
firstContentfulPaintlargestContentfulPaintDOMContentLoadedGatherers — это модули, которые извлекают сырые данные из браузера.
Примеры собираемых данных:
Каждый gatherer реализует методы:
class ExampleGatherer {
async beforePass(context) {}
async pass(context) {}
async afterPass(context) {}
}
Фазы:
Результаты gatherers сохраняются в структуре Artifacts. Это централизованное хранилище всех сырых данных.
Пример:
{
"URL": "...",
"Trace": {...},
"NetworkRecords": [...],
"Accessibility": {...}
}
Artifacts передаются в систему аудитов.
Driver — абстракция над Chrome DevTools Protocol.
Функции Driver:
Пример вызова:
await driver.evaluateAsync('document.title');
Driver скрывает сложность CDP и предоставляет единый API.
Аудиты анализируют Artifacts и возвращают результаты.
Структура аудита:
class ExampleAudit {
static get meta() {
return {
id: 'example-audit',
title: 'Пример аудита',
failureTitle: 'Ошибка',
description: 'Описание проверки',
requiredArtifacts: ['URL']
};
}
static audit(artifacts, context) {
return {
score: 1,
numericValue: 100,
displayValue: 'OK'
};
}
}
Аудиты объединяются в категории:
Категория агрегирует результаты:
{
"score": 0.92,
"auditRefs": [...]
}
Lighthouse использует логарифмическую шкалу для оценки производительности.
Метрики:
Каждая метрика нормализуется через кривую распределения.
Trace — это временная диаграмма событий браузера:
Используется для:
Содержит:
Пример записи:
{
"url": "...",
"statusCode": 200,
"transferSize": 15000
}
Runner координирует выполнение:
Упрощённая схема:
async function runLighthouse() {
const artifacts = await gather();
const results = await audit(artifacts);
return results;
}
Конфигурация определяет поведение Lighthouse.
Пример:
module.exports = {
extends: 'lighthouse:default',
settings: {
onlyCategories: ['performance']
},
audits: [
'first-contentful-paint',
'largest-contentful-paint'
]
};
Lighthouse поддерживает плагины:
module.exports = {
audits: ['plugin-example/audit'],
category: {
title: 'Custom',
auditRefs: [{ id: 'plugin-example/audit', weight: 1 }]
}
};
Возможности:
Финальный отчёт формируется в формате:
Структура:
{
"categories": {...},
"audits": {...},
"finalUrl": "...",
"timing": {...}
}
HTML-рендеринг включает:
Lighthouse симулирует реальные условия:
Замедление выполнения Jav * aScript:
Эмуляция сети:
Пример:
settings: {
throttling: {
rttMs: 150,
throughputKbps: 1600
}
}
Общая схема:
Chrome → Driver → Gatherers → Artifacts → Audits → Report
Каждый этап:
1. Декларативность Аудиты описывают зависимости
через requiredArtifacts.
2. Чистые функции Аудиты не имеют побочных эффектов.
3. Разделение ответственности Сбор данных и анализ разделены.
4. Повторяемость Одинаковые условия → одинаковый результат.
Пример запуска через Node.js:
const lighthouse = require('lighthouse');
const chromeLauncher = require('chrome-launcher');
(async () => {
const chrome = await chromeLauncher.launch();
const result = await lighthouse('https://example.com', {
port: chrome.port
});
console.log(result.lhr.categories.performance.score);
await chrome.kill();
})();
Основные компоненты:
Lighthouse интегрируется:
Обеспечивает стандартизированный подход к анализу качества веб-приложений.