100 pontos no PageSpeed: o que mudámos para lá chegar

O tempo de carregamento é um fator de posicionamento, mas os conselhos habituais raramente ajudam. Este artigo descreve o que mudámos de facto no nosso site, quanto rendeu cada medida e onde nos enganámos.

Uma forma luminosa acelera para a direita, atrás dela blocos escuros dissolvem-se

O essencial

  • O maior ganho isolado não veio de reduzir ficheiros, veio de substituir uma biblioteca de 458 KB por 6 KB de código próprio.
  • A segunda maior causa foi uma compressão meio configurada: o servidor comprimia apenas HTML, não CSS nem JavaScript.
  • Um salto de layout de valor 1 custou 24 pontos – provocado por CSS carregado depois, que só atuava após a primeira renderização.
  • O que menos rendeu: os formatos de imagem. O que mais rendeu: deixar coisas de fora.

O valor de partida era 58 em 100 no telemóvel. Não é um valor mau para um site com efeito 3D no cabeçalho, mas é um valor que a Google penaliza de forma percetível na pesquisa móvel. No fim ficaram 100 pontos no computador e 98 no telemóvel, com igualmente 100 para acessibilidade.

O que se segue não é uma lista de verificação genérica, é o percurso real – incluindo os sítios em que nos enganámos.

Uma forma luminosa acelera para a direita, atrás dela blocos escuros dissolvem-se
Uma página não fica rápida por se otimizar, fica rápida por se deixar coisas de fora.

O ponto de partida

Medição (móvel)antesdepois
Desempenho5898
Acessibilidade95100
Primeira renderização6,1 s1,4 s
Maior elemento visível11,1 s2,1 s
Total transferido298 KB184 KB
dos quais JavaScript121 KB5 KB

As cinco intervenções que realmente contaram

1. Substituir a biblioteca, não otimizá-la

O cabeçalho mostra uma nuvem de partículas em 3D. Para isso corria uma biblioteca gráfica conhecida – 458 KB depois de reduzida. A medição indicava que 51 KB dela nunca chegavam sequer a ser executados.

O olhar decisivo foi a pergunta sobre quanto precisávamos de facto. Eram onze blocos: renderizador, cena, câmara, geometria, material e algumas classes auxiliares. Tudo isso se pode programar diretamente contra a interface gráfica do navegador.

Resultado: 458 KB passaram a 6 KB. A apresentação é idêntica – mantivemos os mesmos shaders.

Atenção Há dois pormenores que é preciso reproduzir, senão o resultado parece errado: a biblioteca converte as cores do formato hexadecimal para luz linear e mistura de forma aditiva com alfa pré-multiplicado. Sem ambos, a nossa nuvem de partículas ficava nitidamente mais berrante do que antes.

2. A compressão estava só meio ligada

Na configuração do servidor a compressão estava «ligada» – mas a linha que indica que tipos de ficheiro devem ser comprimidos estava comentada. É a predefinição de muitas distribuições. Resultado: só o HTML era comprimido.

A biblioteca gráfica seguia portanto sem compressão pela linha. Depois de ligada: 1243 KB passaram a 251 KB. Além disso, guardamos agora as versões comprimidas já calculadas ao lado, para o servidor não ter de calcular de novo a cada pedido.

Esforço: duas linhas de configuração. Efeito: quase um megabyte por primeiro acesso.

3. Remover por completo a biblioteca de animação

Para as aparições durante o scroll corria outra biblioteca, 114 KB. A medição apontava-a ainda como causadora de recálculos forçados de layout – consultava a geometria durante o scroll e obrigava o navegador a recalcular o layout a meio do movimento.

Substituída por um IntersectionObserver que se limita a colocar uma classe. O movimento em si é feito pelo CSS. Menos 114 KB, sem recálculos, cerca de 40 linhas de código próprio.

4. O favicon tinha 205 KB

Uma pequenez com efeito surpreendente, porque é carregada muito cedo. Substituído por um ficheiro SVG de 6 KB, gerado a partir do logótipo existente.

Sabia que…?

Para a apresentação nos resultados de pesquisa da Google, um favicon SVG não serve de nada – a Google só aceita aí formatos rasterizados, e a imagem tem de ser quadrada com um lado que seja múltiplo de 48 píxeis.

Quem colocar apenas um SVG fica com o marcador cinzento no resultado de pesquisa em vez do seu logótipo. Indicar ambos lado a lado é o caminho certo.

5. Consultar a geometria dentro do frame de animação

Um script lia a altura total do documento em cada evento de scroll. Essa propriedade o navegador não consegue responder de memória – tem de recalcular o layout de toda a página, a meio do scroll.

A regra que daí resulta e que vale em toda a parte: ler no evento, escrever no frame seguinte. Nunca ao contrário. Desde então a altura da página é medida uma vez e guardada, em vez de ser consultada sessenta vezes por segundo.

O erro que custou 24 pontos

À esquerda uma pilha densa de blocos cinzentos, para a direita restam apenas alguns luminosos
O que resta decide o tempo de carregamento – não o quão bem o resto está comprimido.
Da prática

Para nos livrarmos do último pedido bloqueante, tínhamos dividido a folha de estilos: a parte necessária à área visível ia diretamente para o documento, o resto era carregado depois. Um procedimento corrente.

O corte ficou numa marca do ficheiro de origem, atrás da qual julgávamos estar o fim da área visível. Na verdade, atrás dela estavam as regras para o logótipo no cabeçalho, para os espaçamentos por baixo e para as aparições. A página construía-se portanto sem elas e era reposicionada um segundo depois.

