Back

Usando Priority Hints com fetchpriority para Performance

Usando Priority Hints com fetchpriority para Performance

A API Fetch Priority oferece controle direto sobre como os navegadores priorizam o carregamento de recursos através do atributo fetchpriority. Este atributo HTML ajuda a otimizar as Core Web Vitals garantindo que recursos críticos sejam carregados primeiro, enquanto assets menos importantes aguardam sua vez.

Principais Pontos

  • O atributo fetchpriority substitui as prioridades padrão de recursos do navegador com valores high, low ou auto
  • Imagens LCP se beneficiam mais das dicas de prioridade, mostrando melhorias de 0,5-2 segundos em testes do mundo real
  • As dicas de prioridade complementam preload e preconnect, mas servem propósitos diferentes no pipeline de carregamento
  • O suporte dos navegadores abrange Chrome 102+, Safari 17.2+ e Firefox 132+ com degradação elegante

Entendendo o Impacto de Performance do Atributo fetchpriority

Os navegadores atribuem automaticamente prioridades aos recursos baseadas no tipo e localização. CSS no <head> recebe a mais alta prioridade, enquanto imagens começam com prioridade baixa. O atributo fetchpriority permite que você substitua esses padrões com três valores:

  • high: Aumenta a prioridade do recurso acima do padrão
  • low: Reduz a prioridade abaixo do padrão
  • auto: Usa os padrões do navegador (valor padrão)

Veja como funciona em diferentes elementos:

<!-- Aumenta a prioridade da imagem LCP -->
<img src="hero.jpg" fetchpriority="high" alt="Hero image">

<!-- Diminui a prioridade de script não crítico -->
<script src="analytics.js" fetchpriority="low"></script>

<!-- Preload com prioridade customizada -->
<link rel="preload" href="font.woff2" as="font" fetchpriority="high" crossorigin>

Principais Diferenças entre Preload e Preconnect

Enquanto preload força a descoberta antecipada de recursos e preconnect prepara conexões com o servidor, o atributo fetchpriority controla especificamente a prioridade de download após a descoberta. Pense desta forma:

  • Preload: “Baixe este recurso cedo”
  • Preconnect: “Prepare a conexão com o servidor”
  • Fetchpriority: “Ao baixar, use este nível de prioridade”

Essas ferramentas se complementam. Uma imagem precarregada ainda recebe baixa prioridade por padrão—adicionar fetchpriority="high" garante que ela seja baixada antes de outros recursos de baixa prioridade.

Otimizando Imagens LCP com fetchpriority

O uso mais impactante do atributo fetchpriority para performance é aumentar a prioridade de imagens Largest Contentful Paint (LCP). Por padrão, os navegadores descobrem que imagens do viewport são importantes apenas após o layout, causando atrasos.

<!-- Sem fetchpriority: Imagem aguarda na fila -->
<img src="product-hero.jpg" alt="Featured product">

<!-- Com fetchpriority: Download imediato com alta prioridade -->
<img src="product-hero.jpg" fetchpriority="high" alt="Featured product">

Testes do mundo real mostram melhorias de LCP de 0,5-2 segundos apenas adicionando este atributo a imagens hero.

Gerenciando Prioridades de Scripts

Scripts async e defer automaticamente recebem baixa prioridade, o que nem sempre é ideal para funcionalidades críticas:

<!-- Script async crítico com alta prioridade -->
<script src="app-core.js" async fetchpriority="high"></script>

<!-- Script de tracking não crítico mantém prioridade baixa -->
<script src="tracking.js" async fetchpriority="low"></script>

<!-- Script de melhorias carregado tardiamente -->
<script src="enhancements.js" defer fetchpriority="low"></script>

Controlando Prioridades da Fetch API

Requisições JavaScript fetch têm alta prioridade por padrão. Para operações em segundo plano, diminua explicitamente a prioridade:

// Dados acionados pelo usuário (mantém alta prioridade)
const userData = await fetch('/api/user');

