Cache de avanço e retorno

O cache de avanço e retorno (ou bfcache) é uma otimização de navegador que permite a navegação instantânea para frente e para trás. Isso melhora significativamente a experiência de navegação, especialmente para usuários com redes ou dispositivos mais lentos.

Como desenvolvedores da Web, é fundamental saber como otimizar suas páginas para o uso do bfcache e aproveitar os benefícios dos usuários.

Compatibilidade com navegadores

O bfcache é compatível com o Firefox e o Safari há muitos anos em computadores e dispositivos móveis.

A partir da versão 86, uma pequena porcentagem dos usuários do Chrome ativou o bfcache para navegação entre sites no Android. Nas versões subsequentes, o suporte adicional será lançado lentamente. Desde a versão 96, o bfcache está ativado para todos os usuários do Chrome em computadores e dispositivos móveis.

Noções básicas do bfcache

O bfcache é um cache na memória que armazena um snapshot completo de uma página (incluindo a heap JavaScript) à medida que o usuário sai da página. Com a página inteira na memória, o navegador pode restaurá-la rapidamente caso o usuário decida retornar.

Quantas vezes você visitou um site e clicou em um link para ir para outra página, mas percebeu que não era o que queria e clicou no botão "Voltar"? Nesse momento, o bfcache pode fazer uma grande diferença na velocidade de carregamento da página anterior:

Sem o bfcache ativado Uma nova solicitação é iniciada para carregar a página anterior e, dependendo da otimização da página para visitas repetidas, o navegador pode precisar fazer o download, analisar e executar novamente alguns (ou todos) os recursos que acabou de transferir por download.
Com o bfcache ativado O carregamento da página anterior é essencialmente instantâneo, porque é possível restaurar toda a página da memória sem precisar acessar a rede.

Veja este vídeo do bfcache em ação para entender a velocidade que ele pode proporcionar às navegações:

O uso do bfcache deixa as páginas carregarem muito mais rapidamente durante a navegação de retorno e avanço.

No vídeo, o exemplo com bfcache é um pouco mais rápido do que o exemplo sem ele.

Além de acelerar a navegação, o bfcache também reduz o uso de dados, já que o download dos recursos não precisa ser feito novamente.

Os dados de uso do Chrome mostram que 1 em 10 navegações no computador e 1 em cada 5 em dispositivos móveis são de ida ou volta. Com o bfcache ativado, os navegadores podem eliminar a transferência de dados e o tempo gasto no carregamento de bilhões de páginas da Web todos os dias.

Como funciona o "cache"

O "cache" usado pelo bfcache é diferente do cache HTTP, que desempenha um papel próprio na aceleração de navegações repetidas. O bfcache é um resumo de toda a página na memória, incluindo a heap JavaScript, enquanto o cache HTTP contém somente as respostas de solicitações feitas anteriormente. Como é raro que todas as solicitações necessárias para carregar uma página sejam atendidas do cache HTTP, visitas repetidas usando restaurações bfcache são sempre mais rápidas do que até mesmo as navegações sem bfcache mais bem otimizadas.

No entanto, criar um instantâneo de uma página na memória envolve certa complexidade para determinar a melhor forma de preservar o código em andamento. Por exemplo, como você lida com chamadas setTimeout() em que o tempo limite é atingido enquanto a página está no bfcache?

A resposta é que os navegadores pausam todos os timers pendentes ou promessas não resolvidas para páginas em bfcache, incluindo quase todas as tarefas pendentes nas filas de tarefas JavaScript, e retomam as tarefas de processamento se a página for restaurada do bfcache.

Em alguns casos, como no caso de tempos limite e promessas, isso é um risco razoavelmente baixo, mas em outros casos pode levar a um comportamento confuso ou inesperado. Por exemplo, se o navegador pausar uma tarefa necessária como parte de uma transação do IndexedDB, isso poderá afetar outras guias abertas na mesma origem, porque os mesmos bancos de dados IndexedDB podem ser acessados por várias guias simultaneamente. Como resultado, os navegadores geralmente não tentam armazenar páginas em cache no meio de uma transação do IndexedDB ou ao usar APIs que possam afetar outras páginas.

