Se um script de terceiros estiver desacelerando o carregamento de página, você tem duas opções para melhorar o desempenho:
- Remova-o se ele não agrega valor ao seu site.
- Otimize o processo de carregamento.
Esta postagem explica como otimizar o processo de carregamento de scripts de terceiros com as seguintes técnicas:
- Como usar o atributo
async
oudefer
em tags<script>
- Estabelecer conexões antecipadas às origens necessárias
- Carregamento lento
- Como otimizar a forma como você veicula scripts de terceiros
Use async
ou defer
Como os scripts síncronos atrasam a construção e a renderização do DOM, sempre carregue scripts de terceiros de forma assíncrona, a menos que o script precise ser executado antes que a página possa ser renderizada.
Os atributos async
e defer
informam ao navegador que ele pode analisar o HTML enquanto carrega o script em segundo plano e executar o script após o carregamento. Dessa forma, os downloads de script não bloqueiam a construção do DOM ou a renderização
da página, permitindo que o usuário veja a página antes que todos os scripts terminem de
carregar.
<script async src="script.js">
<script defer src="script.js">
A diferença entre os atributos async
e defer
ocorre quando o navegador executa os scripts.
async
Os scripts com o atributo async
são executados na primeira oportunidade após
o término do download e antes do evento
load da janela. Isso significa que é possível (e provavelmente) que os scripts async
não sejam executados na ordem em que aparecem no HTML. Isso também significa que eles podem interromper a construção do DOM se
terminarem o download enquanto o analisador ainda estiver em execução.
defer
Os scripts com o atributo defer
são executados depois que a análise HTML é concluída, mas antes do evento DOMContentLoaded
. defer
garante que os scripts sejam executados na ordem em que aparecem no HTML e
não bloqueiam o analisador.
- Use
async
se for importante que o script seja executado mais cedo no processo de carregamento. - Use
defer
para recursos menos críticos, como um player de vídeo abaixo da dobra.
O uso desses atributos pode acelerar significativamente o carregamento da página. Por exemplo, o Telegraph adicionou todos os scripts, incluindo anúncios e análises, e melhorou o tempo de carregamento do anúncio em uma média de quatro segundos.
Estabeleça conexões antecipadas com as origens necessárias
É possível economizar de 100 a 500 ms estabelecendo conexões antecipadas para origens importantes de terceiros.
Dois tipos de <link>
,
preconnect
e dns-prefetch
, podem ajudar aqui:
preconnect
<link rel="preconnect">
informa ao navegador que sua página quer estabelecer uma
conexão com outra origem e que você gostaria que o processo começasse o mais
rápido possível. Quando o navegador solicita um recurso da origem pré-conectada,
o download é iniciado imediatamente.
<link rel="preconnect" href="https://cdn.example.com">
dns-prefetch
<link rel="dns-prefetch>
processa um pequeno subconjunto do que
<link rel="preconnect">
processa. O estabelecimento de uma conexão envolve a pesquisa
DNS e o handshake TCP e, para origens seguras, negociações de TLS.
dns-prefetch
diz ao navegador para resolver apenas o DNS de um domínio específico antes que ele seja explicitamente chamado.
A dica preconnect
é melhor usada apenas para as conexões mais importantes. Para
domínios de terceiros menos importantes, use <link rel=dns-prefetch>
.
<link rel="dns-prefetch" href="http://example.com">
A compatibilidade do navegador com dns-prefetch
é um pouco diferente da compatibilidade com preconnect
.
Portanto, dns-prefetch
pode servir como substituto para navegadores que não têm suporte ao
preconnect
. Use tags de vinculação separadas para implementar isso com segurança:
<link rel="preconnect" href="http://example.com">
<link rel="dns-prefetch" href="http://example.com">
Carregamento lento de recursos de terceiros
Os recursos incorporados de terceiros podem desacelerar significativamente o carregamento da página se forem mal construídos. Se eles não forem essenciais ou estiverem abaixo da dobra (ou seja, se os usuários precisarem rolar para visualizá-los), o carregamento lento é uma boa maneira de melhorar a velocidade da página e as métricas de pintura. Dessa forma, os usuários recebem o conteúdo da página principal mais rápido e têm uma experiência melhor.
Uma abordagem eficaz é o carregamento lento do conteúdo de terceiros após o carregamento do conteúdo da página principal. Os anúncios são uma boa opção para essa abordagem.
Os anúncios são uma fonte de receita importante para muitos sites, mas os usuários acessam o conteúdo. Ao carregar os anúncios de forma lenta e exibir o conteúdo principal mais rápido, você pode aumentar a porcentagem de visibilidade geral de um anúncio. Por exemplo, a MediaVine mudou para anúncios de carregamento lento e observou uma melhoria de 200% na velocidade de carregamento da página. O Google Ad Manager tem uma documentação sobre como carregar anúncios lentamente.
Também é possível configurar o conteúdo de terceiros para carregar apenas quando os usuários rolarem pela primeira vez para essa seção da página.
Intersection Observer
é uma API do navegador que detecta de maneira eficiente quando um elemento entra ou sai da
viewport do navegador. Ela pode ser usada para implementar essa técnica.
lazysizes é uma biblioteca JavaScript conhecida
para carregamento lento de imagens e iframes
.
Ele é compatível com incorporações e
widgets do YouTube.
Ele também tem suporte opcional
para o Intersection Observer.
Usar o atributo loading
para carregar imagens e iframes de forma lazy loading
é uma ótima alternativa às técnicas do JavaScript e recentemente ficou
disponível no Chrome 76.
Otimizar a veiculação de scripts de terceiros
Confira a seguir algumas estratégias recomendadas para otimizar o uso de scripts de terceiros.
Hospedagem de CDN de terceiros
É comum que fornecedores terceirizados forneçam URLs para arquivos JavaScript que eles hospedam, geralmente em uma rede de fornecimento de conteúdo (CDN, na sigla em inglês). Os benefícios dessa abordagem são que você pode começar rapidamente, basta copiar e colar o URL, e não há sobrecarga de manutenção. O fornecedor terceirizado lida com a configuração do servidor e as atualizações do script.
No entanto, como eles não estão na mesma origem que o restante dos recursos, o carregamento de arquivos de uma CDN pública tem um custo de rede. O navegador precisa realizar uma pesquisa de DNS, estabelecer uma nova conexão HTTP e, em origens seguras, realizar um handshake SSL com o servidor do fornecedor.
Ao usar arquivos de servidores de terceiros, você raramente tem controle sobre o armazenamento em cache. Contar com a estratégia de armazenamento em cache de outra pessoa pode fazer com que os scripts sejam buscados novamente na rede com muita frequência.
Hospedar scripts de terceiros
A auto-hospedagem de scripts de terceiros é uma opção que oferece mais controle sobre o processo de carregamento de um script. Com a auto-hospedagem, você pode:
- Reduza a busca DNS e os tempos de ida e volta.
- Melhore os cabeçalhos de armazenamento em cache HTTP.
- Use o HTTP/2 ou o HTTP/3 mais recente.
Por exemplo, o Casper conseguiu economizar 1,7 segundo dos tempos de carregamento com a auto-hospedagem de um script de teste A/B.
No entanto, a auto-hospedagem tem uma grande desvantagem: os scripts podem ficar desatualizados e não receberão atualizações automáticas quando houver uma mudança na API ou uma correção de segurança.
Usar service workers para armazenar em cache scripts de servidores de terceiros
Como alternativa à auto-hospedagem, use service workers para armazenar em cache scripts de servidores de terceiros. Isso oferece mais controle sobre o armazenamento em cache, mantendo os benefícios das CDNs de terceiros.
É possível controlar a frequência com que os scripts são buscados novamente da rede e
criar uma estratégia de carregamento que limite as solicitações de recursos
de terceiros não essenciais até que um usuário chegue a uma interação importante na página.
Com preconnect
, é possível estabelecer conexões antecipadas e também ajudar
a reduzir os custos de rede.