Um site que antes carregava bem agora parece lento. A primeira tela demora alguns segundos e os cliques respondem com atraso.
"De repente" significa que algo mudou recentemente — geralmente uma imagem grande foi adicionada, os dados se acumularam, um projeto no plano gratuito dormiu ou um script de terceiros foi acoplado. Abaixo está um checklist causa por causa.
Não existe uma solução mágica única. O motivo varia de site para site. Este guia ajuda você a isolar o culpado. Meça primeiro (Passo 0) e corrija apenas a causa correspondente.
Passo 0. Diagnostique em 30 segundos — descubra onde está a lentidão
Meça antes de chutar.
- Acesse https://pagespeed.web.dev/, cole a URL do seu site e clique em Analyze.
- Observe o LCP (Largest Contentful Paint): 2,5 s ou menos é bom, acima de 4,0 s é ruim (limites do web.dev).
- A lista de Opportunities / Diagnostics aponta problemas concretos — "properly size images", "reduce unused JavaScript". Esses são seus suspeitos.
Tem o Chrome? F12 → aba Lighthouse → Analyze page load dá o mesmo relatório. Sem instalar nada.
Causa 1. As imagens são grandes demais (o mais comum)
Você sobe uma foto de 4 MB do celular do jeito que está e essa única imagem derruba a página inteira. Se o Passo 0 apontou as imagens, comece por aqui.
Em um site Next.js, basta trocar <img> pelo Image do next/image para otimizar automaticamente o tamanho, a qualidade e o formato (WebP/AVIF). Imagens fora da tela usam lazy-load por padrão, e adicionar width/height reserva o espaço para o layout não pular.
import Image from 'next/image'
<Image src="/hero.png" width={1200} height={630} alt="Hero image" priority />
- Adicione
priorityapenas na imagem hero do topo para ela carregar primeiro (renomeado parapreloadno Next.js 16). - Todas as outras imagens usam lazy-load automaticamente, sem nenhuma opção extra.
Usa uma ferramenta de IA para programar (Cursor, Lovable, v0)? Diga a ela: "Substitua toda tag <img> pelo componente Image do next/image e adicione priority somente na imagem hero do topo."
Não usa Next.js? O princípio é o mesmo: comprima as imagens (por exemplo, com o squoosh.app) e converta para WebP antes de subir.
Causa 2. Os dados se acumularam e o banco varre a tabela inteira
Se no começo era rápido mas ficou lento quando os posts/usuários/pedidos chegaram aos milhares, o provável culpado são consultas sem índice. Sem um índice, o banco lê a tabela de cima a baixo a cada requisição (um full scan).
Solução no Supabase (Postgres):
- Painel do Supabase → Advisors → Query Performance (ou Reports → Query Performance) para ver as consultas lentas e as colunas pelas quais elas filtram.
- Adicione um índice nas colunas pelas quais você filtra ou ordena com frequência. No SQL Editor:
create index idx_posts_user_id on posts (user_id);
- Se a tabela já estiver grande em produção, adicione
concurrentlypara não travar a tabela para escritas:
create index concurrently idx_posts_created_at on posts (created_at);
O Supabase também tem um Index Advisor que recomenda quais índices adicionar (Query Performance → escolha uma consulta → aba Indexes). Leia a sugestão e depois execute você mesmo o SQL acima.
Causa 3. Um projeto no plano gratuito dormiu (só a primeira requisição é lenta)
"Só o primeiro carregamento depois de um tempo é lento, depois fica normal" → isso é um sinal de sono / cold start.
- O plano Free do Supabase pode pausar um projeto após cerca de 7 dias de baixa atividade. Uma vez pausado, a primeira requisição que o acorda é lenta ou falha; use Restore no painel para reativar o projeto.
- Funções serverless (Vercel, etc.) também demoram no cold start quando ficam um tempo sem serem chamadas.
O que fazer: para um serviço de pouco tráfego, acesse-o periodicamente para mantê-lo acordado, ou migre para um plano pago sempre ativo se você tiver tráfego de verdade. Saber que "a primeira requisição lenta de vez em quando" é o sono normal do plano gratuito — e não um bug — evita que você cace fantasmas.
Causa 4. Um script pesado ou widget de terceiros bloqueia a renderização
Se você adicionou recentemente um widget de chat, anúncios, analytics, web fonts ou um embed do YouTube, isso pode estar bloqueando sua primeira renderização. O web.dev observa que scripts síncronos e CSS que bloqueia a renderização no <head> atrasam a renderização.
- Adie scripts externos não essenciais com
async/defer, ou carregue-os no final da página. - Os scripts listados em "Reduce the impact of third-party code" do PageSpeed são suspeitos de primeira. Remova um de cada vez para achar o responsável.
Ainda travado?
- Cole os 3 principais achados do seu relatório do PageSpeed do Passo 0 direto na sua ferramenta de IA e peça para corrigi-los. Os achados do Lighthouse são específicos o suficiente para servir de instruções prontas.
- Lembre quando ficou lento e o que você mudou naquele momento — reverter o deploy/commit recente costuma ser o caminho mais rápido.
De novo: isto é um checklist para isolar o culpado, não um conserto de uma linha. Siga na ordem — meça (Passo 0) e aplique apenas a causa correspondente.