Para ver mais detalhes sobre como o uso da API afeta a qualificação para o bfcache de uma página, consulte Otimizar suas páginas para o bfcache.

O bfcache e os iframes

Se uma página tiver iframes incorporados, eles não estarão qualificados para o bfcache. Por exemplo, se você navegar para outra página dentro de um iframe, mas depois voltar, o navegador voltará ao iframe e não ao frame principal, mas a navegação de retorno dentro do iframe não usará o bfcache.

Também é possível impedir que o frame principal use o bfcache se um iframe incorporado usar APIs que o impeçam. Para evitar isso, use a política de permissões definida no frame principal ou os atributos sandbox.

O bfcache e os apps de página única (SPA)

Como o bfcache funciona com navegações gerenciadas pelo navegador, ele não funciona para "navegações suaves" em um app de página única (SPA). No entanto, o bfcache ainda pode ajudar ao voltar para um SPA, em vez de fazer uma reinicialização completa desse app novamente desde o início.

APIs para observar o bfcache

Embora o bfcache seja uma otimização automática feita pelos navegadores, ainda é importante que os desenvolvedores saibam quando isso está acontecendo para que possam otimizar as páginas e ajustar métricas ou medições de desempenho adequadamente.

Os principais eventos usados para observar o bfcache são os eventos de transição de página pageshow e pagehide, que têm suporte da maioria dos navegadores.

Os eventos mais recentes do ciclo de vida da página (freeze e resume) também são enviados quando as páginas entram ou saem do bfcache e em algumas outras situações, por exemplo, quando uma guia em segundo plano é congelada para minimizar o uso da CPU. Esses eventos só são compatíveis com navegadores baseados no Chromium.

Observar quando uma página é restaurada do bfcache

O evento pageshow é disparado logo após o load quando a página é carregada pela primeira vez e sempre que ela é restaurada do bfcache. O evento pageshow tem uma propriedade persisted, que será true se a página tiver sido restaurada do bfcache. Caso contrário, será false. É possível usar a propriedade persisted para diferenciar os carregamentos de página regulares das restaurações do bfcache. Exemplo:

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

Em navegadores compatíveis com a API Page Lifecycle, o evento resume é acionado quando as páginas são restauradas do bfcache (imediatamente antes do evento pageshow) e quando um usuário acessa novamente uma guia em segundo plano congelada. Se você quiser atualizar o estado de uma página depois que ela for congelada (o que inclui páginas no bfcache), use o evento resume. No entanto, se quiser medir a taxa de ocorrências do bfcache do site, use o evento pageshow. Em alguns casos, talvez seja necessário usar ambos.

Para detalhes sobre as práticas recomendadas de medição do bfcache, consulte Como o bfcache afeta a análise e a medição de performance.

Observar quando uma página está entrando no bfcache

O evento pagehide é disparado quando uma página é descarregada ou o navegador tenta colocá-la no bfcache.

O evento pagehide também tem uma propriedade persisted. Se for false, pode ter certeza de que a página não vai entrar no bfcache. No entanto, o fato de persisted ser true não garante que a página será armazenada em cache. Isso significa que o navegador intends armazenar a página em cache, mas pode haver outros fatores que impossibilitam o armazenamento em cache.

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.');
  }
});

Da mesma forma, o evento freeze é disparado imediatamente após o evento pagehide se persisted for true, mas isso significa apenas que o navegador intends armazenar a página em cache. Talvez seja necessário descartá-lo por vários motivos explicados posteriormente.

Otimizar suas páginas para o bfcache

Nem todas as páginas são armazenadas no bfcache, e mesmo quando uma página é armazenada lá, ela não fica lá indefinidamente. É fundamental que os desenvolvedores entendam o que torna as páginas qualificadas (e não qualificadas) para o bfcache a fim de maximizar as taxas de ocorrência em cache.

As seções a seguir descrevem as práticas recomendadas para aumentar a probabilidade de o navegador poder armazenar suas páginas em cache.

Nunca usar o evento unload

A maneira mais importante de otimizar para o bfcache em todos os navegadores é nunca usar o evento unload. Sempre!

