Система аудитов в библиотеке Lighthouse представляет собой модульную структуру, где каждая проверка (audit) является независимым классом с четко определённым интерфейсом. Аудиты работают поверх результатов трассировки, сетевых логов и артефактов, собранных во время прогона.
Каждый аудит:
Базовая единица — класс, наследующийся от Audit.
Каждый аудит реализуется как ES6-класс:
const Audit = require('lighthouse').Audit;
class MyAudit extends Audit {
static get meta() {
return {
id: 'my-audit',
title: 'Описание аудита',
failureTitle: 'Описание при провале',
description: 'Подробное описание проверки',
requiredArtifacts: ['MyArtifact'],
};
}
static audit(artifacts, context) {
// логика проверки
return {
score: 1,
displayValue: 'OK',
};
}
}
module.exports = MyAudit;
meta)Метод meta определяет ключевые характеристики:
scoreDisplayMode — режим отображения:
numericbinarymanualnotApplicableinformativesupportedModes — режимы Lighthouse (navigation,
timespan, snapshot)
Аудиты не работают напрямую с браузером. Они используют заранее собранные данные:
Пример:
static get meta() {
return {
requiredArtifacts: ['URL', 'ConsoleMessages'],
};
}
Использование:
static audit(artifacts) {
const messages = artifacts.ConsoleMessages;
}
context)Второй аргумент метода audit содержит:
settings — настройки Lighthouseoptions — параметры аудитаcomputedCache — кэш вычисленийПример:
static audit(artifacts, context) {
const throttling = context.settings.throttling;
}
Аудит возвращает объект:
{
score: 0.0 - 1.0,
displayValue: string,
explanation: string,
details: object
}
null (если не применимо)scoreDisplayMode)Оценка от 0 до 1:
score: 0.85
Только 0 или 1:
score: hasError ? 0 : 1
Без оценки:
score: null
Требует ручной проверки
details)Для вывода сложных данных используется поле details.
details: {
type: 'table',
headings: [
{key: 'url', itemType: 'url', text: 'URL'},
{key: 'size', itemType: 'bytes', text: 'Размер'},
],
items: [
{url: 'https://example.com', size: 12345},
],
}
details: {
type: 'list',
items: [
{text: 'Ошибка 1'},
{text: 'Ошибка 2'},
],
}
Для повторного использования логики применяются computed artifacts.
Пример:
const ComputedArtifact = require('lighthouse').computedArtifacts.MyComputed;
static async audit(artifacts, context) {
const result = await ComputedArtifact.request(artifacts, context);
}
Преимущества:
Метод audit может быть асинхронным:
static async audit(artifacts) {
const data = await someAsyncFunction();
return {
score: data.ok ? 1 : 0,
};
}
class ImageSizeAudit extends Audit {
static get meta() {
return {
id: 'image-size',
title: 'Оптимизация изображений',
failureTitle: 'Изображения не оптимизированы',
requiredArtifacts: ['NetworkRecords'],
};
}
static audit(artifacts) {
const images = artifacts.NetworkRecords.filter(r =>
r.resourceType === 'Image'
);
const oversized = images.filter(img => img.transferSize > 100000);
return {
score: oversized.length === 0 ? 1 : 0,
displayValue: `${oversized.length} больших изображений`,
details: {
type: 'table',
headings: [
{key: 'url', text: 'URL'},
{key: 'size', text: 'Размер'},
],
items: oversized.map(img => ({
url: img.url,
size: img.transferSize,
})),
},
};
}
}
Аудиты подключаются через конфигурацию:
module.exports = {
audits: [
'my-audit',
'image-size',
],
};
Или с параметрами:
{
path: 'my-audit',
options: {
threshold: 1000,
},
}
Аудиты объединяются в категории:
categories: {
performance: {
audits: [
{id: 'image-size', weight: 1},
],
},
}
Вес влияет на итоговый score категории.
При ошибке аудит должен возвращать корректный результат:
try {
// логика
} catch (e) {
return {
score: 0,
explanation: 'Ошибка выполнения аудита',
};
}
Минимальные зависимости
Чистая логика
Детерминированность
Производительность
Аудиты можно:
Через Node API:
const lighthouse = require('lighthouse');
const result = await lighthouse(url, {
port: 9222,
}, {
extends: 'lighthouse:default',
audits: ['my-audit'],
});
Аудиты не собирают данные напрямую. Для этого используются gatherers:
Связь через artifacts:
requiredArtifacts: ['MyCustomArtifact']
Используется mocha/jest:
it('should pass audit', async () => {
const artifacts = {...};
const result = await MyAudit.audit(artifacts);
assert.equal(result.score, 1);
});
Каждый аудит влияет на:
Чем выше точность и релевантность аудита, тем полезнее итоговый отчёт Lighthouse.
if (!artifacts.URL.finalUrl.includes('https')) {
return {
score: null,
};
}
const score = value < threshold ? 1 : 0;
const score = (a + b + c) / 3;
Аудиты являются центральным этапом анализа, преобразуя сырые данные в осмысленные метрики и рекомендации.