Lighthouse — это инструмент для аудита веб-приложений, который позволяет оценивать производительность, доступность, SEO и лучшие практики. В стандартной конфигурации Lighthouse запускается для одного URL за раз, но в реальных проектах часто требуется обработка большого количества страниц одновременно. Для этого применяются подходы batch обработки URL, позволяющие автоматизировать и масштабировать аудит.
Для работы с Lighthouse в Node.js необходимо установить соответствующий пакет:
npm install lighthouse chrome-launcher
chrome-launcher используется для запуска отдельного экземпляра Chrome, который будет управляться скриптом Lighthouse.
const lighthouse = require('lighthouse');
const chromeLauncher = require('chrome-launcher');
Перед созданием batch обработки полезно понять базовую структуру запуска:
async function runLighthouse(url, opts = {}, config = null) {
const chrome = await chromeLauncher.launch({ chromeFlags: ['--headless'] });
opts.port = chrome.port;
const results = await lighthouse(url, opts, config);
await chrome.kill();
return results.lhr;
}
Здесь:
opts — настройки Lighthouse (например, категория
аудита).config — конфигурация аудита, может включать кастомные
категории.lhr — Lighthouse Result, объект с результатами
аудита.Batch обработка предполагает последовательный или параллельный запуск Lighthouse для множества URL. Основные подходы:
Простейший вариант, безопасный для ресурсов:
async function batchSequential(urls) {
const results = [];
for (const url of urls) {
console.log(`Аудит страницы: ${url}`);
const result = await runLighthouse(url);
results.push({ url, score: result.categories.performance.score });
}
return results;
}
Плюсы:
Минусы:
Для ускорения можно запускать несколько аудитов одновременно. Например, используя ограничение параллелизма:
const pLimit = require('p-limit');
const limit = pLimit(3); // максимум 3 одновременных запуска
async function batchParallel(urls) {
const promises = urls.map(url => limit(() => runLighthouse(url).then(result => ({
url,
score: result.categories.performance.score
}))));
return Promise.all(promises);
}
Плюсы:
Минусы:
Для batch обработки часто полезно настраивать категории аудита и параметры Lighthouse:
const opts = {
onlyCategories: ['performance', 'accessibility'],
emulatedFormFactor: 'desktop',
};
Можно создавать разные конфигурации для разных групп URL. Например, для страниц мобильной версии:
const mobileConfig = {
extends: 'lighthouse:default',
settings: { emulatedFormFactor: 'mobile' },
};
Для удобного анализа результаты batch аудита обычно сохраняются в файл JSON:
const fs = require('fs');
async function saveResults(results, filename = 'results.json') {
fs.writeFileSync(filename, JSON.stringify(results, null, 2));
}
Также можно сохранять HTML-отчеты:
const report = await lighthouse(url, opts);
fs.writeFileSync(`${url.replace(/https?:\/\//, '')}.html`, report.report);
Batch обработка больших списков URL требует устойчивости:
async function safeRun(url) {
try {
const result = await runLighthouse(url);
return { url, success: true, score: result.categories.performance.score };
} catch (error) {
console.error(`Ошибка при аудите ${url}:`, error.message);
return { url, success: false, error: error.message };
}
}
Обработка ошибок позволяет продолжать аудит даже при сбоях отдельных страниц.
Пример переиспользования Chrome:
const chrome = await chromeLauncher.launch({ chromeFlags: ['--headless'] });
for (const url of urls) {
await lighthouse(url, { port: chrome.port });
}
await chrome.kill();
Batch аудит можно подключить к системам CI/CD для регулярного мониторинга качества страниц. Результаты JSON легко интегрируются в:
Batch обработка URL с помощью Lighthouse позволяет масштабировать аудит веб-приложений, автоматизировать процесс и получать структурированные данные для анализа производительности, доступности и SEO. Правильная организация параллелизма, кастомизация конфигурации и обработка ошибок обеспечивают стабильность и эффективность процесса.