Soft navigation — это механизм перехода между страницами без полной перезагрузки браузера. В современных одностраничных приложениях (SPA) и при использовании прогрессивных веб-приложений (PWA) soft navigation позволяет улучшить пользовательский опыт, уменьшая задержки и создавая ощущение мгновенной реакции интерфейса. В контексте Web Vitals это важно, так как большинство метрик производительности измеряются на уровне полной загрузки страницы. Переходы без перезагрузки требуют дополнительных подходов для точного измерения этих метрик.
Пересечение метрик и жизненного цикла страницы
Web Vitals, такие как Largest Contentful Paint (LCP) и Cumulative Layout
Shift (CLS), традиционно привязаны к событию load и
состоянию DOM после полной загрузки. В SPA после soft navigation эти
события могут не срабатывать, поэтому необходимо вручную инициировать
измерения.
Повторные измерения Метрики должны быть пересчитаны при каждом soft navigation. Например, если LCP зафиксирован на первой странице, при переходе на новую страницу без перезагрузки нужно сбросить предыдущие значения и начать сбор данных заново.
Обработка скрытых элементов и динамического контента В SPA часто используются lazy-loaded изображения и асинхронный контент. Метрики LCP и CLS требуют корректного отслеживания этих изменений, иначе показатели могут быть неточными.
Используется библиотека web-vitals от Google. Основные
шаги:
import {getCLS, getFID, getLCP} from 'web-vitals';
function sendToAnalytics(metric) {
console.log(metric.name, metric.value);
}
// Для каждой страницы при soft navigation
function trackVitals() {
getCLS(sendToAnalytics);
getFID(sendToAnalytics);
getLCP(sendToAnalytics);
}
// Пример вызова после soft navigation
window.addEventListener('soft-navigation', () => {
trackVitals();
});
Важный момент — инициализация метрик после того, как контент страницы уже загружен и визуально готов. В противном случае LCP будет зафиксирован слишком рано, а CLS не сможет учесть смещения элементов.
Web Vitals предоставляет экспериментальные возможности для более точного измерения в SPA и при нестандартных сценариях. Экспериментальный режим позволяет:
Для включения экспериментального режима используется параметр
reportAllChanges или отдельные функции:
import {getLCP} from 'web-vitals';
getLCP(metric => {
console.log('LCP value:', metric.value);
}, {reportAllChanges: true});
Здесь reportAllChanges: true позволяет получать
уведомления каждый раз, когда основной элемент LCP меняется в DOM. Это
критично для SPA, где основной контент часто подгружается
асинхронно.
Перезапуск метрик при каждом soft navigation Необходимо сбрасывать предыдущие замеры и регистрировать новые после полной визуальной готовности страницы.
Отслеживание асинхронного контента Использовать MutationObserver для контроля за изменениями DOM и корректного пересчета CLS и LCP.
Использование экспериментальных параметров
Включение reportAllChanges и аналогичных настроек позволяет
получать максимально точные показатели на страницах с динамическим
контентом.
Фиксация времени soft navigation Добавление
пользовательских маркеров performance.mark и использование
PerformanceObserver помогает точно связывать метрики Web
Vitals с конкретными переходами.
performance.mark('soft-nav-start');
// Загрузка нового контента
performance.mark('soft-nav-end');
performance.measure('soft-nav-duration', 'soft-nav-start', 'soft-nav-end');
function initVitalsTracking() {
function handleVitals() {
getCLS(sendToAnalytics);
getFID(sendToAnalytics);
getLCP(sendToAnalytics, {reportAllChanges: true});
}
window.addEventListener('soft-navigation', () => {
handleVitals();
});
handleVitals(); // первичный запуск при первой загрузке
}
Такой подход обеспечивает непрерывный сбор метрик, корректное отслеживание LCP и CLS при асинхронных изменениях и готовность аналитики для экспериментальных SPA-сценариев.