LCP request discovery no Lighthouse: verificações e a solução

A imagem de LCP só pode começar a descarregar depois de o browser a encontrar. Porque é que uma foto numa folha de estilos, num slider ou numa opção de lazy loading atrasa o LCP, e como fazê-la arrancar com o HTML.

Arjen Karel Core Web Vitals Consultant
Arjen Karel - linkedin
Last update: 2026-11-05

O que diz o LCP request discovery sobre a imagem de LCP?

O LCP request discovery é o insight do Lighthouse 13 que substituiu "Preload Largest Contentful Paint image" e "Largest Contentful Paint image was lazily loaded". Verifica se a imagem de LCP — a foto grande pela qual os visitantes esperam — pode ser descoberta a partir do HTML: se o browser podia começar a descarregá-la no momento em que o HTML chegou, com prioridade alta. A solução: a foto como <img> no HTML, sem loading="lazy", com fetchpriority="high".

Só quer a solução rápida? Salte para WordPress, page builders, Shopify ou Next.js.

O que significam as três verificações do LCP request discovery?

No Lighthouse 13 e no PageSpeed Insights, o aviso diz: "Optimize LCP by making the LCP image discoverable from the HTML immediately, and avoiding lazy-loading". Por baixo estão três verificações, cada uma a verde ou a vermelho.

Lighthouse report, LCP request discovery in red with the labels LCP and Unscored: fetchpriority=high should be applied (red), Request is discoverable in initial document (green), LCP resources shouldn't use loading=lazy (red); below it the LCP element, an img of a terrace above the sea with loading=lazy

O aviso para a página inicial de um hotel cuja foto principal tem loading="lazy". Lighthouse 13.6 com throttling nas DevTools.

  • fetchpriority=high should be applied: o browser pediu a imagem de LCP sem fetchpriority="high". Quando a foto veio através de um preload, a verificação diz "fetchpriority=high should be applied to the image preload request": o preload também precisa dele. Quando passa no teste, diz "fetchpriority=high applied".
  • Request is discoverable in initial document: o URL da foto está no próprio HTML, num <img> ou num preload, onde o preload scanner (a parte do browser que lê o HTML antecipadamente) o encontra. Uma imagem de fundo numa folha de estilos, um slider que constrói os slides com JavaScript ou um script de lazy loading que moveu o URL para data-src deixam esta verificação a vermelho.
  • LCP resources shouldn’t use loading=lazy: a foto tem loading="lazy", pelo que o browser só a pede quando o layout mostrar que está no ecrã.

Basta uma verificação a vermelho para o aviso ficar vermelho. O elemento LCP no fundo, uma miniatura com o respetivo HTML, mostra o elemento que o Lighthouse mediu no ecrã de um telemóvel. Unscored significa que o aviso não acrescenta pontos por si só, mas o LCP vale um quarto da pontuação de Performance, e o Google baseia o ranking no que os visitantes reais obtêm. O aviso só surge quando o elemento LCP é uma imagem: um <img>, um fundo em CSS ou um poster de vídeo.

Porque é que uma imagem de LCP tardia torna a página lenta?

Num telemóvel, o visitante vê o título e o texto em redor de um bloco vazio onde fica a foto grande, durante um segundo ou mais.

Enquanto o HTML é descarregado, o preload scanner do Chrome lê o documento antecipadamente e pede todas as imagens no src ou srcset de um <img> sem loading="lazy": o momento mais cedo em que uma foto pode arrancar. Qualquer outra foto arranca mais tarde: numa folha de estilos, espera por esse ficheiro e pelo layout; num atributo style ou com loading="lazy", espera pelo layout, que precisa primeiro de cada folha de estilos render-blocking; um slider ou script de lazy loading tem de ser descarregado e executado antes de pedir a foto.

Essa espera, o resource load delay, costuma demorar mais do que o download: no site mediano com um LCP fraco, a imagem espera 1290 ms e depois descarrega em 350 ms (web.dev).

Numa página inicial de hotel que criei à semelhança de um site WordPress com page builder, coloquei a mesma foto de sete formas e carreguei cada uma num telemóvel com throttling:

A foto éPedidoLCP
um <img> com fetchpriority="high"0,592,02
um fundo, com preload0,592,03
um <img> com loading="lazy"1,733,64
um fundo na folha de estilos1,713,62
um <img> preenchido por script de lazy loading2,443,98
um fundo num atributo style1,704,16
um slide construído por script de slider2,434,63

Medianas de cinco carregamentos, em segundos, em Slow 4G com CPU 4x mais lento. O HTML chegou sempre aos 0,58 s.

