A API Fetch Priority indica a prioridade relativa dos recursos para o navegador. Ela pode permitir o carregamento ideal e melhorar as Core Web Vitals.
Quando um navegador analisa uma página da Web e começa a descobrir e fazer o download de recursos, como imagens, scripts ou CSS, ele atribui a ela uma busca priority
para que seja possível fazer o download na ordem ideal. A prioridade de um recurso geralmente depende do que ele é e onde está no documento. Por exemplo, imagens na janela de visualização podem ter uma prioridade High
, e a prioridade para CSS de bloqueio de renderização carregado antecipadamente usando <link>
s no <head>
pode ser Very High
. Os navegadores são muito bons em atribuir prioridades que funcionam bem, mas podem não ser ideais em todos os casos.
Esta página discute a API Fetch Priority e o atributo HTML fetchpriority
, que permite indicar a prioridade relativa de um recurso (high
ou low
). A prioridade de busca pode ajudar a otimizar as Core Web Vitals.
Resumo
Algumas áreas importantes em que a Fetch Priority pode ajudar:
- Para otimizar a prioridade da imagem da LCP, especifique
fetchpriority="high"
no elemento de imagem, fazendo com que a LCP ocorra mais cedo. - Aumento da prioridade dos scripts
async
, usando uma semântica melhor do que o hack mais comum atual (inserindo um<link rel="preload">
para o scriptasync
). - Diminuição da prioridade dos scripts do corpo tardio para permitir uma melhor sequência com imagens.
Historicamente, os desenvolvedores têm pouca influência sobre a prioridade do recurso usando pré-carregamento e pré-conexão. O pré-carregamento permite que você informe ao navegador sobre os recursos essenciais que você quer carregar antes que o navegador os descubra naturalmente. Isso é especialmente útil para recursos mais difíceis de descobrir, como fontes incluídas em folhas de estilo, imagens de plano de fundo ou recursos carregados de um script. A pré-conexão ajuda a aquecer as conexões com servidores de origem cruzada e pode melhorar métricas como o Tempo até o primeiro byte. Ele é útil quando você conhece uma origem, mas não necessariamente o URL exato do recurso que será necessário.
A prioridade de busca complementa estas Dicas de recursos. É um indicador baseado em marcação, disponível pelo atributo fetchpriority
, que os desenvolvedores podem usar para indicar a prioridade relativa de um recurso específico. Também é possível usar essas dicas com JavaScript e a API Fetch com a propriedade priority
para influenciar a prioridade das buscas de recursos feitas para dados. A prioridade de busca também pode complementar o pré-carregamento. Use uma imagem Largest Contentful Paint, que, quando pré-carregada, ainda terá uma prioridade baixa. Se ela for rejeitada por outros recursos iniciais de baixa prioridade, o uso da prioridade de busca poderá ajudar a determinar a velocidade de carregamento da imagem.
Prioridade do recurso
A sequência de download de recursos depende da prioridade atribuída pelo navegador a cada recurso na página. Os fatores que podem afetar a lógica de computação de prioridade incluem:
- O tipo de recurso, como CSS, fontes, scripts, imagens e recursos de terceiros.
- O local ou ordem em que o documento faz referência aos recursos.
- Se os atributos
async
oudefer
são usados em scripts.
A tabela a seguir mostra como o Chrome prioriza e organiza a maioria dos recursos:
Carregamento na fase de bloqueio do layout | Carregar um por vez na fase de bloqueio de layout | ||||
---|---|---|---|---|---|
Piscar Prioridade |
VeryHigh | Alta | Média | Baixa | VeryLow |
DevTools Prioridade |
Mais alta | Alta | Média | Baixa | Menor |
Recurso principal | |||||
CSS (adiantado**) | CSS (atraso**) | CSS (incompatibilidade de mídia***) | |||
Script (pré-** ou não do scanner de pré-carregamento) | Script (atrasado**) | Script (assíncrono) | |||
Fonte | Fonte (rel=preload) | ||||
Importar | |||||
Imagem (na janela de visualização) | Imagem (primeiras imagens > 10.000px2) | Imagem | |||
Mídia (vídeo/áudio) | |||||
Pré-busca | |||||
XSL | |||||
XHR (sincronização) | XHR/fetch* (assíncrono) |
O navegador faz o download de recursos com a mesma prioridade computada na ordem em que são descobertos. É possível verificar a prioridade atribuída a diferentes recursos ao carregar uma página na guia Rede das Ferramentas para desenvolvedores do Chrome. Inclua a coluna prioridade clicando com o botão direito do mouse nos cabeçalhos da tabela e marcando a caixa de seleção.
Quando as prioridades mudam, elas aparecem na configuração Linhas de solicitação grande ou em uma dica.
Quando a prioridade pode ser necessária?
Agora que você entende a lógica de priorização do navegador, pode ajustar a ordem de download da página para otimizar a performance e as Core Web Vitals. Confira alguns exemplos de coisas que você pode mudar para influenciar a prioridade dos downloads de recursos:
- Coloque tags de recurso, como
<script>
e<link>
, na ordem em que você quer que o navegador faça o download delas. Recursos com a mesma prioridade geralmente são carregados na ordem em que são descobertos. - Use a dica de recurso
preload
para fazer o download dos recursos necessários mais cedo, principalmente para aqueles que não são descobertos com facilidade pelo navegador. - Use
async
oudefer
para fazer o download de scripts sem bloquear outros recursos. - Carregue lentamente o conteúdo abaixo da dobra para que o navegador possa usar a largura de banda disponível para recursos acima da dobra mais importantes.
Essas técnicas ajudam a controlar a computação de prioridade do navegador, melhorando a performance e as Core Web Vitals. Por exemplo, quando uma imagem de plano de fundo crítica é pré-carregada, ela pode ser descoberta muito mais cedo, melhorando a Maior exibição de conteúdo (LCP).
Às vezes, esses identificadores não são suficientes para priorizar os recursos de maneira otimizada para o aplicativo. Confira alguns cenários em que a prioridade de busca pode ser útil:
- Você tem várias imagens acima da dobra, mas nem todas precisam ter a mesma prioridade. Por exemplo, em um carrossel de imagens, apenas a primeira imagem visível precisa de uma prioridade mais alta, e as outras, normalmente fora da tela, inicialmente podem ser definidas para ter uma prioridade mais baixa.
- As imagens dentro da janela de visualização geralmente começam com uma prioridade
Low
. Depois que o layout é concluído, o Chrome descobre que eles estão na janela de visualização e aumenta sua prioridade. Isso geralmente adiciona um atraso significativo ao carregamento das imagens importantes, como as imagens principais. Ao fornecer a prioridade de busca na marcação, a imagem começa com uma prioridadeHigh
e começa a carregar muito antes. Para automatizar um pouco esse processo, as cinco primeiras imagens maiores são definidas como prioridadeMedium
pelo Chrome, o que ajuda, mas umfetchpriority="high"
explícito é ainda melhor.
O pré-carregamento ainda é necessário para a descoberta antecipada de imagens LCP incluídas como planos de fundo CSS. Para aumentar a prioridade das imagens de plano de fundo, incluafetchpriority='high'
no pré-carregamento. - A declaração de scripts como
async
oudefer
instrui o navegador a carregá-los de forma assíncrona. No entanto, conforme mostrado na tabela de prioridades, esses scripts também recebem uma prioridade "Baixa". Talvez você queira aumentar a prioridade e, ao mesmo tempo, garantir o download assíncrono, especialmente para scripts que são críticos para a experiência do usuário. - Se você usar a API JavaScript
fetch()
para buscar recursos ou dados de forma assíncrona, o navegador vai atribuir a prioridadeHigh
a ela. Talvez você queira que algumas das suas buscas sejam executadas com prioridade menor, especialmente se estiver misturando chamadas de API em segundo plano com chamadas de API que respondem à entrada do usuário. Marque as chamadas de API em segundo plano como prioridadeLow
e as chamadas de API interativas como prioridadeHigh
. - O navegador atribui uma prioridade
High
a CSS e fontes, mas alguns desses recursos podem ser mais importantes que outros. É possível usar a prioridade de busca para diminuir a prioridade de recursos não críticos. O CSS inicial bloqueia a renderização, então geralmente precisa ter prioridadeHigh
.
O atributo fetchpriority
Use o atributo HTML fetchpriority
para especificar a prioridade de download de tipos de recursos, como CSS, fontes, scripts e imagens, quando o download for feito usando as tags link
, img
ou script
. Ele pode assumir os seguintes valores:
high
: o recurso tem uma prioridade mais alta, e você quer que o navegador o priorize o normal, desde que a heurística do próprio navegador não impeça que isso aconteça.low
: o recurso tem prioridade mais baixa, e você quer que o navegador o reduza novamente se a heurística permitir.auto
: o valor padrão, que permite que o navegador escolha a prioridade adequada.
Confira alguns exemplos de como usar o atributo fetchpriority
na marcação e a propriedade priority
equivalente ao script.
<!-- We don't want a high priority for this above-the-fold image -->
<img src="/images/in_viewport_but_not_important.svg" fetchpriority="low" alt="I'm an unimportant image!">
<!-- We want to initiate an early fetch for a resource, but also deprioritize it -->
<link rel="preload" href="/js/script.js" as="script" fetchpriority="low">
<script>
fetch('https://example.com/', {priority: 'low'})
.then(data => {
// Trigger a low priority fetch
});
</script>
Efeitos da prioridade do navegador e do fetchpriority
É possível aplicar o atributo fetchpriority
a recursos diferentes, conforme mostrado na tabela a seguir, para aumentar ou reduzir a prioridade calculada. fetchpriority="auto"
(◉) em cada linha marca a prioridade padrão para esse tipo de recurso. (também disponível como um documento do Google).
Carregamento na fase de bloqueio do layout | Carregar um de cada vez na fase de bloqueio de layout | ||||
---|---|---|---|---|---|
Blink Priority |
VeryHigh | Alta | Média | Baixa | VeryLow |
DevTools Prioridade |
Mais alta | Alta | Média | Baixa | Menor |
Principal recurso | ◉ | ||||
CSS (adiantado**) | ⬆◉ | ⬇ | |||
CSS (atrasado**) | ⬆ | ◉ | ⬇ | ||
CSS (incompatibilidade de mídia***) | ⬆*** | ◉⬇ | |||
Script (antecipado** ou não do scanner de pré-carregamento) | ⬆◉ | ⬇ | |||
Script (atrasado**) | ⬆ | ◉ | ⬇ | ||
Script (assíncrono/adiar) | ⬆ | ◉⬇ | |||
Fonte | ◉ | ||||
Fonte (rel=preload) | ⬆◉ | ⬇ | |||
Importar | ◉ | ||||
Imagem (na janela de visualização, depois do layout) | ⬆◉ | ⬇ | |||
Imagem (primeiras 5 imagens com mais de 10.000 px2) | ⬆ | ◉ | ⬇ | ||
Imagem | ⬆ | ◉⬇ | |||
Mídia (vídeo/áudio) | ◉ | ||||
XHR (sincronização): descontinuado | ◉ | ||||
XHR/busca* (assíncrono) | ⬆◉ | ⬇ | |||
Pré-busca | ◉ | ||||
XSL | ◉ |
fetchpriority
define a prioridade relativa, o que significa que aumenta ou diminui a prioridade padrão por um valor adequado, em vez de definir explicitamente a prioridade como High
ou Low
. Isso geralmente resulta na prioridade High
ou Low
, mas nem sempre. Por exemplo, o CSS crítico com fetchpriority="high"
mantém a prioridade "Muito alta"/"Alta", e o uso de fetchpriority="low"
nesses elementos mantém a prioridade "Alta". Nenhum desses casos envolve definir explicitamente a prioridade como High
ou Low
.
Casos de uso
Use o atributo fetchpriority
quando quiser dar ao navegador uma dica extra sobre a prioridade a ser usada na busca de um recurso.
Aumentar a prioridade da imagem LCP
É possível especificar fetchpriority="high"
para aumentar a prioridade do LCP ou de outras imagens importantes.
<img src="lcp-image.jpg" fetchpriority="high">
A comparação a seguir mostra a página do Google Voos com uma imagem de plano de fundo de LCP carregada com e sem a prioridade de busca. Com a prioridade definida como alta, o LCP melhorou de 2,6 para 1,9 segundos.
Diminuir a prioridade das imagens acima da dobra
Use fetchpriority="low"
para diminuir a prioridade de imagens acima da dobra que não são imediatamente importantes, por exemplo, imagens fora da tela em um carrossel de imagens.
<ul class="carousel">
<img src="img/carousel-1.jpg" fetchpriority="high">
<img src="img/carousel-2.jpg" fetchpriority="low">
<img src="img/carousel-3.jpg" fetchpriority="low">
<img src="img/carousel-4.jpg" fetchpriority="low">
</ul>
Embora as imagens 2 a 4 estejam fora da viewport, elas podem ser consideradas "perto o suficiente" para serem impulsionadas para high
e carregadas, mesmo que um atributo load=lazy
seja adicionado. Portanto, fetchpriority="low"
é a solução correta para isso.
Em um experimento anterior com o app Oodle, usamos esse recurso para diminuir a prioridade das imagens que não aparecem no carregamento. Diminuiu o tempo de carregamento da página em dois segundos.
Diminuir a prioridade dos recursos pré-carregados
Para evitar que os recursos carregados anteriormente entrem em conflito com outros recursos críticos, reduza a prioridade deles. Use essa técnica com imagens, scripts e CSS.
<!-- Lower priority only for non-critical preloaded scripts -->
<link rel="preload" as="script" href="critical-script.js">
<link rel="preload" as="script" href="non-critical-script.js" fetchpriority="low">
<!-- Preload CSS without blocking render, or other resources -->
<link rel="preload" as="style" href="theme.css" fetchpriority="low" onload="this.rel='stylesheet'">
Repriorizar scripts
Os scripts de que sua página precisa ser interativa devem carregar rapidamente, mas não devem bloquear outros recursos mais importantes que bloqueiam a renderização. Você pode marcá-los como async
com alta prioridade.
<script src="async_but_important.js" async fetchpriority="high"></script>
Não é possível marcar um script como async
se ele depender de estados DOM específicos. No entanto, se eles forem executados mais tarde na página, você poderá carregá-los com prioridade mais baixa:
<script src="blocking_but_unimportant.js" fetchpriority="low"></script>
Isso ainda vai bloquear o analisador quando ele chegar ao script, mas vai permitir que o conteúdo anterior seja priorizado.
Uma alternativa, se o DOM completo for necessário, é usar o atributo defer
, que é executado em ordem após DOMContentLoaded, ou até mesmo async
na parte de baixo da página.
Diminuir a prioridade de buscas de dados não críticos
O navegador executa fetch
com alta prioridade. Se você tiver várias transferências que podem ser acionadas simultaneamente, use a prioridade alta padrão para as transferências de dados mais importantes e reduza a prioridade dos dados menos importantes.
// Important validation data (high by default)
let authenticate = await fetch('/user');
// Less important content data (suggested low)
let suggestedContent = await fetch('/content/suggested', {priority: 'low'});
Buscar notas de implementação de prioridade
A prioridade de busca pode melhorar a performance em casos de uso específicos, mas há algumas coisas que você precisa saber ao usar essa prioridade:
- O atributo
fetchpriority
é uma dica, não uma diretiva. O navegador tenta respeitar a preferência do desenvolvedor, mas também pode aplicar as preferências de prioridade do recurso para resolver conflitos. Não confunda a prioridade de busca com o pré-carregamento:
- O pré-carregamento é uma busca obrigatória, não uma dica.
- O pré-carregamento permite que o navegador descubra um recurso mais cedo, mas ainda busca o recurso com a prioridade padrão. Por outro lado, a prioridade de busca não ajuda na descoberta, mas permite que você aumente ou diminua a prioridade da busca.
- Muitas vezes, é mais fácil observar e medir os efeitos de um pré-carregamento do que os efeitos de uma alteração de prioridade.
A prioridade de busca pode complementar os carregamentos prévios aumentando a granularidade da priorização. Se você já especificou um pré-carregamento como um dos primeiros itens no
<head>
para uma imagem da LCP, a prioridade de busca dahigh
pode não melhorar significativamente a LCP. No entanto, se o pré-carregamento acontecer após o carregamento de outros recursos, uma prioridade de buscahigh
pode melhorar ainda mais o LCP. Se uma imagem crítica for uma imagem de plano de fundo CSS, pré-carregue-a comfetchpriority = "high"
.As melhorias no tempo de carregamento decorrentes da priorização são mais relevantes em ambientes em que mais recursos competem pela largura de banda da rede disponível. Isso é comum para conexões HTTP/1.x em que os downloads paralelos não são possíveis ou em conexões HTTP/2 ou HTTP/3 de baixa largura de banda. Nesses casos, a priorização pode ajudar a resolver os gargalos.
As CDNs não implementam a priorização do HTTP/2 de forma uniforme, assim como para o HTTP/3. Mesmo que o navegador comunique a prioridade de Fetch Priority, o CDN pode não priorizar os recursos na ordem especificada. Isso dificulta o teste de prioridade de busca. As prioridades são aplicadas internamente no navegador e com protocolos compatíveis com priorização (HTTP/2 e HTTP/3). Ainda vale a pena usar a prioridade de busca apenas para a priorização interna do navegador, independente do suporte ao CDN ou à origem, porque as prioridades geralmente mudam quando o navegador solicita recursos. Por exemplo, recursos de baixa prioridade, como imagens, geralmente não são solicitados enquanto o navegador processa itens
<head>
críticos.Talvez não seja possível introduzir a prioridade de busca como uma prática recomendada no seu design inicial. Mais adiante no ciclo de desenvolvimento, você pode verificar as prioridades atribuídas a diferentes recursos na página. Se elas não corresponderem às suas expectativas, é possível usar a prioridade de busca para otimizar ainda mais.
Os desenvolvedores precisam usar o pré-carregamento para a finalidade de pré-carregar recursos não detectados pelo analisador (fontes, importações, imagens de LCP em segundo plano). A posição da dica preload
vai afetar o momento em que o recurso é pré-carregado.
A prioridade de busca é sobre como o recurso precisa ser buscado.
Dicas para usar os carregamentos antecipados
Informações importantes ao usar pré-carregamentos:
- A inclusão de um pré-carregamento nos cabeçalhos HTTP coloca esse recurso antes de tudo o que está na ordem de carregamento.
- Geralmente, os pré-carregamentos são carregados na ordem em que o analisador os chega para qualquer coisa com prioridade
Medium
ou superior. Tenha cuidado caso inclua pré-carregamentos no início do HTML. - O pré-carregamento de fontes provavelmente funciona melhor no final da cabeça ou no início do corpo.
- Os carregamentos de importação (
import()
dinâmico oumodulepreload
) precisam ser executados depois da tag de script que precisa da importação. Portanto, verifique se o script é carregado ou analisado primeiro para que possa ser avaliado enquanto as dependências são carregadas. - O carregamento prévio de imagens tem prioridade
Low
ouMedium
por padrão. Ordene-as em relação a scripts assíncronos e outras tags de prioridade baixa ou mais baixa.
Histórico
Esse recurso foi testado pela primeira vez no Chrome como um teste de origem em 2018 e novamente em 2021 usando o atributo importance
. Na época, o recurso era chamado de Priority Hints. Desde então, a interface mudou para fetchpriority
no HTML e priority
na API Fetch do JavaScript como parte do processo de padrões da Web. Para reduzir a confusão, agora chamamos essa prioridade de busca de API.
Conclusão
Os desenvolvedores provavelmente vão se interessar pela prioridade de busca com as correções no comportamento de pré-carregamento e o foco recente nas Core Web Vitals e na LCP. Agora, eles têm mais controles disponíveis para alcançar a sequência de carregamento preferida.