Назад/вперед кеш

Оптимизируйте свои страницы для мгновенной загрузки при использовании кнопок браузера «Назад» и «Вперед».

Филип Уолтон
Филип Уолтон
Барри Поллард
Барри Поллард

Кэш назад/вперед (или bfcache) — это оптимизация браузера, которая обеспечивает мгновенную навигацию вперед и назад. Это значительно улучшает работу пользователей, особенно тех, у кого медленные сети или устройства.

Веб-разработчикам очень важно понимать, как оптимизировать ваши страницы для bfcache во всех браузерах, чтобы ваши пользователи могли воспользоваться преимуществами.

Совместимость с браузером

bfcache уже много лет поддерживается как в Firefox , так и в Safari , как на настольных компьютерах, так и на мобильных устройствах.

Начиная с версии 86, Chrome включил bfcache для навигации между сайтами на Android для небольшого процента пользователей. В последующих выпусках постепенно развертывалась дополнительная поддержка. Начиная с версии 96, bfcache включен для всех пользователей Chrome на настольных компьютерах и мобильных устройствах.

основы bfcache

bfcache — это кеш в памяти, в котором сохраняется полный снимок страницы (включая кучу JavaScript), когда пользователь уходит. Имея в памяти всю страницу, браузер может быстро и легко восстановить ее, если пользователь решит вернуться.

Сколько раз вы посещали веб-сайт и нажимали ссылку, чтобы перейти на другую страницу, только для того, чтобы понять, что это не то, что вам нужно, и нажать кнопку «Назад»? В этот момент bfcache может существенно повлиять на скорость загрузки предыдущей страницы:

Без включенного bfcache Инициируется новый запрос для загрузки предыдущей страницы, и, в зависимости от того, насколько хорошо эта страница оптимизирована для повторных посещений, браузеру может потребоваться повторно загрузить, повторно проанализировать и повторно выполнить некоторые (или все) ресурсы. оно только что скачалось.
С включенным bfcache Загрузка предыдущей страницы происходит по сути мгновенно , поскольку всю страницу можно восстановить из памяти, вообще не выходя в сеть.

Посмотрите это видео о bfcache в действии, чтобы понять, какое ускорение он может обеспечить при навигации:

В видео выше пример с bfcache работает немного быстрее, чем пример без него.

bfcache не только ускоряет навигацию, но и снижает использование данных, поскольку ресурсы не нужно загружать повторно.

Данные об использовании Chrome показывают, что 1 из 10 переходов на компьютере и 1 из 5 на мобильных устройствах осуществляется либо вперед, либо назад. Благодаря включенному bfcache браузеры могут исключить передачу данных и время, затрачиваемое на загрузку миллиардов веб-страниц каждый день!

Как работает «кэш»

«Кэш», используемый bfcache, отличается от кеша HTTP (который также полезен для ускорения повторной навигации). Bfcache — это снимок всей страницы в памяти (включая кучу JavaScript), тогда как HTTP-кеш содержит только ответы на ранее сделанные запросы. Поскольку довольно редко все запросы, необходимые для загрузки страницы, могут быть выполнены из HTTP-кеша, повторные посещения с использованием восстановления bfcache всегда выполняются быстрее, чем даже самая хорошо оптимизированная навигация без bfcache.

Однако создание снимка страницы в памяти сопряжено с некоторыми сложностями с точки зрения наилучшего сохранения выполняемого кода. Например, как обрабатывать вызовы setTimeout() , когда таймаут истекает, пока страница находится в bfcache?

Ответ заключается в том, что браузеры приостанавливают выполнение любых ожидающих таймеров или невыполненных обещаний (по сути, всех ожидающих задач в очередях задач JavaScript ) и возобновляют обработку задач, когда (или если) страница восстанавливается из bfcache.