O evento unload é problemático para navegadores porque antecede o bfcache e muitas páginas na Internet operam com o pressuposto (razoável) de que uma página não vai continuar a existir depois que o evento unload for disparado. Isso é um desafio, porque muitas dessas páginas também foram criadas com o pressuposto de que o evento unload seria disparado sempre que um usuário estivesse navegando, o que não é mais verdade (e não é verdade há muito tempo).

Os navegadores enfrentam um dilema: eles precisam escolher entre algo que possa melhorar a experiência do usuário, mas que também arrisca a quebra da página.

No computador, o Chrome e o Firefox optaram por tornar as páginas desqualificadas para o bfcache se adicionarem um listener unload, o que é menos arriscado, mas também desqualifica muitas páginas. O Safari vai tentar armazenar algumas páginas em cache com um listener de eventos unload. No entanto, para reduzir possíveis falhas, ele não vai executar o evento unload quando o usuário sair da página, o que torna o evento não confiável.

Em dispositivos móveis, o Chrome e o Safari vão tentar armazenar páginas em cache com um listener de eventos unload, já que o risco de falha é menor porque o evento unload sempre foi extremamente não confiável nesses dispositivos. O Firefox trata as páginas que usam unload como não qualificadas para o bfcache, exceto no iOS, que exige que todos os navegadores usem o mecanismo de renderização WebKit. Assim, ele se comporta como o Safari.

Em vez de usar o evento unload, use o evento pagehide. O evento pagehide é disparado em todos os casos em que o evento unload é disparado e também é acionado quando uma página é colocada no bfcache.

Na verdade, o Lighthouse tem uma auditoria no-unload-listeners que avisa os desenvolvedores se algum JavaScript nas páginas deles (incluindo o de bibliotecas de terceiros) adicionar um listener de eventos unload.

Devido à falta de confiabilidade e ao impacto no desempenho do bfcache, o Chrome está tentando descontinuar o evento unload.

Usar a política de permissão para evitar que gerenciadores de descarregamento sejam usados em uma página

Os sites que não usam manipuladores de eventos unload podem garantir que eles não sejam adicionados usando uma política de permissões do Chrome 115.

Permission-Policy: unload()

Isso também evita que terceiros ou extensões deixem o site lento adicionando gerenciadores de descarregamento e impedindo o uso do bfcache.

Adicione apenas listeners beforeunload condicionalmente

O evento beforeunload não torna suas páginas desqualificadas para o bfcache em navegadores modernos (bfcache), mas isso ainda não é confiável. Portanto, evite usá-lo, a menos que seja absolutamente necessário.

No entanto, ao contrário do evento unload, há usos legítimos para beforeunload. Por exemplo, quando você quiser avisar ao usuário que ele tem alterações não salvas, ele vai perder se sair da página. Nesse caso, recomendamos que você só adicione listeners beforeunload quando um usuário tiver mudanças não salvas e os remova imediatamente depois que as mudanças não forem salvas.

O que não fazer
window.addEventListener('beforeunload', (event) => {
  if (pageHasUnsavedChanges()) {
    event.preventDefault();
    return event.returnValue = 'Are you sure you want to exit?';
  }
});
Esse código adiciona um listener beforeunload incondicionalmente.
O que fazer
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);
});
Esse código só adiciona o listener beforeunload quando necessário (e o remove quando não é).

Minimizar o uso de Cache-Control: no-store

Cache-Control: no-store é um servidor da Web de cabeçalho HTTP que pode ser definido em respostas que instrui o navegador a não armazenar a resposta em nenhum cache HTTP. Ele é usado em recursos que contêm informações sensíveis do usuário, como páginas protegidas por login.

Embora o bfcache não seja um cache HTTP, historicamente, quando Cache-Control: no-store é definido no próprio recurso da página (ao contrário de qualquer sub-recurso), os navegadores optam por não armazenar a página no bfcache. Há trabalhos em andamento para mudar esse comportamento do Chrome a fim de preservar a privacidade, mas no momento as páginas que usam Cache-Control: no-store não estão qualificadas para o bfcache.

