Publicado em 17 de agosto de 2018
Este guia examina as regras do PageSpeed Insights no contexto: o que devemos considerar ao otimizar o caminho crítico de renderização e por quê.
Eliminar JavaScript e CSS que bloqueiam a renderização
Para acelerar ao máximo a primeira renderização, minimize e, se possível, elimine a quantidade de recursos críticos na página, minimize o número de bytes críticos baixados e otimize o tamanho do caminho crítico.
Otimizar o uso do JavaScript
Por padrão, os recursos JavaScript bloqueiam o analisador, a menos que marcados como async
ou adicionados usando um snippet especial de JavaScript. Quando o JavaScript bloqueia o analisador, força o navegador esperar pelo CSSOM e suspende a construção do DOM, o que, por sua vez, pode retardar consideravelmente a primeira renderização.
Preferir recursos JavaScript assíncronos
Os recursos assíncronos desbloqueiam o analisador de documentos e permitem que o navegador não fique bloqueado no CSSOM antes de executar o script. Muitas vezes, se o script puder usar o atributo async
, quer dizer que ele não é essencial para a primeira renderização. Considere carregar scripts de forma assíncrona após a renderização inicial.
Evitar chamadas síncronas ao servidor
Use o método navigator.sendBeacon()
para limitar os dados enviados por XMLHttpRequests em
gerenciadores unload
. Como muitos navegadores exigem que essas solicitações sejam
síncronas, elas podem retardar, algumas vezes visivelmente, as transições entre as páginas. O código abaixo
mostra como usar navigator.sendBeacon()
para enviar dados ao servidor no
gerenciador pagehide
em vez do gerenciador unload
.
<script>
function() {
window.addEventListener('pagehide', logData, false);
function logData() {
navigator.sendBeacon(
'https://putsreq.herokuapp.com/Dt7t2QzUkG18aDTMMcop',
'Sent by a beacon!');
}
}();
</script>
O método fetch()
oferece uma maneira melhor de solicitar dados de forma assíncrona. fetch()
processa respostas usando promessas em vez de vários gerenciadores de eventos. Ao contrário da resposta a um XMLHttpRequest, a resposta fetch()
é um objeto de stream. Isso significa que uma chamada para json()
também retorna uma promessa.
<script>
fetch('./api/some.json')
.then(
function(response) {
if (response.status !== 200) {
console.log('Looks like there was a problem. Status Code: ' + response.status);
return;
}
// Examine the text in the response
response.json().then(function(data) {
console.log(data);
});
}
)
.catch(function(err) {
console.log('Fetch Error :-S', err);
});
</script>
O método fetch()
também pode processar solicitações POST.
<script>
fetch(url, {
method: 'post',
headers: {
"Content-type": "application/x-www-form-urlencoded; charset=UTF-8"
},
body: 'foo=bar&lorem=ipsum'
}).then(function() { // Additional code });
</script>
Adiar a análise do JavaScript
Para minimizar a quantidade de trabalho que o navegador tem para renderizar a página, adie todos os scripts que não são críticos para construir o conteúdo visível da renderização inicial.
Evitar JavaScript de longa duração
O JavaScript de longa duração impede o navegador de construir o DOM, o CSSOM e de renderizar a página. Por isso, adie para depois toda lógica de inicialização que não seja essencial para a primeira renderização. Se for necessário executar uma longa sequência de inicialização, considere dividi-la em várias fases para permitir que o navegador processe outros eventos entre elas.
Otimizar o uso do CSS
O CSS é necessário para construir a árvore de renderização, e o JavaScript geralmente fica bloqueado no CSS durante a construção inicial da página. Confirme que todo CSS não essencial esteja marcado como não crítico (por exemplo, impressões e outras consultas de mídia) e que a quantidade de CSS crítico e o tempo de entrega deles sejam os menores possíveis.
Colocar CSS no cabeçalho do documento
Especifique todos os recursos CSS o mais cedo possível no documento HTML para que o navegador possa encontrar as tags <link>
e despachar a solicitação do CSS o quanto antes.
Evite importações de CSS
A diretiva de importação (@import
) do CSS permite que uma folha de estilo importe regras de outro arquivo de folha de estilo. No entanto, evite essas diretivas, já que elas introduzem mais idas e voltas ao caminho crítico. Os recursos CSS importados são encontrados somente após o recebimento e a análise da folha de estilo CSS com a própria regra @import
.
Incorporar in-line a CSS de bloqueio de renderização
Para ter o melhor desempenho, considere a inserção do CSS crítico em linha diretamente no documento HTML. Isso elimina idas e vindas adicionais ao caminho crítico e, se feito corretamente, pode proporcionar um caminho crítico de uma ida e vinda, com o HTML sendo o único recurso com bloqueio.