Estou buscando melhorar as métricas Web Vitals do meu site, especificamente o LCP. Tenho tido problemas onde o tempo é de ~2,7s (deveria ser inferior a 2,5s). De https://web.dev/optimize-lcp:
Especificamente, o LCP mede o tempo desde o momento em que o usuário inicia o carregamento da página até que a maior imagem ou bloco de texto seja renderizado dentro da viewport.
Isolei o problema em um componente de tema de banner que escrevi. Uma imagem de banner que monto como um widget “above-main-container” é o maior objeto pintado na tela em basicamente todas as páginas.
É o que eu acho que está acontecendo. A div que contém a imagem é montada usando JS, então uma série de pré-requisitos precisam acontecer quando uma página do Discourse é atualizada antes que esse código JS seja executado. Isso faz com que o banner seja buscado após 2,5s, prejudicando assim a métrica LCP.
Tentei priorizar a imagem do banner usando fetchpriority="high", como visto no código. Mas acho que isso não resolve o problema de tempo raiz aqui.
Alguma sugestão sobre como priorizar a renderização deste componente de tema específico? Seria melhor convertê-lo para um plugin? Existe alguma outra maneira de injetar o banner o mais cedo possível? Obrigado!
Mudei para usar um CDN, o que não ajudou. Como mencionei, acho que a chamada para buscar o banner está acontecendo tarde demais, não o tempo de busca. Tentarei o prefetch para ver se faz alguma diferença!
O que fiz no meantime até chegar a uma solução foi não mostrar o banner a menos que você esteja logado. Parece que o Google está calculando o LCP principalmente a partir do tráfego de busca, que geralmente são usuários não logados no meu caso.
O LCP virá de todos os usuários que usam o Google Chrome, portanto, Android, Windows, MacOS, Linux e Chromebooks.
Se você tiver mais visualizações de página vindas de anônimos nesses dispositivos do que de usuários logados, sim, seu LCP refletirá o desempenho desses anônimos.
Primeiro, acabei de verificar e a tela de introdução já usa a tela inteira (100vh e 100% de largura).
No entanto, alguns usuários não verão a tela de introdução se o Discourse carregar rápido o suficiente. Para esses, o LCP será definido por qualquer elemento que seja grande o suficiente. No seu caso, o banner, então você está limitado por ele.
Eu tentaria a meta tag prefetch e garantiria que fosse um ativo muito bem otimizado e que todos os seus ativos fossem entregues via CDN com PoPs próximos a onde seus usuários estão.
Acabei de tentar essa possível solução e, infelizmente, não pareceu fazer diferença. Também substituí a imagem do banner por uma imagem trivialmente pequena como verificação de sanidade e isso também não fez diferença para o LCP. Obrigado pela sugestão, no entanto.
Não sei o funcionamento interno de como os componentes de tema são injetados na página, mas minha impressão é que, quando o componente de banner é injetado, já é tarde demais. Minha próxima tentativa será experimentá-lo como um plugin.