Resumo
O uso de scripts de terceiros pode ter um grande impacto no desempenho de um site. Tais scripts costumam operar de forma bloqueante e podem atrapalhar o tempo de carregamento das páginas.
Para reduzir o tenpo gasto com tais scripts, recomenda-se:
- Evitar ao máximo usar scripts de terceiros
- Postergar o carregamento dos scripts para após a interação do sistema
- Usar async ou defer nos scripts
- Pré-carregar conexão com a origem do script
Postergando o carregamento de scripts.
Caso o script em questão não seja prioritário, isto é, pode aguardar uma interação do usuário ou não representa uma funcionalidade vital ao site, uma recomendação é postergar seu carregamento para o momento em que o usuário interage com o site de fato.
Cada script pode exigir uma estratégia diferente para postergar sua execução. Abaixo, existe um exemplo de uma estratégia comum (fonte) para postergar o script para que seja executado apenas após a interação do usuário seguida de um atraso:
<script>
{
const load = () => {
// YOUR SCRIPT CONTENT
}
const timer = setTimeout(load, 5000);
const trigger = () => {
load();
clearTimeout(timer);
}
const events = ["mouseover","keydown","touchmove","touchstart"];
events.forEach(e => window.addEventListener(e, trigger, {passive: true, once: true}));
}
</script>
Outra alternativa é fazer uso da intersection API, de forma que o código seja executado apenas quando um determinado elemento esteja em tela (útil para aquilo que deve ser executado só após o usuário der scroll em uma tela).
const elem = document.getElementById(id);
const observer = new IntersectionObserver((items) => {
// YOUR SCRIPT CONTENT
observer.unobserve(elem);
});
observer.observe(elem);
Async e Defer nos script
A presença de uma tag <script src="script.js">
ocasiona o atraso da execução
do carregamento da DOM. Isto porque o browser irá respeitar a ordem dos scripts
para baixá-los e executá-los.
Caso o script em si não faça manipulação na DOM, ele é um forte candidato para ser atrasado via async. Um script async será baixado de forma assíncrona para só então ser executado na primeira oportunidade que der antes do loading da DOM:
<script async src="script.js">
Já para executar o script apenas depois que o parsing do html esteja de fato completo, é possível fazer uso do atributo defer:
<script defer src="script.js">
Pré-carregar conexão com a origem do script
Se possível, é uma recomendação servir o script localmente (pasta static
).
Caso o script esteja em outro domínio, a recomendação é fazer uso do prefetch
para acelerar a resolução do DNS do servidor do script:
<link rel="dns-prefetch" href="http://example.com">
Caso o script seja crítico, é possível sinalizar, inclusive para o browser já iniciar uma conexão com a origem, de forma tornar essa conexão ainda mais eficiente:
<link rel="preconnect" href="http://example.com">
importante: use o preconnect apenas quando necessário e para os script de maior impacto.