Todas as versões carregaram a mesma foto de 63 kB, exceto o atributo style, que não consegue alternar para o ficheiro mais pequeno de telemóvel. O momento de início do pedido fez a diferença: a foto no HTML foi pedida assim que o HTML chegou; as outras esperaram pelo first paint aos 1,7 s ou pelos scripts aos 2,4 s.

The hotel home page on a phone 2.5 seconds into the load with loading=lazy on the photo: the logo, the headline Sunset terraces above the caldera and the booking form, over an empty grey block

Antes: loading="lazy"

The same moment with loading=lazy removed and fetchpriority=high on the photo: the terrace above the sea fills the top of the screen behind the headline and the booking form

Depois: sem loading="lazy", fetchpriority="high"

A página do hotel aos 2,5 segundos de carregamento no mesmo telemóvel com throttling.

O fetchpriority="high" indica ao Chrome logo no primeiro momento que esta imagem é importante, garantindo-lhe mais recursos da ligação. Numa página pesada, onde a foto compete com dezenas de scripts e folhas de estilos, isso pode acelerar o LCP: a Google mediu uma descida de 2,6 s para 1,9 s no Google Flights. Só ajuda uma foto que o browser já tenha encontrado: uma foto numa folha de estilos ou num script precisa primeiro da alteração no HTML.

Porque é que o fetchpriority=high continua a vermelho quando a imagem o tem?

A verificação analisa o pedido que carregou a imagem de LCP. Procure o nome do ficheiro da foto no código-fonte da página, sem sessão iniciada. As causas habituais (soluções abaixo):

  • Um preload que não escreveu. Um tema, o alojamento ou uma CDN podem enviar um preload para a foto num cabeçalho Link ou em 103 Early Hints; um plugin de cache ou o Next.js adiciona um <link rel="preload"> ao head. Para verificar um cabeçalho, abra o painel Network nas DevTools, clique no primeiro pedido (a própria página) e consulte os Headers.
  • Um plugin de lazy loading reescreveu a imagem. Se a verificação de descoberta também estiver a vermelho, procure data-src ou data-lazy-src na foto: um plugin moveu o URL para aí, e um script pede a foto mais tarde.
  • O WordPress atribuiu o atributo a outra imagem. O WordPress adiciona fetchpriority="high" à primeira imagem grande no primeiro ecrã (50 000 píxeis ou mais). Um logótipo carregado no dobro do tamanho, por exemplo 600 por 200 píxeis, surge primeiro e fica com ele.
  • O Lighthouse mediu uma imagem diferente. O elemento LCP no fundo do aviso mostra qual foi. Num telemóvel, pode ser um hero de mobile separado, com a foto de desktop oculta por CSS e o atributo nessa foto de desktop.
LCP request discovery for the hotel page with a JavaScript lazy loader: fetchpriority=high should be applied (red), Request is discoverable in initial document (red), LCP resources shouldn't use loading=lazy (green); the img in the element row has data-src and data-srcset

A página do hotel com um script de lazy loading: duas verificações a vermelho. Lighthouse 13.6 com throttling nas DevTools.

Quanto tempo esperam os visitantes pela imagem de LCP?

Os field data mostram quanto tempo os visitantes reais esperam. No CoreDash, abra o LCP Breakdown em mobile e escolha LCP Priority em More dimensions: cada linha representa uma forma como a imagem de LCP foi carregada, com o respetivo LCP p75 dividido em partes. A parte verde é o load delay, a espera entre a chegada do HTML e o início do download da imagem. Agrupe por URL para encontrar o template onde essa espera é longa.

CoreDash, LCP subparts by LCP Priority on mobile, p75: rows for Preloaded, Not preloaded, High fetchpriority and Lazy loaded, each with a bar split into its subparts, load delay in green

CoreDash em mobile, p75: compare a parte verde de cada linha de LCP Priority.

Como ver nas DevTools o atraso no arranque da imagem?

Grave um trace da página no painel Performance das Chrome DevTools e abra o LCP request discovery na barra lateral Insights. Na minha página de teste do hotel, com a foto como fundo na folha de estilos do page builder, o insight mostra quanto tempo após o primeiro byte do HTML — o seu "earliest start point" — o pedido da foto começou. A barra às riscas na faixa Network marca essa espera.

Chrome DevTools Performance panel: the LCP request discovery insight with LCP image loaded 1,552 ms after earliest start point, and in the Network track a striped bar from the HTML to the start of terrace-caldera-768.jpg, which begins after the stylesheets

O pedido da foto arranca depois das folhas de estilos. Chrome DevTools, painel Performance, telemóvel com throttling.