O resultado: Cumulative Layout Shift de 1,0 – e com isso 76 em vez de 100 pontos no computador. Particularmente incómodo: localmente, com ligação travada, o valor era 0, porque aí a folha de estilos chegava suficientemente cedo. O erro só era visível em ligação rápida.

A lição: ou a folha de estilos inteira dentro do documento, ou nenhuma. Uma incorporação parcial pressupõe que se sabe exatamente que regra é precisa na área visível – e isso, numa página que cresce, nunca se sabe de forma duradoura.

Dica Havendo suspeita de saltos de layout, medir sem travagem. Uma ferramenta de análise com ligação móvel simulada entrega o ficheiro suficientemente cedo e não mostra o salto. Quem só medir assim julga o problema resolvido.

O que rendeu pouco

Por uma questão de rigor, as medidas que constam de todos os guias e que, no nosso caso, mal foram mensuráveis:

Formatos de imagem. A nossa página inicial quase não tem imagens – o logótipo é um ficheiro SVG. Onde há imagens, a conversão compensa evidentemente; como alavanca principal só serve em páginas com muitas imagens.

Reduzir mais as fontes. Alojamos nós próprios duas famílias tipográficas e pré-carregamos as necessárias à área visível. Mais otimização seria possível, mas não move o valor.

Localização do servidor. Muito recomendada, no nosso caso irrelevante: o tempo até ao primeiro byte já era de 20 milissegundos. Quem já está bem aí não ganha nada com uma rede de distribuição.

O procedimento para repetir

  1. Medir antes de mudar seja o que for. Móvel e computador em separado, anotando os valores.
  2. Procurar o maior ficheiro transferido. É quase sempre JavaScript. A questão não é como reduzi-lo, é se é preciso.
  3. Verificar a compressão. Não se está ligada, mas para que tipos de ficheiro.
  4. Contar os pedidos bloqueantes. Cada folha de estilos no cabeçalho atrasa a primeira renderização.
  5. Verificar saltos de layout sem travagem. O teste que nos faltou.
  6. Medir de novo depois de cada alteração. Senão, no fim não se sabe o que fez efeito.
Prompt
Ajuda-me a traduzir o relatório de PageSpeed da minha página numa
sequência de prioridades. Sê rigoroso; não elogies nada.

As minhas medições:
- Móvel: [pontuação], computador: [pontuação]
- LCP, TBT, CLS por dispositivo: [valores]
- Maiores ficheiros transferidos com tamanho: [lista]
- Pedidos que bloqueiam a renderização: [lista]
- Avisos do relatório: [colar texto]

Sobre a página:
- Como está construída: [CMS / estática / construtor]
- O JavaScript é preciso para o conteúdo visível? [sim/não]
- Como é entregue o CSS? [externo / em linha / parcialmente]

Tarefas:
1. Atribui cada aviso a uma causa e diz que métrica ele afeta –
   LCP, TBT ou CLS.
2. Ordena as medidas por efeito face ao esforço. Indica em cada
   uma quantos pontos move de forma realista e porquê.
3. Indica as medidas do relatório que, com a minha forma de
   construção, praticamente não rendem nada – e fundamenta, em
   vez de as omitires.
4. Em cada ficheiro JavaScript grande, pergunta primeiro se ele é
   preciso, antes de propores reduzi-lo.
5. Chama a atenção se o CSS for entregue apenas parcialmente em
   linha, e explica porque é que isso pode ser pior para o CLS do
   que não o fazer de todo.
6. Indica o que devo voltar a medir depois de cada alteração.

Não inventes medições.

Conclusão

A pontuação em si não é o objetivo – é uma medição, não um resultado de negócio. O que conta é a experiência por trás: uma página legível ao fim de 1,4 segundos é lida por mais pessoas do que uma que demora seis. Em visitantes móveis por rede celular a diferença é maior do que qualquer otimização de texto.

O caminho até lá passou, no nosso caso, por uma única pergunta recorrente: precisamos disto? Cinco de seis intervenções consistiram em remover algo, não em acrescentar.

Perguntas frequentes

Como se chega a 100 pontos no PageSpeed Insights?

Na maioria dos sites, por três passos: remover ou substituir o maior ficheiro JavaScript, ligar de facto a compressão para CSS e JavaScript, e eliminar os saltos de layout. Formatos de imagem e localização do servidor raramente são o estrangulamento.

Qual a importância do tempo de carregamento para o posicionamento na Google?

É um fator confirmado, mas não forte – conteúdo e relevância pesam mais. O efeito maior é indireto: as páginas lentas são abandonadas com mais frequência, e esse comportamento entra na avaliação.

O que é o Cumulative Layout Shift e como se resolve?

É a medida dos elementos que mudam de posição depois da primeira renderização. Causas mais frequentes: imagens sem medidas fixas, folhas de estilos carregadas depois e fontes com métricas muito diferentes. Resolve-se fazendo com que o espaço esteja definido de antemão – com indicações de largura e altura ou uma proporção fixa.

Deve-se incorporar o CSS no HTML?

Em folhas de estilos pequenas sim, mas então por completo. Uma incorporação parcial com carregamento posterior do resto poupa um pedido e traz em troca saltos de layout, assim que falte uma regra da área visível. No nosso caso eram 7 KB comprimidos – aí a incorporação total compensa.

Quanto rende prescindir de bibliotecas?

No nosso caso foi a maior parcela isolada: 458 KB de biblioteca gráfica passaram a 6 KB de código próprio, mais 114 KB de biblioteca de animação reduzidos a zero. Se compensa depende de quanto da biblioteca se usa de facto – a medição indica o JavaScript não utilizado.

Marketing que se configura sozinho

A beta do Studio Engine está aberta. Reserve o seu lugar e participe desde o início.

Participar na beta →
← Voltar à lista