Web Vitals — это метрики, измеряющие пользовательский опыт на сайте. Основные показатели, такие как Largest Contentful Paint (LCP), First Input Delay (FID) и Cumulative Layout Shift (CLS), рассчитаны на реальных пользователей. При этом данные могут искажаться, если в статистику попадают:
Игнорирование этих факторов приводит к неверной оценке производительности сайта, ложным оптимизациям и недостоверной аналитике.
Бот — это скрипт или программа, которая выполняет действия на сайте автоматически. Примеры:
Синтетический запрос — тест, запускаемый человеком или инструментом для измерения скорости и отзывчивости сайта, но без настоящего взаимодействия пользователя. Например, Lighthouse, Puppeteer, Playwright.
Отличие синтетики от реальных пользователей в том, что они создают искусственную нагрузку, не отражающую типичный паттерн поведения.
Самый базовый метод. Боты часто имеют уникальные User-Agent строки. В JavaScript можно реализовать фильтрацию так:
const isBot = () => {
const ua = navigator.userAgent.toLowerCase();
return /bot|crawl|spider|slurp|mediapartners/i.test(ua);
};
if (!isBot()) {
import('web-vitals').then(({getCLS, getFID, getLCP}) => {
getCLS(console.log);
getFID(console.log);
getLCP(console.log);
});
}
Преимущества: простота реализации. Недостатки: некоторые боты маскируются под обычные браузеры, поэтому этот метод не является полностью надежным.
Реальные пользователи взаимодействуют с сайтом с естественной частотой. Боты могут генерировать десятки или сотни событий в секунду. Можно внедрить ограничение на регистрацию метрик при чрезмерной активности:
let eventCount = 0;
const MAX_EVENTS = 10;
const recordMetric = (metric) => {
eventCount++;
if (eventCount <= MAX_EVENTS) {
console.log(metric);
}
};
Боты обычно не имитируют случайные задержки между кликами или прокруткой. Для фильтрации можно измерять время между событиями и игнорировать слишком регулярные паттерны:
let lastEventTime = 0;
const trackEvent = (metric) => {
const now = performance.now();
if (now - lastEventTime < 50) return; // слишком частые события
lastEventTime = now;
console.log(metric);
};
Метрики вроде FID должны фиксироваться только при реальном взаимодействии пользователя: клик, нажатие клавиши, сенсорное событие. Синтетические инструменты часто пропускают эти действия или генерируют их программно. Использование событий DOM для фильтрации:
import {getFID} from 'web-vitals';
getFID((metric) => {
if (metric.name === 'FID' && metric.entryType === 'first-input') {
console.log(metric);
}
});
После фильтрации ботов и синтетики данные можно отправлять в системы аналитики. Например:
function sendMetricToAnalytics(metric) {
fetch('/analytics', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify(metric)
});
}
Важно, чтобы фильтрация выполнялась на клиенте, прежде чем данные попадут в аналитическую систему. Это снижает шум и увеличивает достоверность.
Эти практики помогают отделять реальные пользовательские показатели от шумных данных синтетики, обеспечивая корректную интерпретацию Web Vitals.