Кеширование сборок

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


Механизмы кеширования

Lighthouse использует два основных подхода к кешированию:

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

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

    • Включается автоматически при запуске с Node.js.
    • Для сохранения данных используется временное хранилище браузера.
    • Позволяет значительно ускорить повторные аудиты без изменения кода приложения.
  2. Кеширование сборки отчетов Lighthouse хранит промежуточные данные аудита, такие как вычисленные метрики (First Contentful Paint, Time to Interactive и др.), чтобы их не пересчитывать при генерации разных форматов отчета (HTML, JSON).

    Особенности:

    • Позволяет формировать отчеты в нескольких форматах без повторного анализа страницы.
    • Используется при автоматизированных CI/CD-процессах для ускорения генерации отчетов на разных этапах.

Конфигурация кеширования

Lighthouse позволяет управлять кешированием через объект конфигурации. Основные параметры:

const config = {
  settings: {
    // Включение/отключение кеширования ресурсов
    disableStorageReset: true, 
    // Размер кеша для сборки в мегабайтах
    cacheSize: 50
  }
};
  • disableStorageReset предотвращает очистку кеша между запусками аудита, что ускоряет повторные проверки.
  • cacheSize задает лимит памяти, выделяемый под хранение промежуточных данных. Оптимальный размер зависит от объема ресурсов на странице и количества одновременно запускаемых аудитов.

Работа с Node.js

При использовании 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, output: 'json', disableStorageReset: false};
  const runnerResult = await lighthouse('https://example.com', options);

  console.log('Lighthouse score:', runnerResult.lhr.categories.performance.score);
  await chrome.kill();
})();

Ключевые моменты:

  • Опция disableStorageReset позволяет сохранять данные между запусками.
  • Порт Chrome используется для подключения к существующему инстансу браузера, что предотвращает полную перезагрузку всех ресурсов и ускоряет работу.
  • JSON-результаты можно сохранять и повторно использовать для генерации HTML-отчетов без повторного анализа страницы.

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

Для больших проектов кеширование интегрируется в CI/CD-процессы:

  • Локальный кеш позволяет ускорять проверку новых сборок.
  • Временные каталоги с кешем можно сохранять между сборками, используя инструменты вроде tmp или node-cache.
  • Настройка автоматической очистки кеша по расписанию предотвращает переполнение памяти.

Пример использования временного кеша в Node.js:

const fs = require('fs');
const path = require('path');

const cacheDir = path.resolve(__dirname, '.lighthouse-cache');

if (!fs.existsSync(cacheDir)) fs.mkdirSync(cacheDir);

const cacheFile = path.join(cacheDir, 'last-run.json');
if (fs.existsSync(cacheFile)) {
  const cachedResult = JSON.parse(fs.readFileSync(cacheFile, 'utf-8'));
  console.log('Используем кеш:', cachedResult.timestamp);
}

// После завершения аудита сохраняем новый результат
fs.writeFileSync(cacheFile, JSON.stringify({timestamp: Date.now(), data: runnerResult.lhr}));

Практические советы

  • Использовать кеширование для повторных проверок в процессе разработки.
  • Не хранить кеш слишком долго, чтобы данные аудита не устаревали.
  • Ограничивать размер кеша и периодически очищать его в CI/CD.
  • Для сложных страниц с динамическим контентом проверять, что кеш не приводит к некорректным результатам метрик.

Влияние кеширования на метрики

Кеширование может ускорять Lighthouse, но важно понимать влияние на точность:

  • Метрики рендеринга (FCP, LCP) могут немного отличаться из-за кешированных ресурсов.
  • Для окончательного аудита перед деплоем рекомендуется проводить полную проверку с очисткой кеша.
  • Использование кеша оправдано для мониторинга прогресса производительности и оптимизации CI/CD, но не для финальных отчетов, на которых основываются решения по оптимизации.

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