Lighthouse — это инструмент для аудита производительности, доступности, SEO и других показателей веб-приложений. Puppeteer предоставляет API для управления Chromium и Chrome, что позволяет запускать Lighthouse в контексте автоматизированного браузера. Совместное использование этих инструментов открывает возможности для глубокого анализа страниц, особенно динамически генерируемых контентом.
Интеграция начинается с установки необходимых пакетов через npm:
npm install puppeteer lighthouse
После этого можно подключить их в коде:
const puppeteer = require('puppeteer');
const lighthouse = require('lighthouse');
const {URL} = require('url');
Для того чтобы Lighthouse анализировал страницу, сначала нужно
запустить экземпляр браузера с Puppeteer и передать его в Lighthouse
через port. Пример базового скрипта:
(async () => {
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
await page.goto('https://example.com');
const browserWSEndpoint = browser.wsEndpoint();
const url = 'https://example.com';
const { lhr } = await lighthouse(url, {
port: new URL(browserWSEndpoint).port,
output: 'json',
logLevel: 'info',
});
console.log(`Performance score: ${lhr.categories.performance.score * 100}`);
await browser.close();
})();
Здесь ключевой момент — использование wsEndpoint() для получения WebSocket-порта, по которому Lighthouse подключается к запущенному браузеру. Это позволяет анализировать страницы, управляемые Puppeteer, включая SPA и страницы с динамическим контентом.
Lighthouse поддерживает кастомные конфигурации через объект
config. Можно определить категории аудита, отключить
ненужные аудиты и настроить throttling:
const customConfig = {
extends: 'lighthouse:default',
settings: {
onlyCategories: ['performance', 'accessibility'],
throttlingMethod: 'devtools',
emulatedFormFactor: 'desktop',
}
};
const { lhr } = await lighthouse(url, {
port: new URL(browserWSEndpoint).port,
output: 'json',
logLevel: 'info',
}, customConfig);
Использование emulatedFormFactor позволяет тестировать
страницы в условиях различных устройств, а
throttlingMethod: 'devtools' учитывает реальные условия
сетевого соединения и производительности.
Puppeteer позволяет управлять состоянием страницы перед запуском Lighthouse. Например, если необходимо дождаться полной загрузки SPA, можно использовать ожидание определённого селектора или события:
await page.goto('https://example.com');
await page.waitForSelector('#main-content', { visible: true });
После этого Lighthouse получает полностью отрендеренную страницу, что повышает точность показателей производительности и доступности.
Результаты Lighthouse возвращаются в объекте lhr
(Lighthouse Result). Основные разделы:
Для сохранения отчета в файл:
const fs = require('fs');
fs.writeFileSync('lighthouse-report.json', JSON.stringify(lhr, null, 2));
Можно также генерировать HTML-отчёт:
const reportHtml = await lighthouse(url, { port: new URL(browserWSEndpoint).port, output: 'html' });
fs.writeFileSync('report.html', reportHtml);
Совместное использование Puppeteer и Lighthouse позволяет проводить высокоточные и повторяемые аудиты страниц, особенно для сложных веб-приложений, где стандартный запуск Lighthouse из CLI не отражает реальную производительность.