В некоторых случаях это довольно низкий риск (например, тайм-ауты или обещания), но в других случаях это может привести к очень запутанному или неожиданному поведению. Например, если браузер приостанавливает задачу, необходимую как часть транзакции IndexedDB , это может повлиять на другие открытые вкладки в том же источнике (поскольку к одним и тем же базам данных IndexedDB можно получить доступ для нескольких вкладок одновременно). В результате браузеры обычно не пытаются кэшировать страницы в середине транзакции IndexedDB или использовать API, которые могут повлиять на другие страницы.

Более подробную информацию о том, как использование различных API влияет на возможность использования bfcache страницы, см. в разделе «Оптимизация страниц для bfcache» ниже.

Bfcache и одностраничные приложения (SPA)

bfcache работает с навигацией, управляемой браузером. Таким образом, он не работает с так называемой «мягкой навигацией» внутри SPA, но одним из главных преимуществ SPA является то, что эти типы навигации в любом случае должны быть быстрыми. Тем не менее, bfcache определенно может помочь при возвращении в SPA, вместо того, чтобы снова выполнять полную повторную инициализацию этого приложения с самого начала.

API для наблюдения за bfcache

Хотя bfcache — это оптимизация, которую браузеры выполняют автоматически, разработчикам по-прежнему важно знать, когда это происходит, чтобы они могли оптимизировать свои страницы для нее и соответствующим образом корректировать любые показатели или показатели производительности .

Основными событиями, используемыми для наблюдения за bfcache, являются события перехода страницpageshow и pagehide — которые существуют с тех пор, как существует bfcache, и поддерживаются практически во всех используемых сегодня браузерах .

Новые события жизненного цикла страницы — freeze и resume — также отправляются, когда страницы попадают в bfcache или выходят из него, а также в некоторых других ситуациях. Например, когда фоновая вкладка зависает, чтобы минимизировать загрузку процессора. Обратите внимание: события жизненного цикла страницы в настоящее время поддерживаются только в браузерах на базе Chromium.

Наблюдайте за восстановлением страницы из bfcache.

Событие pageshow срабатывает сразу после события load при первоначальной загрузке страницы и каждый раз, когда страница восстанавливается из bfcache. Событие pageshow имеет persisted свойство, которое будет иметь true , если страница была восстановлена ​​из bfcache (и false в противном случае). Вы можете использовать свойство persisted , чтобы отличать регулярные загрузки страниц от восстановления bfcache. Например:

window.addEventListener('pageshow', (event) => {
  if (event.persisted) {
    console.log('This page was restored from the bfcache.');
  } else {
    console.log('This page was loaded normally.');
  }
});

В браузерах, поддерживающих API жизненного цикла страницы, событие resume также срабатывает, когда страницы восстанавливаются из bfcache (непосредственно перед событием pageshow ), хотя оно также срабатывает, когда пользователь повторно посещает замороженную фоновую вкладку. Если вы хотите обновить состояние страницы после ее заморозки (включая страницы в bfcache), вы можете использовать событие resume , но если вы хотите измерить частоту попаданий в bfcache вашего сайта, вам нужно будет использовать событие pageshow . В некоторых случаях вам может потребоваться использовать оба.

Наблюдайте, когда страница входит в bfcache

Событие pagehide является аналогом события pageshow . Событие pageshow срабатывает, когда страница загружается нормально или восстанавливается из bfcache. Событие pagehide возникает, когда страница выгружается обычным образом или когда браузер пытается поместить ее в bfcache.

Событие pagehide также имеет persisted свойство, и если оно false , вы можете быть уверены, что страница не собирается войти в bfcache. Однако если свойство persisted имеет значение true , это не гарантирует, что страница будет кэширована. Это означает, что браузер намерен кэшировать страницу, но могут быть факторы, которые делают кеширование невозможным.

window.addEventListener('pagehide', (event) => {
  if (event.persisted) {
    console.log('This page *might* be entering the bfcache.');
  } else {
    console.log('This page will unload normally and be discarded.');
  }
});

Аналогично, событие freeze сработает сразу после события pagehide (если свойство persisted события имеет true ), но опять же это означает, что браузер намеревается кэшировать страницу. Возможно, ему все равно придется отказаться от него по ряду причин, описанных ниже.