// Sincronização em segundo plano (prioridade menor)
const suggestions = await fetch('/api/suggestions', {
  priority: 'low'
});

// Chamada crítica da API durante carregamento da página
const config = await fetch('/api/config', {
  priority: 'high'
});

Otimizando Recursos Não Críticos

Nem todos os CSS e fontes merecem alta prioridade. Use fetchpriority para despriorizar recursos suplementares:

<!-- Estilos críticos carregam primeiro -->
<link rel="stylesheet" href="critical.css">

<!-- Variações de tema podem aguardar -->
<link rel="preload" as="style" href="theme-dark.css" 
      fetchpriority="low" onload="this.rel='stylesheet'">

<!-- Fonte de ícones não é imediatamente visível -->
<link rel="preload" as="font" href="icons.woff2" 
      crossorigin fetchpriority="low">

Melhores Práticas para Implementação do fetchpriority

O atributo fetchpriority é uma dica, não um comando. Os navegadores podem substituir suas preferências baseadas em suas heurísticas. Siga estas diretrizes:

Use com moderação: Apenas ajuste a prioridade para recursos que impactem mensuralmente a performance. Comece com imagens LCP e scripts críticos.

Combine com preload estrategicamente: Para imagens de fundo CSS que acionam LCP:

<link rel="preload" as="image" href="hero-bg.jpg" fetchpriority="high">

Teste o impacto: Use o painel Network do Chrome DevTools para verificar mudanças de prioridade. Procure pela coluna Priority e observe mudanças de prioridade durante o carregamento da página.

Considere a largura de banda: Dicas de prioridade importam mais em conexões lentas onde recursos competem por largura de banda limitada. Conexões HTTP/1.1 se beneficiam mais que HTTP/2 ou HTTP/3.

Evite uso excessivo: Definir tudo como alta prioridade derrota o propósito. Foque em 2-3 recursos verdadeiramente críticos por página.

Suporte dos Navegadores e Implementação

O atributo fetchpriority possui amplo suporte em navegadores modernos:

  • Chrome/Edge: 102+
  • Safari: 17.2+
  • Firefox: 132+

Navegadores mais antigos simplesmente ignoram o atributo, tornando-o uma melhoria progressiva. Não são necessários polyfills.

Conclusão

O atributo fetchpriority oferece controle refinado sobre as prioridades de carregamento de recursos, impactando diretamente a performance das Core Web Vitals. Foque em aumentar a prioridade de imagens LCP, gerenciar prioridades de scripts async e diminuir a competição de recursos não críticos. Lembre-se de que é uma dica—teste suas mudanças e meça o impacto real na performance ao invés de assumir que o navegador sempre honrará suas prioridades.

Perguntas Frequentes

Sim, mas tem efeito limitado. Imagens lazy-loaded já atrasam o carregamento até serem necessárias. Use fetchpriority=high apenas para imagens lazy que aparecem imediatamente no viewport, caso contrário o navegador ignora a dica até que a imagem entre no limite de carregamento.

Sim, fetchpriority funciona em todas as versões HTTP. Embora HTTP/2 e HTTP/3 eliminem o bloqueio head-of-line através de multiplexing, as dicas de prioridade ainda controlam a ordem que os navegadores solicitam e processam recursos, especialmente em conexões com largura de banda limitada.

Abra a aba Network do Chrome DevTools e habilite a coluna Priority. Recursos com fetchpriority mostram prioridades ajustadas como High ou Low ao invés dos padrões. Você também pode verificar o painel Performance para medir melhorias reais no tempo de carregamento.

Não, reserve fetchpriority=high apenas para sua única imagem LCP. Múltiplas imagens de alta prioridade competem entre si e com CSS/JavaScript críticos. Os navegadores já aumentam automaticamente a prioridade de imagens visíveis, então apenas substitua para o elemento visual mais importante.

Understand every bug

Uncover frustrations, understand bugs and fix slowdowns like never before with OpenReplay — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.

OpenReplay