Timeout и памяти

Timeout (время выполнения)

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

  • maxWaitForFcp и maxWaitForLoad — определяют максимальное время ожидания событий First Contentful Paint и полной загрузки страницы. Значения задаются в миллисекундах.

    const options = {
      maxWaitForFcp: 15_000,  // 15 секунд
      maxWaitForLoad: 30_000, // 30 секунд
    };

    Эти параметры предотвращают зависание сканирования на медленных страницах и позволяют задавать баланс между полнотой данных и временем анализа.

  • port и timeout в Node API — при запуске Lighthouse программно через Node.js можно задавать общее время выполнения для теста:

    const lighthouse = require('lighthouse');
    const chromeLauncher = require('chrome-launcher');
    
    (async () => {
      const chrome = await chromeLauncher.launch({ chromeFlags: ['--headless'] });
      const options = { port: chrome.port, timeout: 60_000 }; // 60 секунд
      const runnerResult = await lighthouse('https://example.com', options);
      await chrome.kill();
    })();

    Параметр timeout задаёт максимальное время ожидания завершения теста и автоматически останавливает его, если оно превышено.

  • Автоматическое управление тайм-аутами для асинхронных операций. Lighthouse использует Promise.race для контроля асинхронных вызовов и предотвращения зависаний. Любой нестабильный API, долгий скрипт или сетевой запрос, превышающий тайм-аут, будет принудительно завершён с ошибкой TimeoutError.

Управление памятью

Память является критическим ресурсом, особенно при тестировании больших страниц с множеством элементов и сложными скриптами. В Lighthouse применяются следующие механизмы управления памятью:

  • Использование Chrome DevTools Protocol (CDP) — Lighthouse взаимодействует с браузером через CDP, что позволяет получать данные о текущем использовании памяти, включать сборку мусора перед тестами и отслеживать утечки.

    const client = await page.target().createCDPSession();
    await client.send('HeapProfiler.collectGarbage');
    const memory = await client.send('Memory.getDOMCounters');
    console.log(memory);

    Этот подход помогает минимизировать влияние накопленного мусора и объектов, неиспользуемых страницей, на результаты анализа.

  • Ограничение числа одновременно выполняемых задач — при больших страницах Lighthouse создаёт несколько этапов (audit), каждый из которых использует отдельные процессы или потоки. Это позволяет держать потребление памяти на управляемом уровне и избегать Out-of-Memory ошибок.

  • Анализ памяти в отчётах — некоторые аудиторы Lighthouse предоставляют детальную статистику о потреблении ресурсов страницей. Например, аудит performance-budget учитывает использование JS, CSS и изображений, что напрямую влияет на объём памяти в браузере.

Рекомендации по настройке

  • Для тестирования медленных страниц или страниц с большим количеством динамического контента стоит увеличивать тайм-ауты maxWaitForLoad и timeout, чтобы избежать преждевременного завершения теста.
  • Перед запуском каждого теста рекомендуется запускать сборку мусора через CDP, чтобы очистить память браузера и уменьшить влияние предыдущих тестов.
  • Для CI/CD процессов оптимально использовать параметры disableStorageReset, чтобы уменьшить нагрузку на память при последовательных запусках тестов на одной сессии браузера.

Практические примеры

  • Тестирование SPA с долгим рендером:

    const options = {
      maxWaitForFcp: 20_000,
      maxWaitForLoad: 60_000,
      timeout: 90_000,
      disableStorageReset: true
    };

    Здесь увеличенные тайм-ауты позволяют корректно измерять метрики загрузки динамического контента, а сохранение состояния storage снижает повторное использование ресурсов.

  • Минимизация утечек памяти при массовом аудите:

    await client.send('HeapProfiler.collectGarbage');
    await client.send('Runtime.enable');

    Вызов сборки мусора перед каждой итерацией анализа предотвращает накопление DOM-элементов и объектов JS в памяти.

Эффективное управление тайм-аутами и памятью в Lighthouse обеспечивает точные, стабильные и воспроизводимые результаты анализа. Правильная настройка этих параметров особенно важна для масштабного тестирования и интеграции в CI/CD pipelines.