Модификация существующих аудитов

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


Понимание структуры аудита

Каждый аудит в Lighthouse представлен как класс с набором обязательных свойств и методов. Основные элементы:

  • meta – объект, содержащий информацию об аудите: id, title, description, requiredArtifacts.
  • defaultOptions – объект с настройками по умолчанию.
  • audit(artifacts, context) – асинхронный метод, выполняющий анализ и возвращающий объект результата.

Результат аудита всегда должен содержать:

  • score – числовой показатель от 0 до 1 или null.
  • details – расширенная информация в формате таблицы, списка или диаграммы.
  • errorMessage – строка с описанием ошибки при невозможности выполнения аудита.

Изменение этих компонентов позволяет адаптировать стандартные проверки под нужды конкретного проекта.


Подмена метода audit

Самый прямой способ модификации — это переопределение метода audit. Например:

const OriginalAudit = require('lighthouse/lighthouse-core/audits/first-contentful-paint.js');

class CustomFCP extends OriginalAudit {
  static async audit(artifacts, context) {
    const result = await super.audit(artifacts, context);
    // Добавляем кастомную метрику
    if (result.score < 0.5) {
      result.warning = 'FCP ниже рекомендуемого значения';
    }
    return result;
  }
}

Преимущество этого подхода — сохранение всей внутренней логики оригинального аудита и добавление новых проверок или метрик.


Изменение метаданных аудита

Иногда необходимо изменить текстовое описание аудита или его идентификатор. Для этого достаточно переопределить статическое свойство meta:

class CustomFCP extends OriginalAudit {
  static get meta() {
    return {
      ...super.meta,
      title: 'Первый контентный элемент (адаптированный)',
      description: 'Изменённое описание аудита для внутренних целей проекта',
    };
  }
}

Такое переопределение полезно для внутренней документации или отображения результатов в собственных интерфейсах отчётности.


Настройка опций аудита

Многие встроенные аудиты используют defaultOptions для настройки пороговых значений или поведения. Эти значения можно модифицировать:

class CustomCLS extends require('lighthouse/lighthouse-core/audits/cumulative-layout-shift.js') {
  static get defaultOptions() {
    return {
      ...super.defaultOptions,
      scorePOD: {
        good: 0.05,
        needsImprovement: 0.15,
      },
    };
  }
}

Изменение опций позволяет подстроить пороговые значения под требования конкретного проекта без изменения логики расчёта.


Подмена артефактов

Аудиты опираются на артефакты (artifacts), которые предоставляют данные о странице. Для расширенной кастомизации можно модифицировать артефакты через контекст аудита:

class CustomAudit extends OriginalAudit {
  static async audit(artifacts, context) {
    const customArtifacts = {
      ...artifacts,
      MyCustomData: await fetchCustomMetrics(),
    };
    return super.audit(customArtifacts, context);
  }
}

Таким образом, можно добавлять дополнительные данные для проверки, не изменяя исходный код Lighthouse.


Объединение нескольких аудитов

Иногда требуется создать новый аудит, объединяющий результаты нескольких стандартных:

class CombinedAudit {
  static async audit(artifacts, context) {
    const fcpResult = await require('lighthouse/lighthouse-core/audits/first-contentful-paint.js').audit(artifacts, context);
    const lcpResult = await require('lighthouse/lighthouse-core/audits/largest-contentful-paint.js').audit(artifacts, context);

    return {
      score: Math.min(fcpResult.score, lcpResult.score),
      details: {
        type: 'table',
        items: [
          { metric: 'FCP', value: fcpResult.score },
          { metric: 'LCP', value: lcpResult.score },
        ],
      },
    };
  }
}

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


Интеграция кастомных аудитов в сборку Lighthouse

После модификации аудита его необходимо зарегистрировать для использования в запуске Lighthouse:

const { Runner } = require('lighthouse/lighthouse-core/runner');
const config = {
  extends: 'lighthouse:default',
  audits: [
    'lighthouse/lighthouse-core/audits/first-contentful-paint.js',
    './custom-audits/custom-fcp.js',
  ],
};

Runner.run({ url: 'https://example.com', config }).then(results => {
  console.log(results.lhr.audits);
});

В конфигурации можно заменять стандартные аудиты на кастомные или добавлять новые, расширяя функционал без изменения ядра Lighthouse.


Практические рекомендации

  • Сохранять оригинальные методы через super для минимизации ошибок при обновлениях Lighthouse.
  • Использовать defaultOptions и meta для документирования кастомного поведения аудита.
  • Добавлять новые артефакты только при необходимости, чтобы не увеличивать время анализа.
  • Проверять совместимость модифицированных аудитов с текущей версией Lighthouse, поскольку внутренние структуры могут меняться.

Модификация существующих аудитов в Lighthouse позволяет глубоко настраивать процесс анализа веб-приложений, интегрировать собственные бизнес-правила и создавать сложные метрики, оставаясь в рамках стандартного API.