Статически генерируемые сайты (Static Site Generation, SSG) создаются
заранее на этапе сборки и предоставляют пользователю готовые HTML-файлы
без необходимости серверной генерации на лету. Несмотря на это,
производительность и пользовательский опыт остаются критически важными
аспектами, которые можно измерять с помощью Web Vitals.
Библиотека web-vitals в JavaScript позволяет собирать
ключевые показатели производительности на клиентской стороне, включая
LCP, FID, CLS,
INP и TTFB.
LCP измеряет время рендеринга самого большого видимого элемента в области просмотра. Для статических сайтов важно, что LCP часто определяется скоростью доставки контента и временем загрузки ресурсов, таких как изображения или шрифты.
Пример использования:
import { getLCP } from 'web-vitals';
getLCP(metric => {
console.log('LCP:', metric.value);
// metric.value — время в миллисекундах
});
Ключевой момент: даже статически сгенерированный HTML может иметь плохой LCP, если изображения загружаются медленно или шрифты блокируют рендер.
FID измеряет задержку между первой интеракцией пользователя и обработкой события браузером. В статических сайтах основная проблема — выполнение тяжелого JavaScript после загрузки страницы.
Пример использования:
import { getFID } from 'web-vitals';
getFID(metric => {
console.log('FID:', metric.value);
});
Для оптимизации FID на статических сайтах применяют:
requestIdleCallback для задач, не
критичных для первого взаимодействия.CLS оценивает визуальную стабильность страницы, измеряя смещения элементов после загрузки. На статических сайтах CLS часто возникает из-за:
@font-face.Пример использования:
import { getCLS } from 'web-vitals';
getCLS(metric => {
console.log('CLS:', metric.value);
});
Чтобы уменьшить CLS, рекомендуется:
font-display: swap для шрифтов.INP измеряет интерактивность страницы во время всего жизненного цикла. Для статических сайтов INP позволяет понять, насколько быстро страница реагирует на действия пользователя после полной загрузки.
Пример использования:
import { getINP } from 'web-vitals';
getINP(metric => {
console.log('INP:', metric.value);
});
Оптимизация INP включает:
TTFB измеряет время от запроса до получения первого байта данных от сервера. В SSG этот показатель обычно минимален, так как HTML уже подготовлен на сервере или CDN.
Пример использования:
import { getTTFB } from 'web-vitals';
getTTFB(metric => {
console.log('TTFB:', metric.value);
});
Даже при статической генерации TTFB зависит от:
npm install web-vitals
import { getLCP, getFID, getCLS, getINP, getTTFB } from 'web-vitals';
function sendToAnalytics(metric) {
fetch('/analytics', {
method: 'POST',
body: JSON.stringify(metric),
keepalive: true,
headers: { 'Content-Type': 'application/json' }
});
}
getLCP(sendToAnalytics);
getFID(sendToAnalytics);
getCLS(sendToAnalytics);
getINP(sendToAnalytics);
getTTFB(sendToAnalytics);
web-vitals в pages/_app.js.gatsby-browser.js.Эффективное использование web-vitals позволяет выявлять
узкие места производительности и интерактивности даже на статически
сгенерированных сайтах, обеспечивая плавный и быстрый пользовательский
опыт.