Carregamento lento no nível do navegador para CMSs

Aprendizados sobre a adoção do atributo de carregamento padronizado

Meu objetivo com esta postagem é persuadir os desenvolvedores e colaboradores da plataforma de CMS (ou seja, as pessoas que desenvolvem os núcleos do CMS) de que agora é o momento de implementar a compatibilidade com o recurso de carregamento lento de imagens no nível do navegador. Também vou compartilhar recomendações sobre como garantir experiências do usuário de alta qualidade e permitir a personalização de outros desenvolvedores ao implementar o carregamento lento. Essas diretrizes vêm de nossa experiência de adição de suporte ao WordPress, bem como ajudando Joomla, Drupal e TYPO3 a implementar o recurso.

Não importa se você é um desenvolvedor de uma plataforma de CMS ou um usuário de CMS (ou seja, uma pessoa que cria sites com um CMS), use esta postagem para saber mais sobre os benefícios do carregamento lento no nível do navegador. Confira a seção Próximas etapas para sugestões sobre como incentivar sua plataforma de CMS a implementar o carregamento lento.

Contexto

No ano passado, o carregamento lento de imagens e iframes usando o atributo loading se tornou parte do padrão HTML WHWG e teve um aumento na adoção por vários navegadores. Esses marcos, no entanto, estabelecem apenas as bases para uma Web mais rápida e econômica. Agora, ele está no ecossistema da Web distribuído para usar o atributo loading.

Os sistemas de gerenciamento de conteúdo geram cerca de 60% dos sites. Portanto, essas plataformas desempenham um papel vital na entrada da adoção de recursos modernos do navegador na Web. Com alguns CMSs de código aberto conhecidos, como WordPress, Joomla e TYPO3, já implementaram o suporte para o atributo loading em imagens, vamos dar uma olhada nas abordagens e nas conclusões relevantes para adotar o recurso também em outras plataformas de CMS. O carregamento lento de mídia é um importante recurso de desempenho da Web que pode beneficiar os sites em grande escala. Por isso, recomendamos adotá-lo no nível principal do CMS.

O caso da implementação do carregamento lento

Padronização

A adoção de recursos de navegador não padronizados nos CMSs facilita os testes difundidos e pode indicar áreas de melhoria. No entanto, o consenso geral entre os CMSs é que, desde que um recurso do navegador não esteja padronizado, ele precisa ser implementado, de preferência, na forma de uma extensão ou plug-in para a plataforma em questão. Um recurso só pode ser considerado para adoção no núcleo da plataforma depois de padronizado.

Suporte ao navegador

O suporte do navegador ao recurso é uma preocupação semelhante: a maioria dos usuários do CMS pode se beneficiar do recurso. Se houver uma porcentagem considerável de navegadores em que o recurso ainda não é compatível, o recurso precisará garantir que não haja nenhum efeito adverso para eles.

Limites de distância da janela de visualização

Uma preocupação comum com implementações de carregamento lento é que elas, em princípio, aumentam a probabilidade de uma imagem não ser carregada quando se torna visível na janela de visualização do usuário, porque o ciclo de carregamento começa em um estágio posterior. Ao contrário das soluções anteriores baseadas em JavaScript, os navegadores tratam isso de maneira conservadora e, além disso, podem ajustar a abordagem com base em dados reais da experiência do usuário, minimizando o impacto. Assim, o carregamento lento no nível do navegador é seguro para ser adotado pelas plataformas de CMS.

Recomendações de experiência do usuário

Exigir atributos de dimensão em elementos

Para evitar mudanças de layout, é recomendável há algum tempo que o conteúdo incorporado, como imagens ou iframes, sempre inclua os atributos de dimensão width e height, para que o navegador possa inferir a proporção desses elementos antes de realmente carregá-los. Essa recomendação é relevante independentemente de um elemento estar sendo carregado lentamente ou não. No entanto, devido à probabilidade 0,1% maior de uma imagem não ser totalmente carregada na janela de visualização, ela se torna um pouco mais aplicável com o carregamento lento.

Preferencialmente, os CMSs devem fornecer atributos de dimensão em todas as imagens e iframes. Se isso não for possível para todos esses elementos, é recomendável ignorar as imagens de carregamento lento que não fornecem esses dois atributos.

Evitar o carregamento lento de elementos acima da dobra

No momento, recomendamos que os CMSs adicionem apenas atributos loading="lazy" a imagens e iframes posicionados abaixo da dobra para evitar um atraso na métrica Maior exibição de conteúdo, que em alguns casos pode ser significativo conforme descoberto em julho de 2021. No entanto, é necessário reconhecer que é complexo avaliar a posição de um elemento em relação à janela de visualização antes do processo de renderização. Isso se aplica especialmente se o CMS usar uma abordagem automatizada para adicionar atributos loading. No entanto, mesmo com base na intervenção manual, vários fatores precisam ser considerados, como os diferentes tamanhos e proporções da janela de visualização. Ainda assim, é altamente recomendável omitir imagens principais e outras imagens ou iframes que provavelmente aparecem acima da dobra sejam carregados lentamente.

