Front-end Performance
Introdução
Este é um tema muito importante porque impacta diretamente em como uma aplicação é apresentada para o usuário. Caso esse tema seja negligenciado, por mais que o seu site ou aplicação tenha um bom objetivo, ele pode acabar sofrendo com lentidão e utilização de recursos desnecessários, impactando o usuário final, que pode desistir de continuar na aplicação. Imagine um e-commerce onde as páginas de visualização de produtos carregam lentamente; com certeza você desistiria de continuar na aplicação.
A otimização de aplicações web é algo fundamental que, muitas das vezes, é negligenciado. A melhora de performance visa velocidade, capacidade de resposta, fluidez, economia de recursos e muito mais. São várias estratégias para minimizar o tempo de carregamento de páginas e reduzir a resposta de servidores, tornando o sistema muito mais atraente para o usuário final.
Existem várias formas de trabalhar com este tema. Trago aqui neste artigo algumas chaves que são muito relevantes para tornar a sua aplicação mais eficiente, com utilização mais inteligente de recursos e trazendo todos os benefícios de velocidade e confiabilidade para o usuário final.
Por que a Performance é Importante?
A otimização de performance impacta diretamente três aspectos cruciais de um sistema online:
-
Conversões: Uma pesquisa realizada pela empresa Unbounce indica que 70% dos clientes consideram a velocidade da página um fator decisivo em suas decisões de compra. Cada vez mais, as pessoas estão impacientes e querem um conteúdo mais rápido.
-
Visibilidade: Uma pesquisa realizada pela Backlinko demonstra que o algoritmo de PageRank do Google prioriza o desempenho do site em sua listagem. Para aparecer na primeira página, o site deve ter um tempo médio de carregamento de 1,65 segundos. Isso considera todo o carregamento da página inicial contendo assets, HTML, CSS e JavaScript. Conteúdo e ferramentas para isso são muito importantes.
-
Experiência do Usuário (UX): Um site mais rápido e responsivo melhora significativamente a satisfação e a confiança do cliente.
Métricas Essenciais de Performance
Para uma otimização efetiva, é crucial monitorar as seguintes métricas:
- Tempo de Carregamento da Página: Duração total para carregar todos os elementos da aplicação;
- Time to First Byte (TTFB): Tempo até o primeiro byte de dados ser recebido;
- Time to Interactive (TTI): Momento em que a página se torna totalmente interativa;
- First Contentful Paint (FCP): Tempo para renderizar o primeiro conteúdo;
- Largest Contentful Paint (LCP): Tempo para renderizar o maior elemento visível;
- Total Blocking Time (TBT): Tempo total em que a thread principal fica bloqueada;
- Número de Requisições HTTP: Quantidade total de solicitações ao servidor.
Técnicas Fundamentais de Otimização
Aqui listo algumas técnicas para tornar a aplicação mais eficiente, considerando a solução das métricas acima.
1. Gerenciamento eficiente de recursos
Lazy Loading
O Lazy Loading é uma técnica que permite o carregamento de partes que foram solicitadas de acordo com a interação do usuário, sem a necessidade de carregar todos os arquivos antes que estes sejam solicitados. Aplicações como React possuem recursos para atuar neste formato, melhorando consideravelmente o desempenho e a fluidez da aplicação.
- Detecção de viewport com Intersection Observer API;
- Priorização baseada em métricas de usuário;
- Placeholders otimizados durante o carregamento;
- Fallback gracioso para navegadores não suportados;
- Carregamento de arquivos baseado em rotas.
Code Splitting
Code splitting é a quebra do código em arquivos menores, melhorando o carregamento e evitando o bloqueio do download. Isso permite que a página seja carregada aos poucos, realizando o download de vários arquivos simultaneamente. A divisão de código deve seguir padrões específicos:
- Route-based splitting para carregamento por rota;
- Component-based splitting para elementos complexos;
- Vendor splitting para otimização de cache de dependências;
- Dynamic imports com prefetch para rotas prováveis.
2. Otimização de Assets
Imagens
A otimização de imagens possibilita o carregamento mais rápido e o uso de recursos da internet e da aplicação de forma mais eficiente. Grandes imagens são um problema para aplicações Web/Mobile e com simples alterações podemos ter grandes benefícios. Sempre considere o tratamento de imagens, seja para exibição na aplicação quanto para upload e armazenamento. É necessário também muito cuidado para a imagem não ficar distorcida ou ilegível. Qualidade e velocidade precisam caminhar juntas. Pontos relevantes para otimização de imagens:
- Formato adaptativo: WebP com fallback para formatos tradicionais;
- Art direction com
picture
element; - Densidade de pixels apropriada com
srcset
esizes
; - Compressão inteligente baseada em conteúdo visual;
- CDN com otimização automática e cache.
Minificação
Estratégias para redução de tamanho de arquivos:
- Tree shaking para remover código que não é utilizado;
- Compressão diferencial com Brotli ou outras ferramentas para este fim, como gzip;
- Análise de dependências e arquivos duplicados;
- Source maps otimizados para ambiente de produção;
- Estratégia para tornar o arquivo menor e mais eficiente para o browser.
3. Otimização de renderização de conteúdo
Critical Path Optimization
Otimização do caminho crítico de renderização:
- Identificação e priorização de CSS;
- Estratégias de carregamento assíncrono para recursos não-críticos/essenciais;
- Preconnect para domínios externos importantes;
- Resource hints (
preload
,prefetch
,preconnect
).
Prevenção de bloqueio de renderização
Existem vários formatos para evitar o bloqueio de renderização devido ao tamanho de arquivos, fetch em APIs e outros fatores:
- JavaScript assíncrono com priorização;
- Web fonts com
font-display: swap
; - Carregamento progressivo de componentes;
- Fallback para manter o usuário aguardando;
- Requisições em paralelo.
4. Performance em tempo de execução
Otimização do DOM
Algumas estratégias para otimizar o DOM podem obter ganhos significativos na aplicação:
- Virtualização para listas longas (imaginar renderizar 300 itens em um
li
, o sistema pode simplesmente travar); - Event delegation para melhor gestão de eventos;
- Debouncing e throttling de eventos frequentes;
- Reciclagem de elementos para animações suaves.
Gerenciamento de estado e memória
Práticas para aplicações escaláveis:
- Normalização de estado para evitar duplicação;
- Memoização inteligente de componentes e cálculos;
- Garbage collection otimizado;
- Monitoramento de memory leaks.
5. Infraestrutura e entrega
HTTP/2 e HTTP/3
Aproveitamento máximo dos protocolos modernos:
- Server push estratégico;
- Multiplexing otimizado;
- Priorização de streams;
- QUIC para conexões mais rápidas.
CDN e Edge Computing
Esse aqui é um ponto muito importante e pouco explorado. Muitas aplicações simplesmente mal fazem o uso desse recurso com eficiência:
- Multi-CDN para redundância e performance;
- Edge caching com invalidação seletiva;
- Edge functions para processamento próximo ao usuário;
- Otimização geográfica de rotas.
Monitoramento e análise
Métricas essenciais
Acompanhamento contínuo de:
- Core Web Vitals (LCP, FID, CLS);
- Time to Interactive (TTI);
- First Contentful Paint (FCP);
- Time to First Byte (TTFB).
Ferramentas de análise
Conjunto de ferramentas recomendadas:
- Lighthouse: Integrado ao Chrome, permite registrar e analisar o desempenho de carregamento e tempo de execução da página, fornecendo insights detalhados sobre o comportamento do site.
- WebPageTest: Ferramenta de código aberto para medir e analisar o desempenho de páginas da web em dispositivos reais. Permite escolher diferentes locais e navegadores para testes abrangentes.
- Real User Monitoring (RUM): Abordagem para capturar métricas de desempenho a partir das interações reais dos usuários com seu site, fornecendo dados precisos sobre a experiência do usuário.
Considerações Finais
Este é um tema muito importante e também difícil de ser aplicado. Criar aplicações web não é uma tarefa complexa; várias pessoas iniciantes conseguem e estão criando seus próprios sistemas. Agora, criar um sistema bem feito e que de fato escale é o grande desafio aqui.
A otimização de performance é um processo contínuo que requer atenção constante e adaptação às novas tecnologias e padrões web. Para cada biblioteca/framework, podem existir outros formatos que ajudam neste tema, como é o caso de Hooks e exploração de SSR e Lazy Loading com React.
O sucesso na implementação dessas técnicas depende de vários fatores, como citado aqui. Existem muitos outros, mas vale a pena um resumo dos principais:
- Monitoramento consistente
- Testes frequentes em diferentes dispositivos e condições de rede
- Análise de métricas reais de usuários
- Atualização constante com as melhores práticas do mercado
Espero que este material ajude a ter uma ideia inicial do quão rico e importante é este tema. Existem várias outras técnicas e possibilidades para melhorar o desempenho de uma aplicação, sempre pensando nas necessidades do usuário, do projeto e no fim para o qual ele foi criado.
Caso tenha interesse em um tema de performance e otimização específico para React, eu preparei um capítulo exclusivo sobre este tema no meu livro
Referências:
- https://developer.mozilla.org/en-US/docs/Web/Performance
- https://www.shopify.com/enterprise/blog/web-performance-optimization
- https://medium.com/@developer.minhaj/front-end-performance-optimization-key-techniques-for-faster-web-applications-7632fe2e821a
- https://unbounce.com/page-speed-report
- https://backlinko.com/search-engine-ranking