Оптимизируйте свои страницы для bfcache

Не все страницы сохраняются в bfcache, и даже если страница сохраняется там, она не остается там бесконечно. Крайне важно, чтобы разработчики понимали, что делает страницы подходящими (и неподходящими) для bfcache, чтобы максимизировать вероятность попадания в кеш.

В следующих разделах описаны лучшие практики, позволяющие максимально повысить вероятность того, что браузер сможет кэшировать ваши страницы.

Никогда не используйте событие unload

Самый важный способ оптимизировать bfcache во всех браузерах — никогда не использовать событие unload . Всегда!

Событие unload является проблематичным для браузеров, поскольку оно предшествует bfcache, и многие страницы в Интернете работают с (разумным) предположением, что страница не будет продолжать существовать после запуска события unload . Это представляет собой проблему, поскольку многие из этих страниц также были созданы с предположением, что событие unload будет срабатывать каждый раз, когда пользователь уходит, что больше не соответствует действительности (и уже давно не соответствует действительности ).

Таким образом, браузеры сталкиваются с дилеммой: им приходится выбирать между чем-то, что может улучшить взаимодействие с пользователем, но также может привести к повреждению страницы.

На настольных компьютерах Chrome и Firefox решили запретить страницам использовать bfcache, если они добавляют прослушиватель unload , что менее рискованно, но также дисквалифицирует многие страницы. Safari попытается кэшировать некоторые страницы с помощью прослушивателя событий unload , но для уменьшения возможных сбоев он не будет запускать событие unload , когда пользователь уходит, что делает событие очень ненадежным.

На мобильных устройствах Chrome и Safari попытаются кэшировать страницы с помощью прослушивателя событий unload , поскольку риск поломки ниже из-за того, что событие unload всегда было крайне ненадежным на мобильных устройствах. Firefox рассматривает страницы, использующие unload , как непригодные для bfcache, за исключением iOS, которая требует, чтобы все браузеры использовали механизм рендеринга WebKit, и поэтому он ведет себя как Safari.

Вместо использования события unload используйте событие pagehide . Событие pagehide срабатывает во всех случаях, когда в данный момент срабатывает событие unload , а также срабатывает, когда страница помещается в bfcache.

Фактически, в Lighthouse есть аудит no-unload-listeners , который предупредит разработчиков, если какой-либо JavaScript на их страницах (в том числе из сторонних библиотек) добавит прослушиватель событий unload .

Из-за его ненадежности и влияния на производительность bfcache Chrome планирует отказаться от поддержки события unload .

Используйте политику разрешений, чтобы предотвратить использование обработчиков выгрузки на странице.

Сайты, которые не используют обработчики событий unload , могут гарантировать, что они не будут добавлены, используя политику разрешений из Chrome 115.

Permission-Policy: unload()

Это не позволяет третьим лицам или расширениям замедлять работу сайта, добавляя обработчики выгрузки и делая сайт недоступным для bfcache.

Добавляйте прослушиватели beforeunload только условно

Событие beforeunload не делает ваши страницы неприемлемыми для bfcache в современных браузерах, но раньше это было так, и оно по-прежнему ненадежно, поэтому избегайте его использования без крайней необходимости.

Однако, в отличие от события unload , у beforeunload есть законные варианты использования. Например, если вы хотите предупредить пользователя о том, что у него есть несохраненные изменения, которые они потеряют, если покинут страницу. В этом случае рекомендуется добавлять прослушиватели beforeunload только в том случае, если у пользователя есть несохраненные изменения, а затем удалять их сразу после сохранения несохраненных изменений.

Не
window.addEventListener('beforeunload', (event) => {
  if (pageHasUnsavedChanges()) {
    event.preventDefault();
    return event.returnValue = 'Are you sure you want to exit?';
  }
});
Приведенный выше код безоговорочно добавляет прослушиватель beforeunload .
Делать
function beforeUnloadListener(event) {
  event.preventDefault();
  return event.returnValue = 'Are you sure you want to exit?';
};