Como o Cache-Control: no-store restringe a qualificação de uma página para o bfcache, ele só precisa ser definido em páginas que contêm informações sensíveis, em que o armazenamento em cache nunca é apropriado.

Para páginas que precisam sempre veicular conteúdo atualizado e que não apresentam informações confidenciais, use Cache-Control: no-cache ou Cache-Control: max-age=0. Essas diretivas instruem o navegador a revalidar o conteúdo antes da veiculação. Além disso, elas não afetam a qualificação do bfcache de uma página.

Quando uma página é restaurada do bfcache, ela é restaurada na memória, não no cache de HTTP. Como resultado, diretivas como Cache-Control: no-cache ou Cache-Control: max-age=0 não são consideradas, e não ocorre revalidação antes que o conteúdo seja exibido ao usuário.

Essa ainda é, provavelmente, uma melhor experiência do usuário, já que as restaurações do bfcache são instantâneas e, como as páginas não permanecem no bfcache por muito tempo, é improvável que o conteúdo esteja desatualizado. No entanto, se o conteúdo mudar minuto a minuto, você poderá buscar as atualizações usando o evento pageshow, conforme descrito na próxima seção.

Atualizar dados desatualizados ou confidenciais após a restauração do bfcache

Se o site mantiver o estado do usuário, especialmente informações confidenciais dele, esses dados precisarão ser atualizados ou apagados depois que uma página for restaurada do bfcache.

Por exemplo, se um usuário acessar uma página de finalização da compra e depois atualizar o carrinho, a navegação de retorno poderá expor informações desatualizadas se uma página desatualizada for restaurada do bfcache.

Outro exemplo mais importante é se um usuário sai de um site em um computador público e o próximo usuário clica no botão "Voltar". Isso pode expor dados particulares que o usuário supõe que foram apagados ao sair.

Para evitar situações como essa, é bom sempre atualizar a página após um evento pageshow se event.persisted for true:

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

Embora o ideal seja atualizar o conteúdo no local, para algumas alterações é possível forçar uma atualização completa. O código a seguir verifica se há um cookie específico do site no evento pageshow e atualiza se o cookie não for encontrado:

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

A vantagem de uma atualização é preservar o histórico (para permitir navegações futuras), mas um redirecionamento pode ser mais apropriado em alguns casos.

Restauração de anúncios e bfcache

Pode ser tentador tentar evitar o uso do bfcache para exibir um novo conjunto de anúncios em cada navegação de avanço e retorno. No entanto, além de ter um impacto na performance, é questionável se esse comportamento gera um melhor engajamento com o anúncio. Os usuários podem ter notado um anúncio que pretendiam retornar ao clicar, mas ao recarregar, em vez de restaurar do bfcache, eles não conseguiram. Testar esse cenário (de preferência com um teste A/B) é importante antes de fazer suposições.

Para sites que querem atualizar os anúncios na restauração do bfcache, atualizar apenas os anúncios no evento pageshow quando event.persisted for true permite que isso aconteça sem afetar a performance da página. Consulte seu provedor de anúncios, mas confira um exemplo de como fazer isso com a Tag do Google Publishing.

Evitar referências window.opener

Em navegadores mais antigos, se uma página for aberta usando window.open() em um link com target=_blank, sem especificar rel="noopener", a página de abertura terá uma referência ao objeto da janela da página aberta.

Além de ser um risco de segurança, uma página com uma referência não nula window.opener não pode ser colocada com segurança em bfcache, porque isso pode interromper qualquer página que tente acessá-la.

Por isso, é recomendável evitar a criação de referências window.opener. É possível fazer isso usando rel="noopener" sempre que possível. Observação: agora esse é o padrão em todos os navegadores mais recentes. Caso seu site exija a abertura de uma janela e o controle dela com window.postMessage() ou referência direta ao objeto da janela, nem a janela aberta nem o que abre essa janela estarão qualificados para o bfcache.

Feche as conexões abertas antes que o usuário saia da página

Como mencionado anteriormente, quando uma página é colocada no bfcache, ela pausa todas as tarefas programadas do JavaScript e as retoma quando a página é retirada do cache.

