Браузер предоставляет возможность отслеживать тип навигации, которая
привела пользователя на текущую страницу, через объект
Navigation Timing API, который является частью более
широкой спецификации Performance API. Одним из ключевых
элементов этой информации является поле navigationType. Это
поле определяет, каким образом была инициирована загрузка страницы, и
играет важную роль при анализе производительности и пользовательского
опыта.
navigationTypeПоле navigationType доступно через объект:
performance.getEntriesByType('navigation')[0].type
или через более старый способ:
performance.navigation.type
Хотя второй вариант считается устаревшим и не рекомендуется для новых проектов, он все еще используется в некоторых браузерах для обратной совместимости.
navigationType возвращает строку (или числовое значение
в старой версии API), которая отражает способ загрузки страницы. На
основе этого можно оптимизировать логику измерения Web
Vitals и учитывать особенности разных сценариев навигации.
Существует несколько ключевых значений
navigationType:
navigate Отображает стандартную
навигацию, когда пользователь переходит на страницу:
reload Используется при
перезагрузке страницы пользователем (например, через кнопку «Обновить»
или сочетание клавиш F5). В этом случае браузер может
кэшировать некоторые ресурсы, что влияет на LCP (Largest
Contentful Paint) и CLS (Cumulative Layout
Shift), а также на метрики времени ответа сервера
(TTFB).
back_forward Указывает, что
пользователь вернулся на страницу через историю браузера (кнопки «Назад»
или «Вперед»). Для таких переходов браузеры часто используют
bfcache (back-forward cache), что означает мгновенную
загрузку страницы без повторного запроса ресурсов. При этом метрики
загрузки могут сильно отличаться от стандартного
navigate.
prerender (редко
используется) Встречается при предварительном рендеринге страницы
браузером. Браузеры, поддерживающие эту технологию, загружают страницу в
фоновом режиме, прежде чем пользователь на неё перейдет. В таком случае
начальные метрики могут быть недостоверными, если измерять их сразу
после prerender.
Поле navigationType позволяет различать сценарии,
влияющие на производительность и корректность метрик Web Vitals:
back_forward или prerender LCP может быть
зарегистрирован почти мгновенно, что не отражает реального опыта новой
загрузки.reload и
navigate смещения контента более вероятны из-за загрузки
ресурсов с нуля, тогда как back_forward часто показывает
низкий CLS.navigate браузер инициирует полную загрузку, а при
back_forward — восстанавливает состояние.Пример корректного получения типа навигации и логики обработки:
const [navigationEntry] = performance.getEntriesByType('navigation');
switch (navigationEntry.type) {
case 'navigate':
console.log('Полная загрузка страницы');
break;
case 'reload':
console.log('Перезагрузка страницы');
break;
case 'back_forward':
console.log('Возврат через историю браузера');
break;
case 'prerender':
console.log('Страница предварительно загружена');
break;
}
Современные браузеры:
performance.getEntriesByType('navigation')[0].type
возвращает строковые значения: 'navigate',
'reload', 'back_forward',
'prerender'.
Старый API:
performance.navigation.type возвращает числовые коды:
0 — navigate1 — reload2 — back_forward255 — undefined/другие случаиДля корректной работы с Web Vitals рекомендуется ориентироваться на новый API, поскольку числовые коды могут быть менее очевидными и постепенно выводятся из стандарта.
При построении аналитических систем, отслеживающих Web Vitals, необходимо учитывать:
back_forward могут быть искажены, если не
учитывать использование bfcache.reload) и повторные переходы могут
показывать лучшие показатели за счет кэширования, что требует
нормализации данных.