Evitar um substituto de JavaScript

Embora o JavaScript possa ser usado para fornecer carregamento lento a navegadores que (ainda) não oferecem suporte ao atributo loading, esses mecanismos sempre dependem da remoção inicial do atributo src de uma imagem ou iframe, o que causa um atraso para os navegadores que oferecem suporte ao atributo. Além disso, implementar essa solução baseada em JavaScript nos front-ends de um CMS de grande escala aumenta a área de superfície para possíveis problemas, e é por isso que nenhum CMS importante adotou o carregamento lento no núcleo antes do recurso de navegador padronizado.

Recomendações técnicas

Ativar o carregamento lento por padrão

A recomendação geral para CMSs que implementam o carregamento lento no nível do navegador é ativá-lo por padrão, ou seja, loading="lazy" precisa ser adicionado a imagens e iframes, de preferência apenas para elementos que incluem atributos de dimensão. Ter o recurso ativado por padrão resultará em maior economia de recursos de rede do que se precisasse ser ativado manualmente, por exemplo, por imagem.

O máximo possível é que loading="lazy" só pode ser adicionado a elementos que provavelmente aparecem abaixo da dobra. Embora seja complexo implementar esse requisito em um CMS devido à falta de reconhecimento do lado do cliente e de vários tamanhos de janela de visualização, recomendamos pelo menos usar heurística aproximada para omitir elementos como imagens principais que provavelmente vão aparecer acima da dobra do carregamento lento.

Permitir modificações por elemento

Embora loading="lazy" precise ser adicionado a imagens e iframes por padrão, é crucial permitir a omissão do atributo em determinadas imagens, por exemplo, para otimizar para LCP. Se o público do CMS for, em média, considerado mais experiente com tecnologia, isso pode ser um controle de interface exposto para cada imagem e iframe que permita desativar o carregamento lento para esse elemento. Como alternativa ou complementar, uma API pode ser exposta a desenvolvedores de terceiros para que eles possam fazer mudanças semelhantes por meio do código.

O WordPress, por exemplo, permite pular o atributo loading para todo contexto ou tag HTML ou para um elemento HTML específico no conteúdo.

Retrofit de conteúdo atual

De modo geral, existem duas abordagens para adicionar o atributo loading a elementos HTML em um CMS:

  • Adicione o atributo do editor de conteúdo no back-end, salvando-o persistentemente no banco de dados.
  • Adicione o atributo rapidamente ao renderizar conteúdo do banco de dados no front-end.

É recomendável que o CMS adicione o atributo imediatamente ao renderizar, para trazer também os benefícios do carregamento lento a qualquer conteúdo existente. Se o atributo puder ser adicionado apenas pelo editor, apenas partes do conteúdo novas ou recentemente modificadas receberiam os benefícios, reduzindo dessa forma o impacto do CMS na economia de recursos de rede. Além disso, adicionar o atributo em tempo real vai permitir modificações futuras, caso os recursos do carregamento lento no nível do navegador sejam expandidos.

No entanto, a adição imediata do atributo precisa abranger um atributo loading potencialmente existente em um elemento e permitir que esse atributo tenha precedência. Dessa forma, o CMS ou uma extensão dele também poderia implementar a abordagem baseada no editor sem causar um conflito com atributos duplicados.

Otimizar o desempenho do lado do servidor

Ao adicionar o atributo loading a um conteúdo em tempo real usando, por exemplo, um middleware do lado do servidor, é importante considerar a velocidade. Dependendo do CMS, o atributo pode ser adicionado por travessia de DOM ou expressões regulares, sendo esta última recomendada para desempenho.

O uso de expressões regulares precisa ser mínimo. Por exemplo, um único regex que coleta todas as tags img e iframe no conteúdo, incluindo os atributos delas, e adiciona o atributo loading a cada string de tag, conforme aplicável. O WordPress, por exemplo, pode chegar a ter uma única expressão regular geral para executar várias operações instantâneas a determinados elementos, em que adicionar loading="lazy" é apenas um, usando uma única expressão regular para facilitar vários recursos. Além disso, essa forma de otimização é outro motivo pelo qual é recomendado adotar o carregamento lento no núcleo de um CMS em vez de uma extensão. Isso permite uma melhor otimização de desempenho do lado do servidor.

Próximas etapas

Veja se já existe um tíquete de solicitação de recurso para adicionar suporte ao recurso no CMS ou abra um novo, caso ainda não tenha. Use referências a esta postagem conforme necessário para apoiar sua proposta.

Envie um tweet para mim (felixarntz@) se tiver dúvidas ou comentários, ou para listar seu CMS nesta página, caso o suporte para carregamento lento no nível do navegador tenha sido adicionado. Se você encontrar outros desafios, também estou curioso para saber mais sobre eles para encontrar uma solução.

Se você desenvolve plataformas de CMS, estude como outros CMSs implementaram o carregamento lento:

Use os aprendizados da pesquisa e as recomendações técnicas desta postagem para começar a contribuir com código para seu CMS, por exemplo, na forma de um patch ou solicitação de envio.

Foto principal de Colin Watts no Unsplash.