Основные методы

Для работы с Lighthouse в Node.js используется пакет lighthouse, который устанавливается через npm:

npm install -g lighthouse

Также возможно локальное подключение в проект через:

npm install lighthouse --save-dev

После установки можно импортировать модуль в код:

const lighthouse = require('lighthouse');
const chromeLauncher = require('chrome-launcher');

Для запуска аудита Lighthouse необходим экземпляр Chrome или Chromium. Для автоматизации запуска удобно использовать chrome-launcher, который управляет процессом запуска браузера и закрытия после завершения проверки.


Запуск аудита и получение отчёта

Основной метод для запуска аудита:

async function runLighthouse(url, options = {}) {
    const chrome = await chromeLauncher.launch({chromeFlags: ['--headless']});
    options.port = chrome.port;
    const result = await lighthouse(url, options);
    await chrome.kill();
    return result.lhr; // Lighthouse Result
}

Ключевые параметры options:

  • output — формат отчёта: 'html', 'json', 'csv'.
  • onlyCategories — массив категорий для аудита, например ['performance', 'accessibility'].
  • emulatedFormFactor — форм-фактор устройства: 'mobile' или 'desktop'.
  • throttling — настройки эмуляции сети и CPU.

Пример использования:

(async () => {
    const url = 'https://example.com';
    const options = {output: 'json', onlyCategories: ['performance']};
    const result = await runLighthouse(url, options);
    console.log(result.categories.performance.score);
})();

Работа с результатами аудита

Lighthouse возвращает объект lhr (Lighthouse Result), содержащий:

  • categories — оценки по категориям: performance, accessibility, best-practices, seo, pwa.
  • audits — подробные проверки с описанием, рекомендуемыми действиями и метриками.
  • configSettings — настройки запуска аудита.
  • environment — информация о браузере и системе.
  • fetchTime — время проведения аудита.

Пример извлечения ключевых метрик производительности:

const metrics = result.audits;
console.log('First Contentful Paint:', metrics['first-contentful-paint'].displayValue);
console.log('Largest Contentful Paint:', metrics['largest-contentful-paint'].displayValue);
console.log('Cumulative Layout Shift:', metrics['cumulative-layout-shift'].displayValue);

Кастомизация конфигурации

Lighthouse позволяет создавать собственные конфигурации аудита. Для этого создаётся объект config:

const config = {
    extends: 'lighthouse:default',
    settings: {
        onlyCategories: ['performance', 'seo'],
        emulatedFormFactor: 'mobile',
        throttling: {
            rttMs: 150,
            throughputKbps: 1638.4,
            cpuSlowdownMultiplier: 4
        }
    }
};

Использование кастомной конфигурации:

const result = await lighthouse(url, {port: chrome.port}, config);

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


Генерация отчётов

Методы генерации отчётов:

const fs = require('fs');
const reportHtml = result.report; // если output = 'html'
fs.writeFileSync('report.html', reportHtml);

Для JSON:

const reportJson = JSON.stringify(result, null, 2);
fs.writeFileSync('report.json', reportJson);

Можно комбинировать форматы, используя массив output:

const options = {output: ['html', 'json']};

Автоматизация и интеграция

Lighthouse легко интегрируется с CI/CD:

  • запуск через Node.js скрипты,
  • проверка отчётов и сохранение в артефакты,
  • установка пороговых значений для оценки категорий, что позволяет автоматически проходить или проваливать билд:
if (result.categories.performance.score < 0.9) {
    throw new Error('Performance score ниже допустимого порога');
}

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


Асинхронность и параллельные запуски

Lighthouse работает асинхронно, что позволяет запускать несколько аудитов одновременно. Однако важно учитывать потребление ресурсов браузера и CPU:

const urls = ['https://example.com', 'https://example.org'];
await Promise.all(urls.map(url => runLighthouse(url, {output: 'json'})));

Для крупных проектов лучше управлять количеством параллельных запусков с использованием очередей или библиотек вроде p-limit.


Полезные категории аудита

  • Performance — показатели скорости загрузки и визуальной стабильности.
  • Accessibility — проверка доступности для людей с ограничениями.
  • Best Practices — рекомендации по безопасности и современным стандартам.
  • SEO — базовая SEO-проверка страницы.
  • PWA — проверка прогрессивных веб-приложений.

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