// A function that invokes a callback when the page has unsaved changes.
onPageHasUnsavedChanges(() => {
  window.addEventListener('beforeunload', beforeUnloadListener);
});

// A function that invokes a callback when the page's unsaved changes are resolved.
onAllChangesSaved(() => {
  window.removeEventListener('beforeunload', beforeUnloadListener);
});
Приведенный выше код добавляет прослушиватель beforeunload только тогда, когда это необходимо (и удаляет его, когда это не так).

Сведите к минимуму использование Cache-Control: no-store

Cache-Control: no-store — это HTTP-заголовок, который веб-серверы могут устанавливать для ответов, который указывает браузеру не сохранять ответ в каком-либо HTTP-кэше. Это следует использовать для ресурсов, содержащих конфиденциальную информацию пользователя, например страниц после входа в систему.

Хотя bfcache не является HTTP-кешем, исторически, когда Cache-Control: no-store установлен для самого ресурса страницы (в отличие от любого подресурса), браузеры предпочитали не сохранять страницу в bfcache. В настоящее время ведутся работы по изменению этого поведения для Chrome с целью сохранения конфиденциальности, но в настоящее время любые страницы, использующие Cache-Control: no-store , не будут иметь права на bfcache.

Поскольку Cache-Control: no-store ограничивает право страницы на использование bfcache, его следует устанавливать только на страницах, содержащих конфиденциальную информацию, где любое кэширование неприемлемо.

Для страниц, которые хотят всегда предоставлять актуальный контент (и этот контент не содержит конфиденциальной информации), используйте Cache-Control: no-cache или Cache-Control: max-age=0 . Эти директивы предписывают браузеру повторно проверить содержимое перед его обслуживанием и не влияют на соответствие страницы требованиям bfcache.

Обратите внимание, что когда страница восстанавливается из bfcache, она восстанавливается из памяти, а не из HTTP-кэша. В результате директивы типа Cache-Control: no-cache или Cache-Control: max-age=0 не учитываются, и повторная проверка перед отображением содержимого пользователю не выполняется.

Однако это, вероятно, по-прежнему удобнее для пользователя, поскольку восстановление bfcache происходит мгновенно, а поскольку страницы не остаются в bfcache очень долго, маловероятно, что содержимое устарело. Однако, если ваш контент меняется каждую минуту, вы можете получать любые обновления с помощью события pageshow , как описано в следующем разделе.

Обновите устаревшие или конфиденциальные данные после восстановления bfcache.

Если на вашем сайте сохраняется состояние пользователя, особенно любая конфиденциальная информация о пользователе, эти данные необходимо обновить или очистить после восстановления страницы из bfcache.

Например, если пользователь переходит на страницу оформления заказа, а затем обновляет свою корзину покупок, обратная навигация потенциально может предоставить устаревшую информацию, если устаревшая страница будет восстановлена ​​из bfcache.

Другой, более важный пример: пользователь выходит из сайта на общедоступном компьютере, а следующий пользователь нажимает кнопку «Назад». Это потенциально может привести к раскрытию личных данных, которые, как предполагал пользователь, были удалены при выходе из системы.

Чтобы избежать подобных ситуаций, полезно всегда обновлять страницу после события pageshow , если event.persisted имеет true :

window.addEventListener('pageshow', (event) => {
  if (event.persisted) {
    // Do any checks and updates to the page
  }
});

Хотя в идеале вы должны обновить содержимое на месте, для некоторых изменений вам может потребоваться принудительно полная перезагрузка. Следующий код проверяет наличие файла cookie, специфичного для сайта, в событии pageshow и перезагружается, если файл cookie не найден:

window.addEventListener('pageshow', (event) => {
  if (event.persisted && !document.cookie.match(/my-cookie/)) {
    // Force a reload if the user has logged out.
    location.reload();
  }
});