No painel Network, a coluna Initiator junto à foto indica o ficheiro que a pediu: uma folha de estilos, um script de slider ou o HTML, quando arrancou a tempo.

Como corrigir o LCP request discovery?

Procure o nome do ficheiro da foto no código-fonte da página. Num src ou srcset de um <img>, o browser encontra-a logo; se estiver em data-src, numa folha de estilos ou em lado nenhum, é isso que tem de mudar. O objetivo em qualquer caso: a foto como <img> no HTML, sem loading="lazy", com fetchpriority="high", nessa imagem específica. Adicione fetchpriority="high" a um preload que não tenha escrito, ou desative-o. Substitua um hero de mobile separado por uma única foto para ambos os ecrãs, ou por um <picture> com um <source> para o ficheiro de telemóvel e fetchpriority="high" no respetivo <img>.

WordPress e plugins de lazy loading

O WordPress mantém as primeiras imagens fora do lazy loading e atribui fetchpriority="high" à primeira imagem grande. Quando o aviso continua a vermelho, a causa costuma ser um plugin a sobrepor-se a isto:

  • WP Rocket: a opção Optimize Critical Images, ativa por predefinição, aprende qual é a imagem de LCP a partir de visitas reais, faz o preload com fetchpriority="high" e mantém-na fora do LazyLoad. Teste novamente após reconstruir a cache.
  • Perfmatters: defina Exclude Leading Images e Preload Critical Images para o número de imagens no primeiro ecrã num telemóvel, frequentemente uma.
  • LiteSpeed Cache: adicione o nome do ficheiro da foto a Lazy Load Image Excludes, ou ative Viewport Images.
  • FlyingPress: confirme se a foto tem loading="eager" e um preload; se não tiver, exclua-a do lazy loading.

Carregue o logótipo no tamanho em que é apresentado, para que o atributo vá para a foto. Mantenha apenas uma solução de lazy loading, senão a foto continuará em lazy loading depois de a ter excluído numa delas. No bloco Cover, a opção Fixed background transforma a foto num fundo num atributo style: desative-a e a foto volta a ser um <img>. O meu plugin WP Core Web Vitals aprende a imagem de LCP por tamanho de ecrã a partir dos visitantes e carrega-a primeiro, com prioridade alta.

Elementor e outros page builders

Uma foto definida como fundo de um Container ou Section do Elementor vai parar ao CSS do Elementor; por isso, o browser só a encontra depois desse CSS e do layout. Use um widget Image para a foto de hero (um hero no Elementor com uma imagem); a opção Optimized Image Loading (Settings, Performance) trata dela como o WordPress. A opção Lazy Load Background Images, ativa por predefinição, pode atrasar um hero em fundo que fique por baixo de uma barra de aviso. Também noutros builders: use um elemento de imagem para a primeira foto.

Sliders

O primeiro slide tem de ser um <img> no HTML, sem loading="lazy", com fetchpriority="high"; os restantes slides recebem loading="lazy" e fetchpriority="low". Um slider que constrói os slides com JavaScript só inicia o primeiro slide depois da execução desse script: use um slider que imprima o primeiro slide no HTML, ou mostre uma única foto em telemóveis. No Image Carousel do Elementor, a opção Lazyload coloca o URL de todos os slides em data-src: desative-a.

Shopify

O Dawn, o Horizon e os temas baseados neles atribuem fetchpriority="high" à imagem da primeira secção do template e carregam-na de imediato; por isso, torne o banner ou slideshow a primeira secção. Numa página de produto do Dawn, a foto principal não tem fetchpriority: em snippets/product-thumbnail.liquid, adicione fetchpriority: 'high' à image_tag quando lazy_load for false (a primeira foto). Uma atualização do tema pode substituir este ficheiro: confirme o atributo a seguir. Um hero que uma app construa com JavaScript arranca sempre tarde, independentemente do que o tema faça: use uma secção do tema.

Noutros temas, procure loading: 'lazy' ou uma classe lazyload com data-src no ficheiro da secção, e defina a prioridade com base na posição da secção:

{%- liquid
  assign fetch_priority = 'auto'
  if section.index == 1
    assign fetch_priority = 'high'
  endif
-%}
{{ section.settings.image | image_url: width: 1600 | image_tag: widths: '750, 1100, 1600', sizes: '100vw', fetchpriority: fetch_priority }}

Sem o parâmetro loading, a image_tag aplica lazy loading a imagens a partir da quarta secção.

Imagens de fundo em CSS

