Batch обработка URL

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');

Запуск Lighthouse для одного URL

Перед созданием 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 обработки

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;
}

Плюсы:

  • Минимальная нагрузка на систему.
  • Простота реализации.

Минусы:

  • Высокое время выполнения при большом списке URL.

Параллельная обработка

Для ускорения можно запускать несколько аудитов одновременно. Например, используя ограничение параллелизма:

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);
}

Плюсы:

  • Значительно быстрее последовательной обработки.
  • Гибкое управление количеством одновременных запусков.

Минусы:

  • Более высокое потребление ресурсов.
  • Возможны ошибки при превышении лимитов памяти или CPU.

Кастомизация аудита

Для 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 };
  }
}

Обработка ошибок позволяет продолжать аудит даже при сбоях отдельных страниц.


Оптимизация производительности batch обработки

  1. Лимит параллелизма — не запускать все URL одновременно.
  2. Переиспользование экземпляра Chrome — для ускорения запуска.
  3. Фильтрация URL — исключение невалидных или дублей.
  4. Кэширование ресурсов — для уменьшения сетевых задержек при повторных запусках.

Пример переиспользования 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 легко интегрируются в:

  • Системы мониторинга (Grafana, Kibana)
  • Автоматические отчеты для команды
  • Скрипты сравнения изменений после деплоя

Batch обработка URL с помощью Lighthouse позволяет масштабировать аудит веб-приложений, автоматизировать процесс и получать структурированные данные для анализа производительности, доступности и SEO. Правильная организация параллелизма, кастомизация конфигурации и обработка ошибок обеспечивают стабильность и эффективность процесса.