Web Vitals — это набор показателей, отражающих качество
пользовательского опыта на веб-странице. В JavaScript их можно измерять
с помощью официальной библиотеки web-vitals,
которая предоставляет API для отслеживания ключевых метрик:
Библиотека Web Vitals экспортирует функции getLCP,
getFID, getCLS, getTTFB,
getINP, каждая из которых принимает callback, в который
передаётся объект с данными метрики, включая значения в миллисекундах и
дополнительные детали.
import { getLCP, getFID, getCLS } from 'web-vitals';
getLCP(metric => {
console.log('LCP:', metric.value);
});
getFID(metric => {
console.log('FID:', metric.value);
});
getCLS(metric => {
console.log('CLS:', metric.value);
});
Функции автоматически начинают измерения при загрузке страницы и вызывают callback при получении данных. Для более сложного анализа можно собирать результаты в массив и отправлять на сервер аналитики.
Playwright позволяет запускать полноценные браузерные сессии и взаимодействовать с реальным DOM, что делает его идеальным инструментом для интеграционных тестов Web Vitals.
npm install playwright web-vitals
// tests/webVitals.spec.js
const { test, expect } = require('@playwright/test');
test('измерение Web Vitals', async ({ page }) => {
await page.goto('https://example.com');
const metrics = await page.evaluate(() => {
return new Promise(resolve => {
const results = {};
import('web-vitals').then(({ getLCP, getFID, getCLS }) => {
getLCP(metric => { results.lcp = metric.value; checkComplete(); });
getFID(metric => { results.fid = metric.value; checkComplete(); });
getCLS(metric => { results.cls = metric.value; checkComplete(); });
let count = 0;
function checkComplete() {
count++;
if (count === 3) resolve(results);
}
});
});
});
console.log('Web Vitals metrics:', metrics);
expect(metrics.lcp).toBeGreaterThan(0);
expect(metrics.fid).toBeGreaterThanOrEqual(0);
expect(metrics.cls).toBeLessThan(0.25);
});
В этом примере создаётся асинхронный Promise, который ждёт все три
метрики (LCP, FID, CLS) и
возвращает их в тест. Это позволяет использовать реальные значения,
полученные при рендеринге страницы.
При интеграционных тестах важно учитывать:
await page.emulateNetworkConditions({
offline: false,
downloadThroughput: 500 * 1024 / 8,
uploadThroughput: 500 * 1024 / 8,
latency: 200,
});
После получения метрик их можно сохранять для последующего анализа:
const metrics = await page.evaluate(() => window.__WEB_VITALS_METRICS__);
await saveMetricsToDB(metrics);
Рекомендуется хранить:
Это позволяет строить отчёты, визуализировать тренды и выявлять страницы с низким качеством пользовательского опыта.
page.tracing.start() /
page.tracing.stop()) помогает визуально анализировать
проблемы рендеринга.test.beforeEach(async ({ browser }) => {
const context = await browser.newContext();
const page = await context.newPage();
});
Для построения комплексных тестов можно комбинировать метрики:
const aggregatedMetrics = metricsArray.reduce((acc, metric) => {
acc.lcp += metric.lcp;
acc.fid = Math.max(acc.fid, metric.fid);
acc.cls += metric.cls;
return acc;
}, { lcp: 0, fid: 0, cls: 0 });
Такой подход позволяет создавать систематическую базу данных по производительности интерфейса, пригодную для CI/CD тестов и мониторинга после релиза.