
Publicado em 11/6/2024, 8:03:00 AM
Atualizado em 11/7/2024, 5:57:00 AM
Hoje vou falar um pouco dos problemas que encontrei para entregar imagens de maneira rápida e otimizada para vários tamanhos de telas. Assim como das outras vezes, busquei usar o mínimo esforço pra entregar a melhor qualidade.
Estava muito feliz de ter finalmente conseguido terminar o layout do blog, na verdade, entreguei o mínimo possível pra conseguir exibir os textos. Além dos textos, precisa entregar pelo menos uma imagem, que é usada no topo da postagem e no card de resumo da Home.
Como estou gerando as imagens com IA, reforço novamente que é para empregar o menor esforço possível, procurei adaptar a entrega ao arquivo de imagem que eu tenho disponível.
Eu ainda estava com algumas dúvidas, eu poderia ter somente a imagem no maior tamanho e apenas redimensionar para um tamanho menor na Home. Na página do Post completo, a imagem já estaria cacheada no navegador.
Logo percebi que era uma péssima ideia, isso acabaria com a Home quando tivesse uma lista com vários Posts. Mesmo com apenas uma imagem, as métricas já indicavam um problema no tempo de carregamento.
Atualmente temos o seguinte cenário:
Outros pontos relacionados e também muito importantes para uma tomada de decisão:
Pra fechar um escopo, vamos fazer os ajustes para entregar:
Os problemas de CLS serão solucionados em outra etapa, acompanhado do ajuste no carregamento das fontes que também estão impactando nessas métricas.
Para resolver esse problema, poderia usar algo como o sharp no backend e fazer a entrega das imagens no tamanho correto. Mas, podendo delegar esse serviço para um terceiro, preferi usar o ImageKit.
O ImageKit permite aplicar várias modificações na imagem passando parâmetros na URL. A documentação é bem completa e já conta com várias soluções para problemas conhecidos, do mais simples ao avançado.
Seguindo as instruções para uma solução mais fácil, adicionei esse cabeçalho no arquivo que contém o layout do blog para ativar os "client hints".
<Head>
<meta http-equiv="Accept-CH" content="Sec-CH-DPR, Sec-CH-Width, Sec-CH-Viewport-Width"/>
</Head>No Card exibido na Home que tem uma largura máxima adicionei alguns parâmetros na URL:
<img src={`${image}?tr=w-766`} className="rounded-t-xl" />image é o endereço original da imagem lá no ImageKit.
?tr=w-766 é o parâmetro de transformação da largura com 766px
Primeiro problema resolvido! As imagens da home já estão menores.
Para a imagem de dentro da página do Post alterei o código para o seguinte:
<picture>
<source
media="(min-width: 768px)"
srcset={`${data.image}?tr=w-auto,h-600`}
sizes="100vw"
/>
<img
src={`${data.image}?tr=w-auto,h-300`}
alt={data.title}
className="w-full h-[300px] md:h-[600px] object-cover object-center"
/>
</picture>Uma tag <picture> com a imagem menor de fallback.
<source> para a imagem que será usada em telas maiores.
?tr=w-auto,h-300 é o parâmetro enviado para o ImageKit com largura automática e a altura para cada tamanho de tela, que no nosso caso pode ser 300 ou 600.
Por enquanto essa foi uma boa solução que atendeu nossa necessidade imediata. No futuro vamos melhorar essa responsividade adicionando mais breakpoints e usar algumas transformações mais avançadas do ImageKit.