Преимущество перезагрузки заключается в том, что история по-прежнему сохраняется (чтобы обеспечить навигацию вперед), но в некоторых случаях перенаправление может быть более подходящим.

Восстановление рекламы и bfcache

Может возникнуть соблазн попытаться избежать использования bfcache для показа нового набора объявлений при каждой навигации вперед/назад. Однако, помимо влияния на производительность, сомнительно, приведет ли такое поведение к улучшению взаимодействия с рекламой. Пользователи, возможно, заметили рекламу, которую они намеревались вернуть, чтобы нажать на нее, но, перезагрузив ее, а не восстановив из bfcache, они не смогут этого сделать. Прежде чем делать предположения, важно протестировать этот сценарий — в идеале с помощью A/B-теста.

Для сайтов, которые хотят обновить рекламу при восстановлении bfcache, обновление только рекламы в событии pageshow , когда event.persisted имеет true , позволяет сделать это, не влияя на производительность страницы. Обратитесь к своему рекламному провайдеру, и вот один пример того, как это сделать с помощью тега публикации Google .

Избегайте ссылок window.opener

В старых браузерах, если страница была открыта с помощью window.open() по ссылке с target=_blank — без указания rel="noopener" — то открывающаяся страница будет иметь ссылку на объект окна открытой страницы.

Помимо угрозы безопасности , страница с ненулевой ссылкой window.opener не может быть безопасно помещена в bfcache, поскольку это может привести к поломке любых страниц, пытающихся получить к ней доступ.

В результате лучше избегать создания ссылок window.opener . Вы можете сделать это, используя rel="noopener" всякий раз, когда это возможно (обратите внимание, что теперь это значение по умолчанию во всех современных браузерах). Если ваш сайт требует открытия окна и управления им с помощью window.postMessage() или прямой ссылки на объект окна, ни открытое окно, ни средство открытия не будут иметь права на использование bfcache.

Всегда закрывайте открытые соединения, прежде чем пользователь уйдет.

Как упоминалось выше, когда страница помещается в bfcache, все запланированные задачи JavaScript приостанавливаются, а затем возобновляются, когда страница извлекается из кеша.

Если эти запланированные задачи JavaScript обращаются только к API-интерфейсам DOM — или к другим API-интерфейсам, изолированным только от текущей страницы, — то приостановка этих задач, пока страница не видна пользователю, не вызовет никаких проблем.

Однако если эти задачи связаны с API, которые также доступны с других страниц в том же источнике (например: IndexedDB, Web Locks, WebSockets и т. д.), это может быть проблематичным, поскольку приостановка этих задач может помешать запуску кода на других вкладках. .

В результате некоторые браузеры не будут пытаться поместить страницу в bfcache в следующих сценариях:

Если ваша страница использует какой-либо из этих API, лучше всегда закрывать соединения и удалять или отключать наблюдателей во время события pagehide или freeze страницы. Это позволит браузеру безопасно кэшировать страницу без риска влияния на другие открытые вкладки.

Затем, если страница будет восстановлена ​​из bfcache, вы сможете повторно открыть или повторно подключиться к этим API (в событиях pageshow или resume ).

В следующем примере показано, как гарантировать, что ваши страницы имеют право на bfcache при использовании IndexedDB, закрыв открытое соединение в прослушивателе событий pagehide :

let dbPromise;
function openDB() {
  if (!dbPromise) {
    dbPromise = new Promise((resolve, reject) => {
      const req = indexedDB.open('my-db', 1);
      req.onupgradeneeded = () => req.result.createObjectStore('keyval');
      req.onerror = () => reject(req.error);
      req.onsuccess = () => resolve(req.result);
    });
  }
  return dbPromise;
}

// Close the connection to the database when the user is leaving.
window.addEventListener('pagehide', () => {
  if (dbPromise) {
    dbPromise.then(db => db.close());
    dbPromise = null;
  }
});

// Open the connection when the page is loaded or restored from bfcache.
window.addEventListener('pageshow', () => openDB());

