Regras e recomendações do PageSpeed

Publicado em 17 de agosto de 2018

Este guia examina as regras do PageSpeed Insights no contexto: o que observar ao otimizar o caminho de renderização crítico e por quê.

Eliminar JavaScript e CSS que bloqueiam a renderização

Para reduzir o tempo de renderização, minimize e, sempre que possível, elimine o número de recursos críticos na página, minimize o número de bytes críticos transferidos por download e otimize o comprimento do caminho crítico.

Otimizar o uso do JavaScript

Os recursos JavaScript são bloqueados por padrão, a menos que sejam marcados como async ou adicionados usando um snippet JavaScript especial. O parser que bloqueia o JavaScript força o navegador a esperar pelo CSSOM e pausa a construção do DOM, o que pode atrasar significativamente o tempo de renderização.

Preferir recursos JavaScript assíncronos

Os recursos assíncronos desbloqueiam o analisador de documentos e permitem que o navegador evite o bloqueio no CSSOM antes de executar o script. Muitas vezes, se o script puder usar o atributo async, isso também significa 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 de servidor síncronas

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 de forma perceptível. 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. O fetch() processa respostas usando promessas em vez de vários manipuladores de eventos. Ao contrário da resposta a um XMLHttpRequest, uma 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>

Aguardar a análise do JavaScript

Para minimizar a quantidade de trabalho que o navegador precisa realizar para renderizar a página, adie todos os scripts não essenciais que não são essenciais para construir o conteúdo visível para a renderização inicial.

Evitar JavaScripts de longa duração

O JavaScript de execução longa impede que o navegador construa o DOM, o CSSOM e renderize a página. Portanto, adie até mais tarde qualquer lógica de inicialização que não seja essencial para a primeira renderização. Se uma sequência de inicialização longa precisar ser executada, considere dividi-la em várias etapas para permitir que o navegador processe outros eventos no meio.

Otimizar o uso de CSS

O CSS é necessário para construir a árvore de renderização, e o JavaScript geralmente bloqueia o CSS durante a construção inicial da página. Verifique se todos os CSS não essenciais estão marcados como não críticos (por exemplo, impressão e outras consultas de mídia) e se a quantidade de CSS crítico e o tempo para entregá-lo são os menores possíveis.

Colocar CSS no cabeçalho do documento

Especifique todos os recursos de CSS o mais cedo possível 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 do 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 de CSS importados são descobertos somente depois que a folha de estilo CSS com a regra @import é recebida e analisada.

Incorporar in-line a CSS de bloqueio de renderização

Para ter a melhor performance, considere inserir o CSS crítico diretamente no documento HTML. Isso elimina as viagens de ida e volta adicionais no caminho crítico e, se feito corretamente, pode fornecer um caminho crítico de "uma viagem de ida e volta" em que apenas o HTML é um recurso de bloqueio.

Feedback