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.
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.
O ponto de partida
| Medição (móvel) | antes | depois |
|---|---|---|
| Desempenho | 58 | 98 |
| Acessibilidade | 95 | 100 |
| Primeira renderização | 6,1 s | 1,4 s |
| Maior elemento visível | 11,1 s | 2,1 s |
| Total transferido | 298 KB | 184 KB |
| dos quais JavaScript | 121 KB | 5 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.
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
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.
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
- Medir antes de mudar seja o que for. Móvel e computador em separado, anotando os valores.
- Procurar o maior ficheiro transferido. É quase sempre JavaScript. A questão não é como reduzi-lo, é se é preciso.
- Verificar a compressão. Não se está ligada, mas para que tipos de ficheiro.
- Contar os pedidos bloqueantes. Cada folha de estilos no cabeçalho atrasa a primeira renderização.
- Verificar saltos de layout sem travagem. O teste que nos faltou.
- Medir de novo depois de cada alteração. Senão, no fim não se sabe o que fez efeito.
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 →