Протестируйте, чтобы убедиться, что ваши страницы кэшируются.

Инструменты разработчика Chrome помогут вам протестировать ваши страницы, чтобы убедиться, что они оптимизированы для bfcache, и выявить любые проблемы, которые могут помешать им получить право на участие.

Чтобы протестировать конкретную страницу, перейдите к ней в Chrome, а затем в DevTools выберите «Приложение» > «Обратный кеш» . Затем нажмите кнопку «Выполнить тест» , и DevTools попытается перейти назад и назад, чтобы определить, можно ли восстановить страницу из bfcache.

Панель обратного кэша в DevTools

В случае успеха на панели появится сообщение «Восстановлено из обратного кэша»:

DevTools сообщает, что страница успешно восстановлена ​​из bfcache

В случае неудачи на панели будет указано, что страница не была восстановлена, и будет указана причина.

Если причина кроется в том, что вы, как разработчик, можете устранить, это также будет указано:

DevTools сообщает о невозможности восстановить страницу из bfcache

На снимке экрана выше использование прослушивателя событий unload не позволяет странице использовать bfcache. Вы можете исправить это, переключившись с unload на использование pagehide :

Не
window.addEventListener('unload', ...);
Делать
window.addEventListener('pagehide', ...);

В Lighthouse 10.0 также добавлен аудит bfcache , который выполняет проверку, аналогичную той, которую выполняет DevTools, а также предоставляет причины, по которым страница не соответствует требованиям, если аудит не пройден. Дополнительную информацию можно найти в документации аудита bfcache .

Как bfcache влияет на аналитику и измерение производительности

Если вы отслеживаете посещения вашего сайта с помощью аналитического инструмента, вы, вероятно, заметите уменьшение общего количества просмотров страниц, поскольку Chrome продолжает включать bfcache для большего числа пользователей.

Фактически, вы, вероятно, уже занижаете количество просмотров страниц в других браузерах, которые реализуют bfcache, поскольку большинство популярных аналитических библиотек не отслеживают восстановление bfcache как новые просмотры страниц.

Если вы не хотите, чтобы количество просмотров страниц уменьшалось из-за того, что Chrome включил bfcache, вы можете сообщить о восстановлении bfcache как о просмотрах страниц (рекомендуется), прослушав событие pageshow и проверив persisted свойство.

В следующем примере показано, как это сделать с помощью Google Analytics; логика должна быть аналогичной для других инструментов аналитики:

// Send a pageview when the page is first loaded.
gtag('event', 'page_view');

window.addEventListener('pageshow', (event) => {
  // Send another pageview if the page is restored from bfcache.
  if (event.persisted) {
    gtag('event', 'page_view');
  }
});

Измерение коэффициента попадания в bfcache

Вы также можете отслеживать, использовался ли bfcache, чтобы определить страницы, которые не используют bfcache. Это можно сделать, измерив тип навигации при загрузке страниц:

// Send a navigation_type when the page is first loaded.
gtag('event', 'page_view', {
   'navigation_type': performance.getEntriesByType('navigation')[0].type;
});

window.addEventListener('pageshow', (event) => {
  if (event.persisted) {
    // Send another pageview if the page is restored from bfcache.
    gtag('event', 'page_view', {
      'navigation_type': 'back_forward_cache';
    });
  }
});

Посмотрев на соотношение навигации back_forward к back_forward_cache , можно рассчитать соотношение bfcache.

Важно понимать, что существует ряд сценариев, находящихся вне контроля владельцев сайта, когда навигация «Назад/Вперед» не будет использовать bfcache, в том числе:

  • когда пользователь выходит из браузера и запускает его снова
  • когда пользователь дублирует вкладку
  • когда пользователь закрывает вкладку и открывает ее

В некоторых из этих случаев исходный тип навигации может сохраняться некоторыми браузерами и поэтому может отображать тип back_forward , несмотря на то, что это не навигация «Назад/Вперед».

