JavaScript SEO: CSR vs SSR vs SSG vs ISR — Qual Escolher em 2026
Guia técnico definitivo sobre rendering para SEO. Entenda CSR, SSR, SSG e ISR com exemplos em React/Next.js, impacto no Core Web Vitals e indexação.
Categoria: SEO Técnico · Por Equipe Domain Hunter · Publicado em 12/05/2026 · 13 min de leitura
## Por que rendering é o tópico mais negligenciado de SEO técnico Você pode ter o melhor conteúdo, backlinks de autoridade e UX impecável — mas se o **Googlebot não conseguir renderizar** seu HTML, nada disso importa. Em 2026, com SPAs explodindo (React, Vue, Svelte), entender rendering é **obrigatório** para qualquer SEO sério. A boa notícia: o Google renderiza JavaScript desde 2019. A má: ele faz isso em **fila de processamento**, com atraso de horas a semanas, e nem sempre executa scripts complexos. Confiar em CSR puro é apostar contra a casa. ## Os 4 modelos explicados em 30 segundos | Modelo | Quando o HTML é gerado | Bom para SEO? | |---|---|---| | **CSR** (Client-Side Rendering) | No navegador do usuário | Ruim | | **SSR** (Server-Side Rendering) | A cada request, no servidor | Excelente | | **SSG** (Static Site Generation) | No build, antes do deploy | Excelente | | **ISR** (Incremental Static Regeneration) | Híbrido SSG + revalidação | Excelente | ## CSR — quando NÃO usar CSR (React puro com `create-react-app`, Vue SPA) entrega ao crawler um HTML quase vazio: ```html ``` O Googlebot precisa **baixar, parsear e executar** o bundle para ver o conteúdo. Resultado: - Indexação atrasada (dias a semanas) - LCP horrível (impacto direto em Core Web Vitals) - Dynamic rendering descontinuado pelo Google (ver [anúncio oficial](https://developers.google.com/search/blog/2022/02/dynamic-rendering-not-recommended)) **Use CSR só para:** dashboards autenticados, ferramentas internas, áreas que não precisam ranquear. ## SSR — o curinga universal A página é renderizada **no servidor a cada request**. O crawler recebe HTML completo. Ideal para: - Conteúdo dinâmico que muda por usuário ou contexto (preço, estoque, localização) - E-commerce de catálogo gigante - Plataformas com feeds personalizados Frameworks: **Next.js (`getServerSideProps`)**, Remix, Nuxt, SvelteKit. Tradeoff: **TTFB maior**. Cache via CDN (Vercel, Cloudflare) é essencial. ## SSG — performance máxima HTML gerado **no momento do build**. Servido como arquivo estático, direto da CDN. Latência mínima, LCP excelente. Ideal para: - Blogs (como este) - Documentação - Landing pages - Sites institucionais Em Next.js: `getStaticProps` + `getStaticPaths`. Em Astro/11ty/Hugo: padrão. Limitação: rebuild a cada mudança de conteúdo. Se você tem 100.000 páginas, o build leva horas. ## ISR — o melhor dos dois mundos ISR (Incremental Static Regeneration), criado pelo Next.js, gera páginas estáticas **sob demanda** e revalida em background a cada N segundos. ```javascript export async function getStaticProps() { const post = await fetchPost(); return { props: { post }, revalidate: 3600, // regenera a cada hora }; } ``` Use ISR para: blogs grandes, e-commerce, marketplaces, qualquer conteúdo que muda às vezes mas não a cada request. ## Comparativo de Core Web Vitals | Modelo | LCP típico | TTFB | INP | |---|---|---|---| | CSR | 4–8s | Baixo | Médio | | SSR | 1–3s | Médio | Bom | | SSG | <1s | Baixíssimo | Excelente | | ISR | <1s (cache hit) | Baixíssimo | Excelente | Para entender as métricas em profundidade, leia nosso [guia de Core Web Vitals 2026](/blog/core-web-vitals-2026-otimizar-lcp-inp-cls). ## Tutorial: migre de CSR para SSR/SSG em Next.js ### Passo 1 — Audite suas páginas Use o [URL Inspection Tool](https://search.google.com/search-console) do Search Console. Veja "HTML renderizado" — se aparece vazio ou só com loaders, você tem problema. ### Passo 2 — Identifique o tipo de conteúdo - Mudou raramente? → SSG - Muda algumas vezes por dia? → ISR - Muda por request? → SSR - Privado/autenticado? → CSR ### Passo 3 — Migre rota por rota Em Next.js App Router, **server components são SSR por padrão**. Marque com `'use client'` apenas componentes interativos. ```jsx // app/blog/[slug]/page.tsx export const revalidate = 3600; export default async function Post({ params }) { const post = await getPost(params.slug); returnTags: javascript seo, ssr, ssg, next.js, react, rendering