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.
Evite 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 as transições de página, às vezes visivelmente. 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 manipuladores 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 o trabalho que o navegador precisa realizar para renderizar a página, adie todos os scripts não essenciais que não sejam essenciais para a construção do conteúdo visível para a 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 uma longa sequência de inicialização precisar ser executada, considere dividi-la em vários estágios para permitir que o navegador processe outros eventos entre eles.
Otimizar o uso do CSS
O CSS é necessário para construir a árvore de renderização. O JavaScript frequentemente fica bloqueado no CSS durante a construção inicial da página. Garanta que qualquer CSS não essencial seja marcado como não crítico (por exemplo, consultas impressas e outras mídias) e que a quantidade de CSS crítico e o tempo para entregá-los sejam os menores possíveis.
Colocar CSS no cabeçalho do documento
Especifique todos os recursos de CSS o quanto antes no documento HTML para que o navegador possa descobrir as tags <link>
e enviar a solicitação para o CSS o mais rápido possível.
Evite importações de CSS
A diretiva de importação de CSS (@import
) permite que uma folha de estilo importe regras de outro arquivo de folha de estilo. No entanto, evite essas diretivas, porque elas introduzem mais viagens de ida e volta no caminho crítico: os recursos CSS importados são descobertos somente depois que a folha de estilos CSS com a própria regra @import
é recebida e analisada.
Incorporar in-line a CSS de bloqueio de renderização
Para obter o melhor desempenho, você pode considerar a inserção in-line do CSS essencial 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.