11 boas práticas de performance em Node.js para 2025
Performance em Node.js vai além de frameworks. Neste guia, mostramos 11 boas práticas para turbinar sua aplicação com clustering, gzip, async, cache e métricas. Ideal para devs que querem apps rápidos e estáveis.
Performance em Node.js vai além de frameworks. Neste guia, mostramos 11 boas práticas para turbinar sua aplicação com clustering, gzip, async, cache e métricas. Ideal para devs que querem apps rápidos e estáveis.
Performance em Node.js não é sobre escolher o framework mais rápido, mas sobre entender o event loop e evitar gargalos. Aplicar boas práticas de performance em Node.js reduz latência, melhora a taxa de transferência e evita picos de CPU. Abaixo, 11 práticas testadas em produção, ordenadas do maior impacto ao menor.
- Use clustering para aproveitar múltiplos CPUs
Node.js roda em uma thread por padrão. Para servidores com vários núcleos, o módulo cluster cria workers que dividem a carga. Sem clustering, sua aplicação usa apenas um núcleo, deixando os outros ociosos. O PM2 pode gerenciar clusters automaticamente com pm2 start app.js -i max.
- Ative compressão gzip
Dados de resposta ocupam largura de banda. Com o middleware compression no Express, o payload é reduzido em até 70%, acelerando o carregamento para o cliente. Em APIs REST, isso reduz o tempo de resposta em redes lentas.
- Prefira operações assíncronas
O event loop é bloqueado por código síncrono. Use async/await ou Promises para I/O, como leitura de arquivos ou consultas a banco. Funções síncronas como fs.readFileSync devem ser evitadas em produção, pois travam o loop para todos os usuários.
- Implemente cache em memória ou Redis
Consultas repetidas ao banco ou cálculos pesados podem ser cacheados. Use node-cache para dados simples ou Redis para cenários distribuídos. Cache reduz a latência média e a carga no banco, especialmente em endpoints de leitura.
- Evite bloqueios no event loop
Código síncrono pesado (como loops com for que processam arrays grandes) bloqueia o event loop. Divida tarefas em chunks com setImmediate() ou use workers threads para CPU-bound. Medir com perf_hooks ajuda a identificar esses bloqueios.
- Gerencie processos com PM2
PM2 mantém a aplicação ativa após crashes, faz reload sem downtime e fornece métricas de CPU/memória. Com pm2 monit, você vê o consumo em tempo real. Sem ele, uma exceção não tratada derruba o servidor.
- Meça com as APIs de performance do Node.js
O módulo perf_hooks expõe métricas como duração de funções e tempo de event loop. Use performance.now() para benchmarks e PerformanceObserver para monitorar eventos. Isso substitui ferramentas externas e dá dados precisos.
- Otimize queries de banco de dados
Cada query custa I/O. Use índices, evite SELECT *, e limite resultados com LIMIT/OFFSET. Em MongoDB, agregue com pipeline; em SQL, use joins bem planejados. Um banco lento é o gargalo mais comum em apps Node.js.
- Use HTTP/2 para multiplexação
HTTP/2 permite múltiplas requisições simultâneas na mesma conexão, reduzindo latência. O módulo http2 do Node.js já suporta isso nativamente. Para apps com muitos assets ou chamadas concorrentes, o ganho é perceptível.
- Reduza dependências e tamanho de pacotes
Cada dependência adiciona tempo de carregamento e memória. Use ferramentas como npm-check para remover pacotes não usados e bundlephobia para avaliar o peso. Um node_modules enxuto acelera o startup e reduz o uso de RAM.
- Configure timeouts em servidores e clientes
Requisições lentas ou travadas consomem recursos. Defina timeouts no servidor (server.timeout) e em clientes HTTP (como axios). Sem timeout, conexões pendentes acumulam memória e podem derrubar o servidor.
Fechamento prático: comece com clustering e compressão, que dão ganho imediato. Depois, implemente cache e meça com perf_hooks para identificar gargalos. Nem toda prática se aplica ao seu caso, avalie o perfil de carga e priorize o que reduz latência para seus usuários.
FAQ
O que mais afeta a performance em Node.js?
Bloqueios no event loop, operações síncronas e queries de banco não otimizadas são os principais vilões. O event loop é single-threaded, então qualquer tarefa pesada síncrona paralisa a aplicação.
Como medir performance em Node.js?
Use o módulo perf_hooks nativo para medir tempo de execução de funções e monitorar o event loop. Ferramentas como clinic.js e PM2 também oferecem métricas de CPU e memória.
Clustering sempre melhora a performance?
Sim, em servidores com múltiplos núcleos. Sem clustering, apenas um núcleo é usado. Em ambientes com um único CPU, o ganho é marginal, mas ainda evita que um crash derrube o serviço.
Cache em memória vs Redis: qual usar?
Cache em memória (ex.: node-cache) é mais rápido para dados pequenos e aplicações single-instance. Redis é melhor para dados compartilhados entre múltiplas instâncias ou quando você precisa de persistência.
HTTP/2 é compatível com todos os browsers?
Sim, todos os browsers modernos suportam HTTP/2. O Node.js tem suporte nativo via módulo http2. A migração é transparente para o cliente, mas exige HTTPS.
Gzip comprime tudo automaticamente?
Não, apenas respostas com cabeçalho Content-Type textuais (JSON, HTML, CSS). Arquivos binários como imagens já são comprimidos e o gzip pode até aumentar o tamanho.
Ivan Krause Montenegro
Editor de Desenvolvimento e Software
Programador de carreira, escreve sobre código e dev para quem programa de verdade.
Ver todos os artigos →