Web Vitals: что это и как мы их собираем?
Рома Ахмадуллин
Дром
Web Vitals
Что это и как мы их собираем?
Рома Ахмадуллин
фронтенд-разработчик в Дроме
контрибьючу в Доку
стараюсь приручить попугаев
Этап
Not loaded
Загрузить
Этап
TTFB
Продолжить загрузку
Этап
FCP
Продолжить загрузку
Этап
LCP
Продолжить загрузку
А где же CLS и INP?
Метрика
Chrome
Firefox
Safari
TTFB
✅
✅
✅
FCP
✅
✅
✅
LCP
✅
✅
❌
CLS
✅
❌
❌
INP
✅
❌
❌
Метрика
Chrome
Firefox
Safari
TTFB
✅
✅
✅
FCP
✅
✅
✅
LCP
✅
✅
( ✅ )
CLS
✅
❌
❌
INP
✅
( ✅ )
( ✅ )
Как считать?
Sentry.init({
// ...
integrations: [
Sentry.browserTracingIntegration({
enableInp: true,
}),
],
});
Sentry: tracing
const [navigationEntry] = performance.getEntriesByType('navigation');
if (navigationEntry) {
const { responseStart, activationStart } = navigationEntry;
const ttfb = responseStart - activationStart;
sendToBackend(ttfb);
}
const [navigationEntry] = performance.getEntriesByType('navigation');
if (navigationEntry) {
const { responseStart, activationStart } = navigationEntry;
const ttfb = responseStart - activationStart;
sendToBackend(ttfb);
}
const [navigationEntry] = performance.getEntriesByType('navigation');
if (navigationEntry) {
const { responseStart, activationStart } = navigationEntry;
const ttfb = responseStart - activationStart;
sendToBackend(ttfb);
}
const [navigationEntry] = performance.getEntriesByType('navigation');
if (navigationEntry) {
const { responseStart, activationStart } = navigationEntry;
const ttfb = responseStart - activationStart;
sendToBackend(ttfb);
}
const observer = new PerformanceObserver((list) => {
const entries = list.getEntries();
const lcp = entries[entries.length - 1].startTime;
sendToBackend(lcp);
});
observer.observe({
type: "largest-contentful-paint",
buffered: true,
});
const observer = new PerformanceObserver((list) => {
const entries = list.getEntries();
const lcp = entries[entries.length - 1].startTime;
sendToBackend(lcp);
});
observer.observe({
type: "largest-contentful-paint",
buffered: true,
});
const observer = new PerformanceObserver((list) => {
const entries = list.getEntries();
const lcp = entries[entries.length - 1].startTime;
sendToBackend(lcp);
});
observer.observe({
type: "largest-contentful-paint",
buffered: true,
});
const observer = new PerformanceObserver((list) => {
const entries = list.getEntries();
const lcp = entries[entries.length - 1].startTime;
sendToBackend(lcp);
});
observer.observe({
type: "largest-contentful-paint",
buffered: true,
});
import { onLCP, onINP, onCLS } from 'web-vitals';
onCLS(sendToBackend);
onINP(sendToBackend);
onLCP(sendToBackend);
Агрегация и визуализация
готовый бэкенд (Google Analytics, Sentry, ect)
Агрегация и визуализация
готовый бэкенд (Google Analytics, Sentry, ect)
самописное решение
Агрегация и визуализация
готовый бэкенд (Google Analytics, Sentry, ect)
самописное решение
// config.js
const config = {
...,
pages: [
{
id: 'home',
url: 'https://www.drom.ru/',
},
{
id: 'auto',
url: 'https://auto.drom.ru/',
},
{
id: 'auto_brand',
url: 'https://auto.drom.ru/toyota/',
},
{
id: 'auto_model',
url: 'https://auto.drom.ru/toyota/corolla/',
},
...,
],
};
// config.js
const config = {
...,
pages: [
{
id: 'home',
url: 'https://www.drom.ru/',
},
{
id: 'auto',
url: 'https://auto.drom.ru/',
},
{
id: 'auto_brand',
url: 'https://auto.drom.ru/toyota/',
},
{
id: 'auto_model',
url: 'https://auto.drom.ru/toyota/corolla/',
},
...,
],
};
// experiments.js
const experimentsConfig = {
no_gtm: {
params: { disablegtm: 1 },
},
no_ads: {
params: { disablead: 1 },
},
no_js: {
params: { disablejsinjector: 1, disableloadablescripts: 1 },
},
};
// config.js
const config = {
...,
pages: [
{
id: 'auto',
url: 'https://auto.drom.ru/',
},
...,
],
};
// experiments.js
const experimentsConfig = {
no_gtm: {
params: { disablegtm: 1 },
},
no_ads: {
params: { disablead: 1 },
},
no_js: {
params: { disablejsinjector: 1, disableloadablescripts: 1 },
},
};
// config.js
const config = {
...,
pages: [
{
id: 'auto',
url: 'https://auto.drom.ru/',
},
...,
],
};
// experiments.js
const experimentsConfig = {
no_gtm: {
params: { disablegtm: 1 },
},
no_ads: {
params: { disablead: 1 },
},
no_js: {
params: { disablejsinjector: 1, disableloadablescripts: 1 },
},
};
// config.js
const config = {
...,
pages: [
{
id: 'auto',
url: 'https://auto.drom.ru/',
},
...,
],
};
// experiments.js
const experimentsConfig = {
no_gtm: {
params: { disablegtm: 1 },
},
no_ads: {
params: { disablead: 1 },
},
no_js: {
params: { disablejsinjector: 1, disableloadablescripts: 1 },
},
};
'https://auto.drom.ru/' ,
'https://auto.drom.ru/?disablegtm =1 ' ,
'https://auto.drom.ru/?disablead =1 ,
'https://auto.drom.ru/?disablejsinjector =1 &disableloadablescripts =1 ' ,
// Controller на стороне Дрома
if (queryParams['disablegtm']) {
makeA();
} else {
makeB();
}
Page Speed Insights
Плюсы
Web Vitals и куча других метрик
Page Speed Insights
Плюсы
Web Vitals и куча других метрик
итоговый Score
Page Speed Insights
Плюсы
Web Vitals и куча других метрик
итоговый Score
эксперименты
Page Speed Insights
Плюсы
Web Vitals и куча других метрик
итоговый Score
эксперименты
Минусы
Page Speed Insights
Плюсы
Web Vitals и куча других метрик
итоговый Score
эксперименты
Минусы
эмуляторы
CRUX report – avg за 28 дней и только 75 перцентиль
Page Speed Insights
Плюсы
Web Vitals и куча других метрик
итоговый Score
эксперименты
Минусы
эмуляторы
CRUX report – avg за 28 дней и только 75 перцентиль
определеная страница, а не весь скоуп страниц данного вида
Page Speed Insights
Плюсы
Web Vitals и куча других метрик
итоговый Score
эксперименты
Минусы
эмуляторы
CRUX report – avg за 28 дней и только 75 перцентиль
определеная страница, а не весь скоуп страниц данного вида
Real User Monitoring
Плюсы
Real User Monitoring
Плюсы
реальные пользователи
вариативность перцентилей
Real User Monitoring
Плюсы
реальные пользователи
вариативность перцентилей
данные с точностью до дня
Real User Monitoring
Плюсы
реальные пользователи
вариативность перцентилей
данные с точностью до дня
Минусы
нет итогового Score'а производительности
Real User Monitoring
Плюсы
реальные пользователи
вариативность перцентилей
данные с точностью до дня
Минусы
нет итогового Score'а производительности
нет экспериментов
Real User Monitoring
Плюсы
реальные пользователи
вариативность перцентилей
данные с точностью до дня
Минусы
нет итогового Score'а производительности
нет экспериментов
При чем тут попугаи?
Web Vitals
TTFB Time To First Byte
FCP First Contentful Paint
Web Vitals
TTFB Time To First Byte
FCP First Contentful Paint
LCP Largest Contentful Paint
Web Vitals
TTFB Time To First Byte
FCP First Contentful Paint
LCP Largest Contentful Paint
CLS Cumulative Layout Shift
Web Vitals
TTFB Time To First Byte
FCP First Contentful Paint
LCP Largest Contentful Paint
CLS Cumulative Layout Shift
INP Interaction to Next Paint
Web Vitals
TTFB Time To First Byte
FCP First Contentful Paint
LCP Largest Contentful Paint
CLS Cumulative Layout Shift
INP Interaction to Next Paint
Core Web Vitals
TTFB Time To First Byte
FCP First Contentful Paint
LCP Largest Contentful Paint
CLS Cumulative Layout Shift
INP Interaction to Next Paint
Характеристика
Lab data
Field data
Web Vitals
✅
✅
Характеристика
Lab data
Field data
Web Vitals
✅
✅
Другие метрики
✅
❌
Характеристика
Lab data
Field data
Web Vitals
✅
✅
Другие метрики
✅
❌
Интеграция в код сайта
❌
✅
Характеристика
Lab data
Field data
Web Vitals
✅
✅
Другие метрики
✅
❌
Интеграция в код сайта
❌
✅
Разные устройства и сети
❌
✅
Характеристика
Lab data
Field data
Web Vitals
✅
✅
Другие метрики
✅
❌
Интеграция в код сайта
❌
✅
Разные устройства и сети
❌
✅
Разные сценарии и страницы
❌
✅
Характеристика
Lab data
Field data
Web Vitals
✅
✅
Другие метрики
✅
❌
Интеграция в код сайта
❌
✅
Разные устройства и сети
❌
✅
Разные сценарии и страницы
❌
✅
Вариативность перцентилей
❌
✅
Характеристика
Lab data
Field data
Web Vitals
✅
✅
Другие метрики
✅
❌
Интеграция в код сайта
❌
✅
Разные устройства и сети
❌
✅
Разные сценарии и страницы
❌
✅
Вариативность перцентилей
❌
✅
Реальный пользовательский опыт
❌
✅
Характеристика
Lab data
Field data
Web Vitals
✅
✅
Другие метрики
✅
❌
Интеграция в код сайта
❌
✅
Разные устройства и сети
❌
✅
Разные сценарии и страницы
❌
✅
Вариативность перцентилей
❌
✅
Реальный пользовательский опыт
❌
✅
CI/CD, процесс разработки
✅
❌
Характеристика
Lab data
Field data
Web Vitals
✅
✅
Другие метрики
✅
❌
Интеграция в код сайта
❌
✅
Разные устройства и сети
❌
✅
Разные сценарии и страницы
❌
✅
Вариативность перцентилей
❌
✅
Реальный пользовательский опыт
❌
✅
CI/CD, процесс разработки
✅
❌
Мониторинг перформанса в проде
❌
✅
Характеристика
Lab data
Field data
Web Vitals
✅
✅
Другие метрики
✅
❌
Интеграция в код сайта
❌
✅
Разные устройства и сети
❌
✅
Разные сценарии и страницы
❌
✅
Вариативность перцентилей
❌
✅
Реальный пользовательский опыт
❌
✅
CI/CD, процесс разработки
✅
❌
Мониторинг перформанса в проде
❌
✅
Всем соточку в лайтхаусе!
Оценить доклад