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.