Sem uma opção de imagem no seu tema ou builder, isto exige um developer. Comece por converter o fundo num <img>: o browser encontra-o logo no HTML e o srcset permite que cada ecrã escolha o seu ficheiro. O object-fit faz com que preencha o espaço tal como o fundo fazia:

<section class="hero">
  <img class="hero-img" src="/wp-content/uploads/2026/10/terrace-1024.jpg"
    srcset="/wp-content/uploads/2026/10/terrace-768.jpg 768w, /wp-content/uploads/2026/10/terrace-1024.jpg 1024w, /wp-content/uploads/2026/10/terrace-1600.jpg 1600w"
    sizes="100vw" width="1600" height="1067" alt="Terrace above the sea" fetchpriority="high">
</section>
.hero { position: relative; }
.hero-img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }

Se tiver mesmo de continuar como fundo, faça o preload do ficheiro que o CSS escolhe por tamanho de ecrã, com as media queries do CSS e fetchpriority="high"; um preload para outro ficheiro descarrega a foto duas vezes. Adicione-o apenas ao template dessa página. Para um CSS que muda para o ficheiro de 768 px abaixo de 768 px:

<link rel="preload" as="image" href="/wp-content/uploads/2026/10/terrace-768.jpg" media="(max-width: 767px)" fetchpriority="high">
<link rel="preload" as="image" href="/wp-content/uploads/2026/10/terrace-1600.jpg" media="(min-width: 768px)" fetchpriority="high">

Next.js, Astro e React

O next/image aplica lazy loading por predefinição. Desde o Next.js 15, a prop priority (preload no 16) torna o carregamento da imagem eager e faz o preload sem fetchpriority, pelo que a verificação continua a vermelho. Defina ambos manualmente, sem priority:

<Image src={hero} alt="Terrace above the sea" sizes="100vw" loading="eager" fetchPriority="high" />

No Astro 5.10 e versões posteriores, a prop priority no <Image> define ambos. Um hero que o React renderize no browser só existe após a execução do JavaScript: renderize-o no servidor ou pré-renderize a página, para que o <img> conste no HTML.

Um hero que não pode alterar

Um teste A/B que troca a foto ou um widget que constrói o hero com JavaScript atrasam o arranque da imagem. Se o URL da foto não mudar, um preload com fetchpriority="high" no seu próprio template antecipa o pedido. Num servidor lento, o 103 Early Hints consegue iniciar uma foto que use o mesmo ficheiro em todos os ecrãs antes de o HTML chegar. Ambos exigem um developer.

A imagem de LCP já arranca com o HTML?

Execute o Lighthouse novamente: três verificações a verde e a foto identificada como elemento LCP. Nas DevTools, o pedido da foto arranca logo a seguir ao HTML. Passou nos testes e o LCP continua lento? Analise as outras partes do LCP: um servidor lento (time to first byte), uma foto que demora a descarregar (load duration) ou folhas de estilos e scripts que atrasam o paint (render delay). Para visitantes reais, acompanhe o load delay em telemóveis no CoreDash; a Search Console demora até 28 dias.

A Core Web Vitals power hour serve para a foto que esta página não consegue resolver: uma foto colocada por um page builder, slider ou app sem qualquer configuração disponível, ou uma que passa nas três verificações enquanto o LCP em telemóveis continua lento. Acompanhamo-la através de um trace da sua própria página, desde o HTML até ao ecrã, e descobrimos o que a está a atrasar.

About the author

Arjen Karel is a web performance consultant and the creator of CoreDash, a Real User Monitoring platform that tracks Core Web Vitals data across hundreds of sites. He also built the Core Web Vitals Visualizer Chrome extension. He has helped clients achieve passing Core Web Vitals scores on over 925,000 mobile URLs.

 
Arjen Karel

Precisa de um site mais rápido?

Sou o Arjen e há 17 anos que corrijo sites lentos. Se tem problemas que não consegue resolver sozinho, envie-me o seu URL e falamos.

Envie-me o seu URL
Arjen Karel
Arjen Karel, Consultor de web performance desde 2009

Porque é que o nosso fix não está a funcionar?

Por vezes a CDN ainda serve o HTML antigo, ou o fix foi feito no template de desktop e o mobile usa outro. Envie-me o seu URL e o problema, e respondo com alguns horários. Primeiro analiso os seus field data, depois dedicamos uma hora ao seu site, e no prazo de um dia tem as minhas notas por escrito. 350 € sem IVA.

Envie-me o seu URL

Sem programador para fazer o fix? Faço eu o trabalho, numa cópia do seu site.

LCP request discovery no Lighthouse: verificações e a solução Core Web Vitals LCP request discovery no Lighthouse: verificações e a solução