Даже без этих исключений bfcache будет удален через некоторое время для экономии памяти.

Таким образом, владельцам веб-сайтов не следует ожидать 100%-ного коэффициента попадания в bfcache для всех переходов back_forward . Однако измерение их соотношения может быть полезно для выявления страниц, на которых сама страница препятствует использованию bfcache для значительной части переходов вперед и назад.

Команда Chrome работает над API NotRestoredReasons , чтобы выявить причины, по которым bfcache не использовался, чтобы помочь разработчикам понять причину, по которой кеш не использовался, и могут ли они работать над улучшением своих сайтов.

Измерение производительности

bfcache также может отрицательно влиять на показатели производительности, собираемые в поле , в частности на показатели, измеряющие время загрузки страницы.

Поскольку навигация по bfcache восстанавливает существующую страницу, а не инициирует загрузку новой страницы, общее количество собранных загрузок страниц уменьшится при включении bfcache. Однако важно то, что загрузка страниц, замененная восстановлением bfcache, вероятно, была бы одной из самых быстрых загрузок страниц в вашем наборе данных. Это связано с тем, что навигация вперед и назад по определению представляет собой повторные посещения, а повторная загрузка страниц обычно происходит быстрее, чем загрузка страниц от первых посетителей (из-за HTTP-кэширования , как упоминалось ранее).

В результате в вашем наборе данных будет меньше быстрых загрузок страниц, что, скорее всего, приведет к более медленному искажению распределения — несмотря на то, что производительность, с которой сталкивается пользователь, вероятно, улучшилась!

Есть несколько способов справиться с этой проблемой. Один из них — аннотировать все показатели загрузки страницы с указанием соответствующего типа навигации : navigate , reload , back_forward или prerender . Это позволит вам продолжать отслеживать свою эффективность в этих типах навигации, даже если общее распределение будет отрицательным. Этот подход рекомендуется для показателей загрузки страницы, не ориентированных на пользователя, таких как время до первого байта (TTFB) .

Для показателей, ориентированных на пользователя, таких как Core Web Vitals , лучшим вариантом будет указать значение, которое более точно отражает то, что испытывает пользователь.

Влияние на основные веб-показатели

Core Web Vitals измеряет взаимодействие пользователя с веб-страницей по различным параметрам (скорость загрузки, интерактивность, визуальная стабильность), и поскольку пользователи воспринимают восстановление bfcache как более быструю навигацию, чем традиционная загрузка страниц, важно, чтобы метрики Core Web Vitals отражали это. . В конце концов, пользователю все равно, включен bfcache или нет, ему важно лишь, чтобы навигация была быстрой!

Такие инструменты, как отчет об опыте пользователя Chrome , который собирает и сообщает показатели Core Web Vitals, рассматривают восстановление bfcache как отдельные посещения страниц в своем наборе данных.

И хотя (пока) не существует специализированных API веб-производительности для измерения этих показателей после восстановления bfcache, их значения можно аппроксимировать с помощью существующих веб-API.

  • Для наибольшего отрисовки содержимого (LCP) вы можете использовать разницу между меткой времени события pageshow и меткой времени следующего нарисованного кадра (поскольку все элементы в кадре будут нарисованы одновременно). Обратите внимание, что в случае восстановления bfcache LCP и FCP будут одинаковыми.
  • Для задержки первого ввода (FID) вы можете повторно добавить прослушиватели событий (те же, которые используются полифилом FID ) в событии pageshow и сообщить FID как задержку первого ввода после восстановления bfcache.
  • При накопительном сдвиге макета (CLS) вы можете продолжать использовать существующий Performance Observer; все, что вам нужно сделать, это сбросить текущее значение CLS на 0.

Более подробную информацию о том, как bfcache влияет на каждую метрику, можно найти на страницах руководств по отдельным метрикам Core Web Vitals. А конкретный пример того, как реализовать bfcache версии этих метрик в коде, можно найти в PR о добавлении их в JS-библиотеку web-vitals .

Дополнительные ресурсы