timeToFirstByte (TTFB) — это ключевой показатель
производительности веб-страницы, который измеряет время, прошедшее с
момента отправки браузером запроса к серверу до получения первого байта
ответа. В метриках Web Vitals TTFB играет важную роль, так как влияет на
восприятие скорости загрузки страницы пользователем и напрямую
коррелирует с Largest Contentful Paint (LCP).
TTFB включает три основных компонента:
Измерение TTFB в браузере осуществляется с использованием API
PerformanceTiming и более современного
PerformanceNavigationTiming. Пример получения значения TTFB
через PerformanceNavigationTiming:
const [navigation] = performance.getEntriesByType("navigation");
const ttfb = navigation.responseStart - navigation.requestStart;
console.log(`TTFB: ${ttfb} мс`);
В этом примере responseStart указывает момент получения
первого байта ответа от сервера, а requestStart — момент
отправки запроса. Разница между ними и есть TTFB.
Largest Contentful Paint измеряет время до отображения наибольшего видимого контента страницы, такого как изображение или блок текста. Чем выше TTFB, тем позднее браузер получает HTML-документ, что замедляет рендеринг и увеличивает LCP. Основные моменты взаимодействия TTFB и LCP:
Использование CDN и кеширования Размещение статических ресурсов ближе к пользователю сокращает TTFB. Применение кеширования HTML и статических файлов уменьшает нагрузку на сервер.
Оптимизация серверной логики Минимизация времени генерации страницы на сервере напрямую снижает TTFB. Например, предварительная генерация контента на стороне сервера (Server-Side Rendering) ускоряет ответ.
Асинхронная загрузка ресурсов Скрипты и стили,
блокирующие рендеринг, увеличивают фактическое время LCP, даже если TTFB
низкий. Их загрузку стоит выносить в async или
defer.
Профилирование серверных ответов Использование инструментов вроде Lighthouse или DevTools позволяет определить, какие ресурсы задерживают TTFB, и принять меры по ускорению.
Web Vitals предоставляет API для отслеживания LCP, а комбинация с TTFB позволяет выявить узкие места на сервере и в сети. Пример мониторинга TTFB и LCP в клиентском коде:
import { getLCP } from 'web-vitals';
const [navigation] = performance.getEntriesByType("navigation");
const ttfb = navigation.responseStart - navigation.requestStart;
console.log(`TTFB: ${ttfb} мс`);
getLCP((metric) => {
console.log(`LCP: ${metric.value} мс`);
if (ttfb > 200) {
console.warn('Высокий TTFB может негативно влиять на LCP');
}
});
В этом коде TTFB фиксируется из Navigation Timing, а LCP — через API
web-vitals. Такой подход позволяет анализировать
взаимосвязь серверной задержки и визуального рендеринга, выявляя узкие
места и планируя оптимизацию.
TTFB не только влияет на LCP, но также оказывает косвенное воздействие на First Contentful Paint (FCP) и Time to Interactive (TTI). Высокий TTFB замедляет получение HTML, что откладывает начало построения DOM и отрисовку контента, увеличивая все метрики загрузки страницы.
Ключевой принцип: снижение TTFB ускоряет загрузку основного контента, улучшает LCP и повышает общую производительность страницы.
Хотите, я могу подготовить следующую часть про конкретные способы сокращения TTFB на Node.js и популярных фреймворках с реальными примерами кода и измерений? Это будет логическое продолжение этой главы.