Создание собственного аудита

Lighthouse в среде Node.js может быть установлен как отдельный пакет. Для этого используется стандартный пакетный менеджер npm:

npm install -g lighthouse

После установки появляется возможность вызывать Lighthouse как CLI или использовать его программно через API. Для создания собственного аудита предпочтителен программный подход, поскольку он позволяет интегрировать анализ прямо в тестовую среду или CI/CD pipeline.

Основные компоненты аудита

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

  1. Config – конфигурация, которая определяет, какие категории и аудиты будут выполнены.
  2. Audits – собственно функции проверки, возвращающие результаты в виде чисел, строк или объектов.
  3. Report – модуль генерации отчета в HTML, JSON или текстовом виде.

При создании собственного аудита требуется определить новый audit, зарегистрировать его в конфигурации и указать категории, в которые он будет включен.

Структура собственного аудита

Собственный аудит представляет собой класс, наследующийся от Audit. Основные обязательные поля:

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

Пример минимальной структуры:

const Audit = require('lighthouse').Audit;

class MyCustomAudit extends Audit {
  static get meta() {
    return {
      id: 'my-custom-audit',
      title: 'Проверка на наличие метатега description',
      description: 'Аудит проверяет, что на странице присутствует метатег description',
      requiredArtifacts: ['DOM']
    };
  }

  static async audit(artifacts) {
    const dom = artifacts.DOM;
    const descriptionTag = dom.querySelector('meta[name="description"]');
    const score = descriptionTag ? 1 : 0;

    return {
      score,
      details: {
        type: 'text',
        items: [descriptionTag ? 'Мета-тег найден' : 'Мета-тег отсутствует']
      }
    };
  }
}

module.exports = MyCustomAudit;

Создание конфигурации с новым аудитом

Конфигурация указывает, какие категории и аудиты включены в запуск. Для подключения собственного аудита нужно создать объект конфигурации:

const lighthouse = require('lighthouse');
const MyCustomAudit = require('./my-custom-audit');

const customConfig = {
  extends: 'lighthouse:default',
  audits: [
    MyCustomAudit
  ],
  categories: {
    'seo': {
      title: 'SEO',
      description: 'SEO-аудиты',
      auditRefs: [
        { id: 'my-custom-audit', weight: 1 }
      ]
    }
  }
};

Вызов аудита программно

Для запуска аудита используется функция lighthouse() с передачей URL, опций и конфигурации:

const chromeLauncher = require('chrome-launcher');

(async () => {
  const chrome = await chromeLauncher.launch({chromeFlags: ['--headless']});
  const options = { port: chrome.port };
  
  const runnerResult = await lighthouse('https://example.com', options, customConfig);

  console.log('Результат аудита:', runnerResult.lhr.categories.seo);

  await chrome.kill();
})();

Артефакты и их использование

Lighthouse собирает данные о странице в виде артефактов. Для собственного аудита необходимо указать, какие артефакты нужны (requiredArtifacts), и использовать их в методе audit(). Примеры артефактов:

  • DOM – структура страницы.
  • URL – текущий URL.
  • MetaElements – массив всех метатегов.
  • Scripts – список всех загруженных скриптов.

Артефакты можно комбинировать для более сложных проверок, например, проверка загрузки изображений с атрибутом alt и соответствие требованиям SEO.

Формат возврата результата

Метод audit() возвращает объект с обязательным полем score (от 0 до 1) и полем details. Детали могут быть следующих типов:

  • text – текстовое описание результата.
  • table – таблица с несколькими строками и колонками.
  • list – список элементов.

Дополнительно можно возвращать numericValue для количественных проверок и displayValue для отображаемого значения в отчете.

Интеграция с CI/CD

Собственные аудиты удобно интегрировать в CI/CD, например, через запуск скрипта Node.js в GitHub Actions или GitLab CI. Результаты можно выводить в консоль или сохранять в JSON для последующего анализа. Для автоматизации можно настроить threshold-проверки:

if (runnerResult.lhr.categories.seo.score < 1) {
  throw new Error('SEO-аудит не пройден');
}

Советы по разработке сложных аудитов

  • Минимизировать количество синхронных операций; использовать асинхронные методы для сетевых запросов.
  • Использовать готовые артефакты Lighthouse вместо самостоятельного обхода DOM.
  • Писать тесты на собственные аудиты, используя реальные страницы и мок-артефакты.
  • Поддерживать совместимость с последними версиями Lighthouse, проверяя meta.requiredLighthouseVersion.