Se essas tarefas programadas do JavaScript só acessarem APIs do DOM (ou outras APIs isoladas apenas à página atual), pausar essas tarefas enquanto a página não estiver visível para o usuário não causará problemas.

No entanto, se essas tarefas estiverem conectadas a APIs que também podem ser acessadas por outras páginas na mesma origem (por exemplo: IndexedDB, Web Locks, WebSockets), isso poderá ser um problema, porque pausar essas tarefas pode impedir que o código em outras guias seja executado.

Como resultado, alguns navegadores não tentam colocar uma página em bfcache nos seguintes cenários:

Caso sua página use uma dessas APIs, é recomendável fechar as conexões e remover ou desconectar os observadores durante o evento pagehide ou freeze. Isso permite que o navegador armazene a página em cache com segurança sem o risco de afetar outras guias abertas.

Em seguida, se a página for restaurada do bfcache, será possível reabrir ou reconectar essas APIs durante o evento pageshow ou resume.

O exemplo a seguir mostra como garantir que as páginas que usam o IndexedDB sejam qualificadas para o bfcache fechando uma conexão aberta no listener de eventos pagehide:

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

// Close the connection to the database when the user leaves.
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());

Testar para garantir que suas páginas podem ser armazenadas em cache

O Chrome DevTools pode ajudar você a testar suas páginas para garantir que elas estejam otimizadas para o uso do bfcache e identificar problemas que possam impedir a qualificação delas.

Para testar uma página:

  1. Acesse a página no Chrome.
  2. No DevTools, acesse Aplicativo -> Cache de avanço e retorno.
  3. Clique no botão Run Test. Em seguida, o DevTools tenta sair e voltar para determinar se a página pode ser restaurada do bfcache.
Painel de cache de avanço e retorno no DevTools
Painel Cache de avanço e retorno no DevTools.

Se o teste for bem-sucedido, o painel vai exibir a mensagem "Restaurado do cache de avanço e retorno".

O DevTools informando que uma página foi restaurada do bfcache
Uma página restaurada.

Se ela não for bem-sucedida, o painel vai indicar o motivo. Se o motivo for algo que você possa abordar como desenvolvedor, o painel o marcará como Acionável.

Falha na geração de relatórios do DevTools para restaurar uma página do bfcache
Um teste bfcache com falha com um resultado útil.

Neste exemplo, o uso de um listener de eventos unload torna a página não qualificada para o bfcache. Para corrigir isso, troque de unload para pagehide:

O que fazer
window.addEventListener('pagehide', ...);
O que não fazer
window.addEventListener('unload', ...);

O Lighthouse 10.0 também adicionou uma auditoria bfcache, que realiza um teste semelhante. Para mais informações, consulte os documentos de auditoria do bfcache.

Como o bfcache afeta a medição de análise e desempenho

Se você usa uma ferramenta de análise para medir as visitas ao site, talvez perceba uma diminuição no número total de visualizações de página informadas, já que o Chrome ativa o bfcache para mais usuários.

Na verdade, é provável que você já esteja subtraindo as visualizações de página de outros navegadores que implementam o bfcache, porque muitas bibliotecas de análise conhecidas não medem as restaurações do bfcache como novas visualizações de página.

Para incluir restaurações do bfcache na contagem de visualizações de página, defina listeners para o evento pageshow e verifique a propriedade persisted.

O exemplo a seguir mostra como fazer isso com o Google Analytics. Outras ferramentas de análise provavelmente usam uma lógica semelhante:

// 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');
  }
});

Meça a proporção de ocorrências do bfcache

Avalie também se o bfcache foi usado para ajudar a identificar páginas que não estão utilizando o bfcache. Isso pode ser feito medindo o tipo de navegação para carregamentos de página:

// 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';
    });
  }
});

Calcule a proporção de ocorrência do bfcache usando as contagens de navegações back_forward e back_forward_cache.

É importante observar que há vários cenários, fora do controle dos proprietários do site, em que a navegação de retorno/avançar não usa o bfcache, incluindo:

  • quando o usuário fecha o navegador e o inicia novamente.
  • quando o usuário duplica uma guia.
  • quando o usuário fecha e reabre uma guia.

