Браузеры применяют back/forward cache (bfcache) для ускорения навигации между страницами, сохраняя полное состояние документа в памяти. В отличие от обычного кэширования, bfcache сохраняет DOM, JavaScript-окружение и все ресурсы страницы, что позволяет моментально возвращаться к предыдущей странице без повторной загрузки и рендеринга. Это влияет на измерение Web Vitals, поскольку метрики, рассчитанные при первой загрузке, могут не отражать поведение страницы при возврате из bfcache.
Сохранение состояния страницы При переходе на другую страницу текущий документ помещается в bfcache. В этот момент:
visibilitychange и pagehide
вызываются перед помещением страницы в bfcache.Восстановление страницы При возвращении:
pageshow и
visibilitychange.Отличие от обычной загрузки Метрики типа Largest Contentful Paint (LCP) или Cumulative Layout Shift (CLS), которые отслеживаются в Web Vitals, могут быть некорректными, если не учитывать восстановление из bfcache. Например, LCP рассчитывается только при первой загрузке страницы, а повторный показ страницы не инициирует новое измерение LCP по умолчанию.
largest-contentful-paint и проверять
event.persisted в событии pageshow.window.addEventListener('pageshow', (event) => {
if (event.persisted) {
console.log('Страница восстановлена из bfcache');
}
});
const observer = new PerformanceObserver((list) => {
for (const entry of list.getEntries()) {
console.log('LCP:', entry.startTime);
}
});
observer.observe({ type: 'largest-contentful-paint', buffered: true });
window.addEventListener('pageshow', (event) => {
if (event.persisted) {
console.log('События пользовательского ввода могут быть измерены отдельно');
}
});
let clsValue = 0;
const observer = new PerformanceObserver((list) => {
for (const entry of list.getEntries()) {
clsValue += entry.value;
}
});
observer.observe({ type: 'layout-shift', buffered: true });
window.addEventListener('pageshow', (event) => {
if (event.persisted) {
console.log('CLS на восстановленной странице:', clsValue);
}
});
Отслеживание событий pageshow и
pagehide
pageshow с event.persisted === true
сигнализирует о восстановлении страницы.Буферизация PerformanceObserver
{ buffered: true } для LCP и CLS, чтобы
получать метрики даже после восстановления страницы.Session-based подход
Валидация данных Web Vitals
pageshow, pagehide и
PerformanceObserver обеспечивает корректное отслеживание и
накопление метрик при bfcache-навигации.Эта практика критична для аналитики и оптимизации производительности, особенно для SPA и сайтов с высокой динамикой контента.