Guia completo de Astro SSR: ative a renderização no servidor em 3 passos

Seu blog em Astro está voando, com uma pontuação Lighthouse acima de 95, e você está satisfeito até que alguém pede: “Vamos adicionar login de usuários”. Nesse momento surge a dúvida: como implementar login em um site estático? Ao abrir a documentação oficial, você encontra uma avalanche de conceitos como SSR, SSG, Hybrid e adapter, e tudo parece cada vez mais confuso.
Foi exatamente assim quando tive meu primeiro contato com Astro SSR. Afinal, o principal atrativo do Astro é a velocidade. Adicionar renderização no servidor não deixaria o site mais lento? Entre tantos adaptadores para Vercel, Netlify e Node.js, qual escolher? E o que significam opções como output e prerender no arquivo de configuração?
Na verdade, configurar Astro SSR não é tão complicado quanto parece. Neste artigo, vou explicar da forma mais direta possível quando SSR é realmente necessário — em vez de continuar usando SSG —, como configurar rapidamente diferentes adaptadores e como combinar SSR e SSG em um mesmo projeto com o modo Hybrid. Ao final, você conseguirá decidir se seu projeto precisa de SSR e fazer a configuração em 30 minutos.
Capítulo 1: conceitos básicos de SSR e escolha técnica
Quando usar SSR em vez de SSG?
Comece com o critério mais simples: o conteúdo já está definido no momento do build ou pode mudar a cada acesso?
SSG (Static Site Generation, ou geração de site estático) é como um prato feito preparado com antecedência. O cozinheiro deixa tudo pronto pela manhã e, quando o cliente chega, basta servir: é muito rápido. Posts de blog, páginas de produto e a página Sobre quase não mudam, por isso SSG funciona perfeitamente nesses casos.
SSR (Server-Side Rendering, ou renderização no servidor) é como um prato preparado na hora. O cliente faz o pedido e o cozinheiro prepara a refeição conforme a necessidade dele. Uma mensagem como “Bem-vindo de volta, João” depois do login, a cotação de uma ação em tempo real ou a quantidade de itens no carrinho variam de pessoa para pessoa e exigem SSR.
Talvez você ainda esteja se perguntando se seu projeto realmente precisa de SSR. Se uma destas cinco situações fizer parte dele, vale considerar essa opção:
1. Autenticação de usuários e conteúdo personalizado
O exemplo mais comum é o login. Não há como saber durante o build quem entrará no sistema nem qual nome deve aparecer. Em uma plataforma de cursos que desenvolvi, por exemplo, a página inicial precisava mostrar “Continue aprendendo: aula 5”. Isso exige SSR para gerar o conteúdo dinamicamente conforme o progresso do usuário conectado.
2. Exibição de dados em tempo real
Previsão do tempo, cotações e placares esportivos mudam a cada minuto. Não faz sentido reconstruir o site a cada minuto. Com SSR, os dados mais recentes são buscados sempre que o usuário acessa a página.
3. Consultas ao banco de dados
Em uma pesquisa de produtos de e-commerce, cada termo produz resultados diferentes. É impossível gerar antecipadamente páginas para todas as pesquisas possíveis. Com SSR, o banco de dados é consultado em tempo real quando o usuário pesquisa e os resultados são retornados.
4. Rotas de API
Envio de formulários, upload de arquivos e chamadas a APIs de terceiros exigem lógica de backend. O modo SSR do Astro permite criar rotas de API em src/pages/api/xxx.js, sem a necessidade de montar um servidor de backend separado.
5. Testes A/B e recomendações personalizadas
É possível exibir conteúdo diferente conforme a localização, o horário de acesso ou o comportamento anterior do usuário. Na página inicial de um e-commerce como o Taobao, por exemplo, cada pessoa vê produtos recomendados diferentes. Esse tipo de personalização exige SSR.
Nesse ponto, alguém pode perguntar: “Posso usar SSR na página de um post do blog?”. Pode, mas não é necessário. O conteúdo do post é fixo; com SSG, um HTML estático é gerado e servido diretamente pela CDN, o que oferece mais velocidade e menor custo de servidor. SSR não resolve tudo, portanto não o use apenas por usar.
Modo Hybrid: o melhor dos dois mundos
O modo Hybrid introduzido no Astro 2.0 foi uma ideia inteligente: no mesmo projeto, páginas estáticas usam SSG e páginas dinâmicas usam SSR. Em um e-commerce, por exemplo:
- Página inicial, página Sobre e documentação de ajuda → SSG (carregamento rápido)
- Página de login, área do usuário e carrinho → SSR (conteúdo dinâmico)
- Página de detalhes do produto → SSG (conteúdo fixo)
- Página de resultados de pesquisa → SSR (consulta em tempo real)
Com essa configuração, a velocidade das páginas estáticas não é afetada, enquanto os recursos dinâmicos funcionam normalmente. Um amigo usa exatamente essa estratégia em seu blog: a listagem e os posts usam SSG, a área de comentários usa SSR e a pontuação Lighthouse continua acima de 95.
Capítulo 2: primeiros passos — ative o modo SSR em 3 etapas
Configurando Astro SSR do zero com o adaptador Node.js
Depois de confirmar que o projeto precisa de SSR, podemos começar a configuração. Primeiro, vou demonstrar com o adaptador Node.js, a opção mais genérica para servidores próprios ou implantação em VPS.
Primeiro passo: instale o adaptador com um comando
O Astro oferece um comando oficial de configuração automática muito simples. Execute-o na raiz do projeto:
npx astro add node
Esse comando faz três coisas automaticamente:
- Instala o pacote
@astrojs/node - Altera o arquivo de configuração
astro.config.mjs - Atualiza as dependências do
package.json
Ao final, o terminal exibirá uma série de marcas verdes, indicando que a configuração foi concluída. Se preferir instalar manualmente, por exemplo para escolher uma versão específica, use:
npm install @astrojs/node
Em seguida, altere o arquivo de configuração manualmente, como veremos no próximo passo.
Segundo passo: altere o arquivo de configuração
Abra astro.config.mjs na raiz do projeto. Se você usou o comando de configuração automática, o arquivo já terá este conteúdo:
// astro.config.mjs
import { defineConfig } from 'astro/config';
import node from '@astrojs/node';
export default defineConfig({
output: 'server', // Ativa o modo SSR
adapter: node({
mode: 'standalone' // Modo de servidor independente
}),
});
Veja o que significam essas duas opções:
Configuração de output:
'static'(padrão): todas as páginas usam SSG e geram HTML estático'server': todas as páginas usam SSR e são geradas dinamicamente a cada solicitação'hybrid': SSG por padrão, com SSR ativado por página (recomendado!)
Configuração de mode:
'standalone': o Astro inicia um servidor Node.js independente, indicado para implantação direta'middleware': gera um middleware que pode ser integrado a frameworks como Express e Koa
Eu geralmente uso standalone, porque o servidor incluído no Astro já é suficiente e dispensa integrações adicionais. Se o projeto já tiver um backend Express e você quiser incorporar o Astro a ele, use middleware.
Terceiro passo: faça o build e execute
Depois de concluir a configuração, faça o build do projeto:
npm run build
Após o build, você verá uma nova pasta server/ dentro de dist/, com o arquivo entry.mjs. Esse é o ponto de entrada do servidor SSR.
Inicie o servidor SSR:
node ./dist/server/entry.mjs
Por padrão, o serviço será iniciado em http://localhost:4321. Ao acessar o site, todas as páginas estarão usando SSR.
Depuração no ambiente de desenvolvimento
Durante o desenvolvimento, não é preciso fazer um novo build a cada alteração. Basta executar:
npm run dev
O servidor de desenvolvimento oferece suporte automático a SSR e aplica as alterações em tempo real.
Solução de problemas comuns
-
Porta ocupada: se a porta 4321 já estiver em uso, defina outra por meio de uma variável de ambiente:
PORT=3000 node ./dist/server/entry.mjs -
Módulo do adaptador não encontrado: confirme se
@astrojs/nodeestá instalado e executenpm installpara reinstalar as dependências -
Página 404: verifique se os arquivos em
src/pages/estão corretos; o modo SSR continua seguindo as regras de roteamento do Astro
Configurar SSR é realmente simples. Na primeira vez que fiz isso, levei menos de cinco minutos do início até o servidor funcionar. Se você implanta na Vercel ou na Netlify, os adaptadores específicos tornam o processo ainda mais simples, como veremos no próximo capítulo.
Capítulo 3: configuração dos principais adaptadores
Como escolher entre Vercel, Netlify e Cloudflare?
Se o projeto está hospedado na Vercel, Netlify ou Cloudflare, configurar SSR é ainda mais fácil. Essas plataformas têm adaptadores dedicados mantidos oficialmente pelo Astro e permitem implantação sem configuração adicional.
Adaptador da Vercel — referência em funções serverless
A Vercel é a plataforma de implantação que mais uso. A franquia gratuita é suficiente para projetos pessoais e a configuração é muito simples:
npx astro add vercel
Esse comando configura tudo automaticamente. O arquivo de configuração fica assim:
// astro.config.mjs
import { defineConfig } from 'astro/config';
import vercel from '@astrojs/vercel/serverless';
export default defineConfig({
output: 'server',
adapter: vercel(),
});
Recurso especial da Vercel: ISR (regeneração estática incremental)
Esse recurso exclusivo da Vercel pode deixar páginas SSR tão rápidas quanto páginas SSG. Em termos simples, a página é gerada com SSR no primeiro acesso e armazenada em cache por um período. Os acessos seguintes usam o cache, e a página é gerada novamente quando ele expira.
adapter: vercel({
isr: {
expiration: 60, // Cache de 60 segundos
},
}),
Em um site de notícias, por exemplo, pode ser suficiente atualizar uma página de artigo uma vez por minuto, em vez de consultar o banco de dados a cada solicitação. Com ISR, você combina a flexibilidade do SSR e a velocidade do SSG.
Processo de implantação na Vercel:
- Configure o adaptador
- Envie o código para o GitHub
- Importe o projeto no painel da Vercel
- Comando de build:
npm run build(detectado automaticamente) - Clique para implantar e pronto
Adaptador da Netlify — especialista em Edge Functions
A Netlify também é uma plataforma de implantação popular, especialmente para sites estáticos que incluem recursos dinâmicos.
npx astro add netlify
Arquivo de configuração:
// astro.config.mjs
import { defineConfig } from 'astro/config';
import netlify from '@astrojs/netlify';
export default defineConfig({
output: 'server',
adapter: netlify({
edgeMiddleware: true, // Ativa o middleware de borda
}),
});
O que é edgeMiddleware?
Em termos simples, ele executa a lógica de middleware, como autenticação e redirecionamentos, em nós de borda para reduzir o tempo de resposta. Isso é útil quando o site tem recursos relacionados à localização, como exibir idiomas diferentes conforme a região do usuário.
Configuração de redirecionamentos na Netlify
Uma facilidade da Netlify é o processamento automático de redirecionamentos. Para redirecionar /old-page para /new-page, crie um arquivo _redirects na raiz do projeto:
/old-page /new-page 301
O redirecionamento entra em vigor automaticamente após a implantação, sem alterações no código.
Adaptador da Cloudflare — aceleração por CDN global
Se seus usuários estão espalhados pelo mundo, a Cloudflare é uma excelente escolha. Seus Workers são executados em mais de 300 data centers no mundo inteiro, com latência muito baixa.
npx astro add cloudflare
Arquivo de configuração:
// astro.config.mjs
import { defineConfig } from 'astro/config';
import cloudflare from '@astrojs/cloudflare';
export default defineConfig({
output: 'server',
adapter: cloudflare(),
});
Limitações da Cloudflare
Vale lembrar que o ambiente do Cloudflare Workers não é idêntico ao Node.js. Algumas APIs do Node.js, como o sistema de arquivos fs, não estão disponíveis. Se o projeto depende dessas APIs, a Cloudflare talvez não seja adequada.
Comparação entre adaptadores
| Adaptador | Cenário indicado | Principal vantagem | Principal limitação |
|---|---|---|---|
| Node.js | Servidor próprio, VPS | Controle total, sem restrições | Exige operação própria e tem custo maior |
| Vercel | Projetos pessoais, equipes pequenas | Configuração mínima e suporte a ISR | Franquia gratuita limitada a 100 GB de banda por mês |
| Netlify | Site estático com recursos dinâmicos | Edge Functions rápidas | Limite de build de 300 minutos por mês no plano gratuito |
| Cloudflare | Usuários globais e baixa latência | Computação de borda e preço baixo | Limitações do ambiente Workers; algumas APIs do Node não funcionam |
Minha recomendação:
- Blogs e documentação: priorize Vercel ou Netlify; a franquia gratuita costuma ser suficiente e a implantação é simples
- E-commerce e aplicações SaaS: Vercel, aproveitando ISR, ou um servidor Node.js próprio para ter controle total
- Produtos internacionais: Cloudflare, pela aceleração global
- Projetos corporativos: servidor Node.js próprio, por privacidade de dados e controle total
Não existe uma escolha absolutamente certa. Tudo depende das necessidades e do orçamento do projeto. Uso a Vercel no meu blog e servidores próprios nos sites corporativos de clientes; as duas opções funcionam bem em seus respectivos cenários.
Capítulo 4: modo Hybrid na prática
Use SSR e SSG no mesmo projeto
Até aqui vimos a configuração de um projeto totalmente SSR. Agora chegamos ao ponto principal: o modo Hybrid. Esse é o grande diferencial do Astro, pois permite combinar a velocidade do SSG com a flexibilidade do SSR no mesmo projeto.
Configure o modo Hybrid
Basta alterar output para 'hybrid':
// astro.config.mjs
import { defineConfig } from 'astro/config';
import node from '@astrojs/node';
export default defineConfig({
output: 'hybrid', // SSG por padrão, SSR quando necessário
adapter: node(),
});
Depois dessa configuração, todas as páginas usam SSG por padrão. Para ativar SSR em uma página específica, basta adicionar uma linha de código nela.
Controle a renderização em cada página
Como fazer uma página usar SSR? Adicione esta linha ao frontmatter do arquivo:
// src/pages/dashboard.astro (SSR)
---
export const prerender = false; // Desativa a pré-renderização e usa SSR
const user = Astro.cookies.get('user');
---
<h1>Bem-vindo de volta, {user?.name}</h1>
<p>Você tem {user?.notifications} notificações não lidas</p>
É só isso. prerender = false significa: “Não gere esta página durante o build; gere-a dinamicamente quando o usuário acessar”.
No caminho inverso, se output estiver definido como 'server', o que torna todas as páginas SSR, faça uma página usar SSG desta forma:
// src/pages/about.astro (SSG)
---
export const prerender = true; // Força a geração durante o build
---
<h1>Sobre nós</h1>
<p>O conteúdo desta página não muda. Ela é gerada antecipadamente e carrega muito rápido.</p>
Resumo importante para não confundir:
| Configuração de output | Comportamento padrão | Como alterar uma página específica |
|---|---|---|
'hybrid' | Todas as páginas usam SSG | export const prerender = false → essa página usa SSR |
'server' | Todas as páginas usam SSR | export const prerender = true → essa página usa SSG |
No começo, eu sempre invertia os dois. Depois gravei a regra: Hybrid prioriza SSG; server prioriza SSR.
Exemplo prático: blog com sistema de usuários
Imagine uma plataforma de blog com publicação de artigos e login de usuários. A configuração ideal seria:
Estrutura do projeto:
src/pages/
├── index.astro // Página inicial (SSG)
├── about.astro // Página Sobre (SSG)
├── blog/
│ ├── [slug].astro // Detalhes do post (SSG)
│ └── index.astro // Lista de posts (SSG)
├── login.astro // Página de login (SSR)
├── dashboard.astro // Área do usuário (SSR)
└── api/
└── comments.js // API de comentários (SSR)
Arquivo de configuração:
// astro.config.mjs
export default defineConfig({
output: 'hybrid', // SSG por padrão
adapter: vercel(), // Implantação na Vercel
});
Página estática, sem configuração especial:
// src/pages/blog/[slug].astro
---
// Sem configuração de prerender, o padrão é SSG
import { getCollection } from 'astro:content';
export async function getStaticPaths() {
const posts = await getCollection('blog');
return posts.map(post => ({
params: { slug: post.slug },
props: { post },
}));
}
const { post } = Astro.props;
---
<article>
<h1>{post.data.title}</h1>
<div set:html={post.body} />
</article>
Página dinâmica, com SSR:
// src/pages/dashboard.astro
---
export const prerender = false; // Ativa SSR
// Verifica se o usuário está conectado
const token = Astro.cookies.get('token')?.value;
if (!token) {
return Astro.redirect('/login');
}
// Busca as informações do usuário no banco de dados
const user = await fetch(`https://api.example.com/user`, {
headers: { Authorization: `Bearer ${token}` }
}).then(res => res.json());
---
<div>
<h1>Olá, {user.name}</h1>
<p>E-mail: {user.email}</p>
<p>Último acesso: {user.lastLogin}</p>
</div>
Rota de API, que usa SSR automaticamente:
// src/pages/api/comments.js
export async function POST({ request }) {
const { articleId, content } = await request.json();
// Salva o comentário no banco de dados
await db.comments.insert({
articleId,
content,
createdAt: new Date(),
});
return new Response(JSON.stringify({ success: true }), {
status: 200,
headers: { 'Content-Type': 'application/json' }
});
}
export async function GET({ url }) {
const articleId = url.searchParams.get('articleId');
// Lê os comentários do banco de dados
const comments = await db.comments.findMany({
where: { articleId },
orderBy: { createdAt: 'desc' }
});
return new Response(JSON.stringify(comments), {
headers: { 'Content-Type': 'application/json' }
});
}
Benefícios dessa configuração:
- As páginas estáticas, como posts e página inicial, continuam extremamente rápidas, com pontuação Lighthouse acima de 95 e conteúdo servido pela CDN
- Páginas dinâmicas, como a área do usuário, buscam dados em tempo real, e cada pessoa vê seu próprio conteúdo
- Rotas de API oferecem recursos de backend sem a necessidade de montar um servidor separado
- O tempo de build é curto, pois somente as páginas estáticas precisam ser pré-renderizadas; as páginas dinâmicas não aumentam o build
Em um projeto que desenvolvi, com 50 posts e um sistema de usuários, o build levou apenas 20 segundos. Depois da implantação, as páginas estáticas abriam instantaneamente e as dinâmicas respondiam em menos de 100 ms. O modo Hybrid é realmente uma boa prática.
Capítulo 5: problemas comuns e boas práticas
Armadilhas na configuração de SSR e como resolvê-las
Enfrentei vários problemas ao configurar SSR. A seguir, reuni os mais comuns e suas soluções para ajudar você a evitá-los.
Problema 1: erro Astro.clientAddress is only available when using output: 'server'
Causa: o código usa Astro.clientAddress para obter o IP do usuário, mas output ainda está definido como 'static'.
Solução:
// astro.config.mjs
export default defineConfig({
output: 'server', // Ou 'hybrid'
adapter: node(),
});
APIs dinâmicas como Astro.clientAddress, Astro.cookies e Astro.redirect() só podem ser usadas no modo SSR.
Problema 2: página 404 após a implantação, embora funcione localmente
Causa: o adaptador está configurado incorretamente, ou o comando de build e o diretório de saída da plataforma estão errados.
Solução:
Implantação na Vercel:
- Comando de build:
npm run build - Diretório de saída:
.vercel/output(automático) - Não configure rotas manualmente em
vercel.json; deixe o Astro cuidar delas
Implantação na Netlify:
- Comando de build:
npm run build - Diretório de publicação:
distpara conteúdo estático ou.netlifypara SSR - Se o erro 404 continuar, verifique
netlify.toml:[build] command = "npm run build" publish = "dist"
Problema 3: página SSR demora mais de dois segundos para carregar
Causa: o servidor não tem desempenho suficiente, ou a consulta ao banco de dados está lenta.
Solução:
-
Use cache:
// src/pages/api/news.js export async function GET() { const cached = await redis.get('news'); if (cached) { return new Response(cached, { headers: { 'Content-Type': 'application/json', 'Cache-Control': 'public, max-age=60' // Cache de 60 segundos } }); } const news = await fetchNewsFromDB(); await redis.set('news', JSON.stringify(news), 'EX', 60); return new Response(JSON.stringify(news), { headers: { 'Content-Type': 'application/json', 'Cache-Control': 'public, max-age=60' } }); } -
Otimize as consultas ao banco de dados:
- Adicione índices
- Reduza o número de JOINs
- Consulte apenas os campos necessários
-
Considere ISR, se estiver usando Vercel:
adapter: vercel({ isr: { expiration: 300 } // Cache de 5 minutos }),
Problema 4: variáveis de ambiente não estão disponíveis no cliente
Causa: no Astro, há uma diferença entre variáveis de ambiente do cliente e do servidor.
Solução:
No servidor, em páginas SSR e rotas de API:
const secret = import.meta.env.SECRET_KEY; // Qualquer variável de ambiente pode ser usada
No cliente, no JavaScript executado no navegador:
const apiUrl = import.meta.env.PUBLIC_API_URL; // O nome deve começar com PUBLIC_
Configuração do arquivo .env:
SECRET_KEY=abc123 # Disponível somente no servidor
PUBLIC_API_URL=https://api.example.com # Disponível no cliente e no servidor
Problema 5: erro adapter.setApp is not a function
Causa: as versões do Astro e do adaptador são incompatíveis.
Solução:
# Atualize para as versões mais recentes
npm update astro @astrojs/node
# Ou instale versões compatíveis, conforme a documentação oficial
npm install astro@latest @astrojs/node@latest
Em geral, manter o Astro e o adaptador nas versões mais recentes evita esse problema.
Resumo de boas práticas
- Use o modo Hybrid como padrão: a menos que todas as páginas precisem de SSR,
output: 'hybrid'é a melhor opção - Ative SSR apenas quando necessário: defina
prerender = falsesomente nas páginas que realmente exigem renderização dinâmica - Sirva recursos estáticos pela CDN: coloque imagens e arquivos CSS e JS no diretório
public/para que sejam entregues pela CDN sem passar pelo SSR - Defina uma estratégia de cache: para conteúdo dinâmico que muda pouco, como uma lista de notícias, use cache ou ISR para reduzir a carga do servidor
- Separe as variáveis de ambiente: use variáveis do servidor para informações confidenciais e o prefixo
PUBLIC_para configurações públicas - Monitore o desempenho: use Vercel Analytics ou Google Analytics para acompanhar o tempo de resposta das páginas SSR e otimizá-las quando necessário
Conclusão
Depois de tudo isso, a ideia central cabe em três frases:
1. SSR não resolve tudo; use-o apenas quando necessário
Não adote SSR por empolgação nem trate SSG como ultrapassado. Use SSG em páginas estáticas e SSR em páginas dinâmicas. Para a maioria dos projetos, o modo Hybrid é o mais adequado. Já vi alguém migrar um blog inteiro para SSR e acabar com um desempenho pior; como o conteúdo dos posts não muda, SSG com CDN certamente é mais rápido.
2. Escolha o adaptador conforme a plataforma; a configuração é simples
Se você usa Vercel, Netlify ou Cloudflare, basta executar npx astro add [platform]. Em um servidor próprio, npx astro add node também leva poucos minutos. Não se assuste com a documentação: na prática, a configuração é muito mais simples do que parece.
3. O modo Hybrid oferece o melhor dos dois mundos
Essa é a essência do Astro. As páginas estáticas mantêm uma pontuação Lighthouse acima de 95, as páginas dinâmicas oferecem recursos personalizados, o tempo de build não aumenta e os custos de servidor não disparam. Hoje, o modo Hybrid é minha primeira escolha em novos projetos.
Próximos passos
Depois de ler este artigo, você pode:
- Experimentar agora: abra seu projeto Astro e execute
npx astro add nodepara testar SSR em cinco minutos - Avaliar suas necessidades: liste quais páginas do projeto precisam de renderização dinâmica e quais podem continuar estáticas
- Aprofundar-se: conheça o recurso Server Islands, ou ilhas de servidor, lançado recentemente pelo Astro, que permite incorporar componentes SSR em páginas SSG com mais flexibilidade
Se você tiver problemas durante a configuração, faça uma pergunta na comunidade oficial do Astro no Discord. As respostas costumam ser rápidas e a comunidade é receptiva.
Por fim, evite otimização excessiva. Se seu site não recebe muito tráfego, com menos de 10 mil visualizações de página por dia, um site estático provavelmente é suficiente. Não há motivo para adicionar a complexidade do SSR. A escolha técnica deve atender ao negócio; não use uma tecnologia apenas por usar.
Boa configuração! Se tiver alguma dúvida, deixe um comentário.
Guia completo de Astro SSR: ative a renderização no servidor em 3 passos
Entenda as diferenças entre SSR e SSG, configure adaptadores para Vercel, Netlify e Node.js e aprenda a combinar os dois no modo Hybrid em 30 minutos
⏱️ Estimated time: 30 min
- 1
Step 1: Entenda SSR vs. SSG: quando você precisa de SSR
Critério de decisão:
SSG (geração de site estático)
• O conteúdo já está definido no momento do build
• Posts de blog, páginas de produto e página Sobre
• Como esse conteúdo quase não muda, SSG é perfeito
SSR (renderização no servidor)
• O conteúdo pode mudar a cada acesso
• Uma mensagem como 'Bem-vindo de volta, João' depois do login
• Cotação de ações em tempo real e quantidade de itens no carrinho
• Como cada pessoa vê algo diferente, é preciso usar SSR
5 situações em que SSR é necessário:
1. Autenticação de usuários e conteúdo personalizado
• O exemplo mais típico é o login
• Não há como saber durante o build quem fará login nem qual nome deverá aparecer
• Por exemplo, a página inicial de uma plataforma de cursos pode mostrar 'Continue aprendendo: aula 5'
• Isso exige SSR para gerar o conteúdo dinamicamente conforme o progresso do usuário conectado
2. Exibição de dados em tempo real
• Previsão do tempo, cotações e placares esportivos
• Esses dados mudam a cada minuto
• Não faz sentido reconstruir o site a cada minuto
• Com SSR, os dados mais recentes são buscados a cada visita
3. Consultas ao banco de dados
• Pesquisa de produtos em um e-commerce
• Cada termo produz resultados diferentes
• É impossível gerar antecipadamente páginas para todas as pesquisas possíveis
• Com SSR, o banco é consultado quando o usuário pesquisa e os resultados são retornados em tempo real
4. Rotas de API
• Envio de formulários, upload de arquivos e chamadas a APIs de terceiros
• Tudo isso exige lógica de backend
• O modo SSR do Astro permite criar rotas de API em src/pages/api/xxx.js
• Assim, você não precisa montar um servidor de backend separado
5. Testes A/B e recomendações personalizadas
• Exiba conteúdo diferente conforme localização, horário de acesso ou comportamento anterior
• Em um e-commerce como o Taobao, por exemplo, cada pessoa vê produtos recomendados diferentes
• Esse tipo de personalização exige SSR - 2
Step 2: Ative SSR em 3 passos: instalação do adaptador e configuração
Primeiro passo: instale o adaptador
Adaptador da Vercel:
• Execute: npx astro add vercel
• Indicado para implantação na Vercel
Adaptador da Netlify:
• Execute: npx astro add netlify
• Indicado para implantação na Netlify
Adaptador do Node.js:
• Execute: npx astro add node
• Indicado para servidor próprio ou implantação com Docker
Segundo passo: configure astro.config.mjs
• Adicione output: 'server' para ativar o modo SSR
• Adicione a configuração do adaptador:
import vercel from '@astrojs/vercel/serverless';
export default {
output: 'server',
adapter: vercel()
}
Terceiro passo: implante na plataforma correspondente
Vercel:
• Conecte o repositório do GitHub
• A Vercel detecta automaticamente a configuração de Astro SSR
• Faça a implantação com um clique
Netlify:
• Conecte o repositório do GitHub
• Na Netlify, é preciso configurar o diretório functions
• A implantação é automática
Node.js:
• Execute npm run build para gerar a pasta dist
• Execute node dist/server/entry.mjs para iniciar o servidor
• Outra opção é usar Docker - 3
Step 3: Modo Hybrid: combine SSR e SSG
Vantagens do modo Hybrid:
• Permite usar SSR e SSG no mesmo projeto
• Use SSG nas páginas estáticas, como posts de blog, para manter uma pontuação Lighthouse acima de 95 e aproveitar a velocidade da CDN
• Use SSR nas páginas dinâmicas, como a área do usuário, para oferecer recursos personalizados
• O tempo de build não aumenta e os custos do servidor não disparam
Como configurar o modo Hybrid:
• Defina output: 'hybrid' em astro.config.mjs
• Use prerender: true/false no frontmatter da página
- Defina prerender: true para páginas estáticas
- Defina prerender: false, ou não defina a opção, para páginas dinâmicas
Boas práticas:
Use o modo Hybrid como padrão
• A menos que todas as páginas precisem de SSR, output: 'hybrid' é a melhor opção
Ative SSR apenas quando necessário
• Defina prerender = false somente nas páginas que realmente precisam de renderização dinâmica
Sirva recursos estáticos pela CDN
• Coloque imagens e arquivos CSS e JS no diretório public/
• Eles serão servidos automaticamente pela CDN, sem passar pelo SSR
Estratégia de cache
• Para conteúdo dinâmico que muda pouco, como uma lista de notícias, use cache ou ISR para reduzir a carga do servidor
FAQ
Quando usar SSR em vez de SSG?
• Use SSG quando o conteúdo já estiver definido no momento do build, como posts de blog, páginas de produto e a página Sobre; como esse conteúdo quase não muda, SSG é perfeito
• Use SSR quando o conteúdo puder mudar a cada visita, como uma mensagem 'Bem-vindo de volta, João' após o login, cotações em tempo real e a quantidade de itens no carrinho; cada pessoa vê algo diferente
5 situações em que SSR é necessário:
1) Autenticação de usuários e conteúdo personalizado:
• O exemplo mais comum é o login, pois não há como saber durante o build quem entrará nem qual nome deve aparecer
• Uma plataforma de cursos pode mostrar 'Continue aprendendo: aula 5', o que exige SSR para gerar o conteúdo conforme o progresso do usuário conectado
2) Exibição de dados em tempo real:
• Previsão do tempo, cotações e placares esportivos mudam a cada minuto
• Em vez de reconstruir o site a cada minuto, use SSR para buscar os dados mais recentes em cada visita
3) Consultas ao banco de dados:
• Cada termo pesquisado em um e-commerce produz resultados diferentes
• Como é impossível gerar antecipadamente todas as páginas possíveis, SSR consulta o banco em tempo real e retorna os resultados
4) Rotas de API:
• Envio de formulários, upload de arquivos e chamadas a APIs de terceiros exigem lógica de backend
• O modo SSR do Astro permite criar rotas em src/pages/api/xxx.js sem montar um servidor de backend separado
5) Testes A/B e recomendações personalizadas:
• Exiba conteúdo diferente conforme localização, horário de acesso ou comportamento anterior
• Em um e-commerce como o Taobao, cada pessoa vê produtos recomendados diferentes; essa personalização exige SSR
Como configurar Astro SSR? Quais são os passos?
Primeiro, instale o adaptador:
• Vercel: execute npx astro add vercel para implantar na Vercel
• Netlify: execute npx astro add netlify para implantar na Netlify
• Node.js: execute npx astro add node para usar servidor próprio ou Docker
Segundo, configure astro.config.mjs:
• Adicione output: 'server' para ativar o modo SSR
• Adicione a configuração do adaptador:
import vercel from '@astrojs/vercel/serverless';
export default { output: 'server', adapter: vercel() }
Terceiro, implante na plataforma correspondente:
• Vercel: conecte o repositório do GitHub; a plataforma detectará Astro SSR e fará a implantação
• Netlify: conecte o repositório do GitHub, configure o diretório functions e faça a implantação automática
• Node.js: execute npm run build para gerar a pasta dist e node dist/server/entry.mjs para iniciar o servidor, ou use Docker
Como escolher entre os adaptadores Vercel, Netlify e Node.js?
Vercel:
• @astrojs/vercel/serverless, indicado para implantação na Vercel
• Execute npx astro add vercel
• Conecte o repositório do GitHub; a Vercel detecta Astro SSR e permite implantar com um clique
Netlify:
• @astrojs/netlify/functions, indicado para implantação na Netlify
• Execute npx astro add netlify
• Conecte o repositório do GitHub; na Netlify, configure o diretório functions para fazer a implantação automática
Node.js:
• @astrojs/node, indicado para servidor próprio ou Docker
• Execute npx astro add node
• Execute npm run build para gerar a pasta dist e node dist/server/entry.mjs para iniciar o servidor
Recomendação: se você usa Vercel, Netlify ou Cloudflare, basta executar npx astro add [platform]. Para um servidor próprio, npx astro add node leva poucos minutos. Não se assuste com a documentação: na prática, a configuração é mais simples do que parece.
O que é o modo Hybrid e como configurá-lo?
• Permite usar SSR e SSG no mesmo projeto
• Use SSG em páginas estáticas, como posts de blog, para manter uma pontuação Lighthouse acima de 95 e aproveitar a velocidade da CDN
• Use SSR em páginas dinâmicas, como a área do usuário, para oferecer recursos personalizados
• O tempo de build não aumenta e os custos do servidor não disparam
Como configurar:
• Defina output: 'hybrid' em astro.config.mjs
• Use prerender: true/false no frontmatter da página
- Defina prerender: true em páginas estáticas
- Defina prerender: false, ou não defina a opção, em páginas dinâmicas
Boas práticas:
• Use o modo Hybrid como padrão, a menos que todas as páginas precisem de SSR
• Ative SSR apenas nas páginas que realmente exigem renderização dinâmica com prerender = false
• Coloque imagens e arquivos CSS e JS em public/ para servi-los pela CDN sem passar pelo SSR
• Para conteúdo dinâmico que muda pouco, como listas de notícias, use cache ou ISR para reduzir a carga do servidor
Essa é a essência do Astro: páginas estáticas mantêm uma pontuação Lighthouse acima de 95, enquanto páginas dinâmicas oferecem recursos personalizados.
SSR afeta o desempenho? Quando não é necessário usá-lo?
• SSR realmente pode ser um pouco mais lento que SSG, pois cada solicitação precisa ser renderizada no servidor
• Porém, servidores e CDNs modernos são rápidos o suficiente, e a diferença é aceitável para a maioria das aplicações
Evite otimização excessiva:
• Se o site não recebe muito tráfego, com menos de 10 mil visualizações de página por dia, um site estático provavelmente é suficiente
• Não há motivo para adicionar a complexidade do SSR
• A escolha técnica deve atender ao negócio; não use uma tecnologia apenas por usar
SSR não resolve tudo. Use-o quando for necessário. Não adote SSR por empolgação nem trate SSG como ultrapassado. Use SSG em páginas estáticas e SSR em páginas dinâmicas; para a maioria dos projetos, o modo Hybrid é o mais adequado.
Já vi alguém migrar um blog inteiro para SSR e acabar com um desempenho pior. Como o conteúdo dos posts não muda, SSG com CDN certamente é mais rápido.
18 min de leitura · Publicado em: 2 dez 2025 · Atualizado em: 4 set 2026
Guia Astro
Se você chegou pela busca, o caminho mais rápido é ir para o post anterior ou próximo desta série.
Anterior
Astro View Transitions: 2 linhas de código para deixar seu site tão fluido quanto um app
A View Transitions API oferece transições de página com aparência nativa em sites Astro, sem React ou Vue. Com apenas 2 linhas de código, você cria uma experiência fluida como a de uma SPA. Este guia inclui um exemplo prático completo e boas práticas.
Parte 7 de 15
Próximo
Astro vs Next.js: a verdade técnica por trás de sites estáticos até 40% mais rápidos
Uma comparação detalhada entre Astro e Next.js em desempenho, recursos e ecossistema para sites estáticos. O Astro pode ser 40% mais rápido e enviar 90% menos JavaScript, enquanto o Next.js se destaca em conteúdo dinâmico e no ecossistema React. Inclui testes de desempenho, árvore de decisão e guia de implantação.
Parte 9 de 15



Comentários
Entre com GitHub para comentar