Em alguns casos, o tipo de navegação original pode ser preservado por alguns navegadores e, portanto, pode mostrar um tipo back_forward, apesar de não serem navegações de avanço e retorno.

Mesmo sem essas exclusões, o bfcache será descartado após um período para economizar memória.

Portanto, os proprietários de sites não podem esperar uma proporção de hits de bfcache de 100% para todas as navegações de back_forward. No entanto, medir essa proporção pode ser útil para identificar as páginas em que a própria página está impedindo o uso do bfcache em uma alta proporção de navegações de avanço e retorno.

A equipe do Chrome adicionou a API NotRestoredReasons para ajudar a expor os motivos pelos quais as páginas não usam o bfcache, para que os desenvolvedores possam melhorar as taxas de hit do bfcache. A equipe do Chrome também adicionou os tipos de navegação ao CrUX, o que tornou possível ver o número de navegações bfcache mesmo sem medi-lo por conta própria.

Medição da performance

O bfcache também pode afetar negativamente as métricas de desempenho coletadas no campo, especificamente aquelas que medem os tempos de carregamento da página.

Como as navegações bfcache restauram uma página atual em vez de iniciar um novo carregamento, o número total de carregamentos de página coletados vai diminuir quando o bfcache estiver ativado. No entanto, o importante é que os carregamentos de página que estão sendo substituídos pelas restaurações do bfcache provavelmente foram alguns dos carregamentos de página mais rápidos do seu conjunto de dados. Isso ocorre porque as navegações de avanço e retorno, por definição, são visitas repetidas, e os carregamentos de página repetidos geralmente são mais rápidos do que os carregamentos de página de visitantes novos (devido ao armazenamento em cache HTTP, como mencionado anteriormente).

O resultado é menos carregamentos de página rápidos no seu conjunto de dados, o que provavelmente distorce a distribuição mais lentamente, apesar de o desempenho ter melhorado.

Há algumas maneiras de lidar com esse problema. Uma delas é anotar todas as métricas de carregamento de página com o respectivo tipo de navegação: navigate, reload, back_forward ou prerender. Isso permite que você continue monitorando seu desempenho nesses tipos de navegação, mesmo que a distribuição geral seja negativa. Recomendamos essa abordagem para métricas de carregamento de página não centradas no usuário, como Tempo até o primeiro byte (TTFB, na sigla em inglês).

Para métricas centradas no usuário, como as Core Web Vitals, é melhor informar um valor que represente com mais precisão a experiência do usuário.

Impacto nas Core Web Vitals

As Core Web Vitals medem a experiência do usuário em uma página em várias dimensões (velocidade de carregamento, interatividade, estabilidade visual). Como as restaurações do bfcache são mais rápidas do que o carregamento de página completa, é importante que as métricas das Core Web Vitals reflitam isso. Afinal, o usuário não se importa se o bfcache está ativado ou não, ele só se importa que a navegação foi rápida.

As ferramentas que coletam e informam sobre as Core Web Vitals, como o Chrome User Experience Report, tratam as restaurações do bfcache como visitas separadas à página no conjunto de dados. Embora não existam APIs de desempenho da Web dedicadas para medir essas métricas após restaurações do bfcache, é possível aproximar os valores usando as APIs da Web atuais:

  • Para a Maior exibição de conteúdo (LCP), use o delta entre o carimbo de data/hora do evento pageshow e o do próximo frame pintado, porque todos os elementos nesse frame serão mostrados ao mesmo tempo. No caso de uma restauração bfcache, LCP e FCP são as mesmas.
  • Para Interaction to Next Paint (INP), continue usando o Observador de desempenho atual, mas redefina o valor de INP atual para 0.
  • Para a Mudança de layout cumulativa (CLS), continue usando o Performance Observer atual, mas redefina o valor atual do CLS para 0.

Para saber mais sobre como o bfcache afeta cada métrica, consulte as páginas de guias de métricas das Core Web Vitals. Para ver um exemplo específico de como implementar versões bfcache dessas métricas, consulte PR que as adiciona à biblioteca JS da web-vitals.

A biblioteca JavaScript web-vitals é compatível com restaurações de bfcache nas métricas informadas.

Outros recursos