Conteúdo duplicado: o que é, se gera penalidade e como resolver
Entenda o que é conteúdo duplicado, por que não existe penalidade automática, como o Google escolhe a URL canônica e como corrigir duplicações no seu site.
Resumo rápido
<a href> de verdade, e noindex no HTML inicial pode impedir a renderização da página.JavaScript SEO é o conjunto de práticas de SEO técnico que garante que páginas construídas ou modificadas por JavaScript sejam rastreadas, renderizadas e indexadas corretamente pelos buscadores e por outros robôs, como os rastreadores de IA.
O tema ganhou peso com frameworks como React, Vue, Angular, Next.js e Nuxt. Em um site tradicional, o servidor entrega um HTML pronto. Em muitas aplicações modernas, o servidor entrega um HTML quase vazio, com uma <div id="root"> e alguns arquivos .js. Quem monta a página é o navegador, depois de baixar e executar esses scripts.
Para o usuário, o resultado pode ser idêntico. Para um robô, não: se ele não executa JavaScript, enxerga uma página em branco. Se executa, precisa de mais tempo e recursos para chegar ao conteúdo. JavaScript SEO trata justamente dessa diferença entre o que o servidor entrega e o que o usuário vê.
A documentação do Google Search Central descreve o processamento de aplicações JavaScript em três fases principais.
O componente que faz a renderização é chamado de Web Rendering Service, ou WRS. Na prática, é um navegador Chromium sem interface gráfica. O Google afirma que roda JavaScript com uma versão “evergreen” do Chromium, isto é, sempre atualizada. Recursos modernos de JavaScript funcionam normalmente.
Um detalhe do WRS importa para quem desenvolve: o Googlebot faz cache agressivo dos recursos e pode ignorar cabeçalhos de cache, usando um arquivo JS ou CSS desatualizado. A solução indicada pelo Google é o fingerprinting: incluir um hash do conteúdo no nome do arquivo (por exemplo, main.2bb85551.js), de modo que cada versão nova gere uma URL nova.
Existe um mito antigo de que o Google leva dias ou semanas para renderizar páginas em JavaScript. Um estudo publicado em julho de 2024 pela Vercel em parceria com a agência MERJ analisou mais de 100 mil requisições do Googlebot, principalmente no site nextjs.org, em abril de 2024. Os resultados:
| Percentil | Atraso entre rastreamento e renderização |
|---|---|
| p50 (mediana) | 10 segundos |
| p75 | 26 segundos |
| p90 | cerca de 3 horas |
| p99 | cerca de 18 horas |
O mesmo estudo registrou renderização completa em 100% das páginas HTML com status 200 indexáveis, inclusive com interações complexas em JS. Ressalva dos autores: a maior parte dos dados vem de um único site, e o resultado pode não se repetir em todos os casos.
Na prática: o Google consegue renderizar JavaScript, e na maioria das vezes rápido. O problema costuma ser um detalhe de implementação que quebra a renderização, esconde links ou manda sinais contraditórios.
A decisão técnica mais importante em JavaScript SEO é onde o HTML é montado. O artigo “Rendering on the Web”, do web.dev, define as principais abordagens:
| Abordagem | Como funciona | Impacto em SEO |
|---|---|---|
| CSR (client-side rendering) | O navegador recebe um HTML mínimo e monta a página executando JavaScript. | Pode ser indexado pelo Google, mas exige testes extras. Robôs que não executam JS não veem o conteúdo. |
| SSR (server-side rendering) | O servidor gera o HTML completo a cada requisição. | Conteúdo e links chegam prontos no HTML. Pode aumentar o TTFB, já que o servidor precisa montar a página. |
| Renderização estática (SSG) | Um arquivo HTML por URL é gerado antecipadamente, no momento do build. | A opção mais segura para conteúdo que muda pouco (blog, páginas institucionais). TTFB rápido e estável. |
Hidratação (hydration) é o processo em que o JavaScript do cliente “assume” um HTML que já veio pronto do servidor, conectando eventos e estado para torná-lo interativo. É o modelo usado por frameworks como Next.js e Nuxt: o robô recebe o HTML completo, e o usuário ganha a interatividade de uma aplicação.
A hidratação tem custo. O web.dev alerta que a reidratação pode ter impacto negativo significativo em TBT e INP, mesmo melhorando a primeira exibição de conteúdo. Ou seja, o SSR resolve o problema de visibilidade, mas um volume grande de JavaScript para hidratar ainda pode piorar as Core Web Vitals, especialmente o INP.
Renderização dinâmica é entregar HTML pré-renderizado para robôs e a versão em JavaScript para usuários, detectando o user agent. Hoje o Google é direto: a renderização dinâmica é um paliativo e não uma solução recomendada, porque adiciona complexidade e consumo de recursos. No lugar dela, o Google recomenda renderização no servidor, renderização estática ou hidratação.
Dica: você não precisa escolher uma abordagem para o site inteiro. Um padrão comum é renderizar no servidor ou de forma estática tudo o que precisa ranquear (páginas de produto, categorias, artigos) e deixar em CSR as áreas logadas, painéis e filtros que não precisam aparecer na busca.
Mesmo quando a renderização funciona, alguns padrões de código impedem o Google de entender a página. Os mais importantes estão na documentação oficial.
O Google só descobre links de forma confiável em elementos <a> com atributo href contendo uma URL. Links inseridos por JavaScript são aceitos, desde que sigam esse formato. Isso é a base de uma boa linkagem interna em aplicações modernas.
| Código | Rastreável? |
|---|---|
<a href="/produtos/tenis"> |
Sim (recomendado) |
<a href="/produtos/tenis" onclick="goTo('tenis')"> |
Sim, porque o href existe |
<a routerLink="produtos/tenis"> |
Não é confiável (sem href) |
<span href="/produtos/tenis"> |
Não é confiável (não é um elemento <a>) |
<a onclick="goto('/produtos/tenis')"> |
Não é confiável (URL só no evento) |
<a href="javascript:goTo('tenis')"> |
Não recomendado |
SPAs antigas usavam URLs como /#/produtos. O Google considera isso má prática, porque não resolve esses fragmentos de forma confiável como páginas diferentes. O correto é usar caminhos reais (/produtos) com a History API (pushState), para que cada tela tenha uma URL própria e rastreável. Um sitemap XML atualizado ajuda na descoberta: o estudo Vercel/MERJ observou que ele reduz bastante as diferenças de tempo de descoberta entre os padrões de renderização.
rel="canonical" da página e não deve contradizer o HTML original./nao-encontrado) ou inserir um meta robots noindex nas telas de erro.Hoje o site também é lido por robôs de IA que alimentam ChatGPT, Claude, Perplexity e outros assistentes, e eles funcionam de outro jeito.
O estudo “The rise of the AI crawler”, publicado pela Vercel com a MERJ em dezembro de 2024, analisou o tráfego de rastreadores na rede da Vercel. A conclusão principal: nenhum dos grandes rastreadores de IA testados renderiza JavaScript, incluindo GPTBot (OpenAI), ClaudeBot (Anthropic) e PerplexityBot. O ChatGPT e o Claude até baixam arquivos JS (11,50% e 23,84% das requisições, respectivamente), mas não os executam.
| Rastreador | Executa JavaScript? | Observação |
|---|---|---|
| Googlebot (Busca e Gemini) | Sim | O Gemini usa a infraestrutura do Googlebot |
| AppleBot | Sim | Usa um rastreador baseado em navegador |
| GPTBot (OpenAI) | Não | Baixa arquivos JS, mas não executa |
| ClaudeBot (Anthropic) | Não | Baixa arquivos JS, mas não executa |
| PerplexityBot | Não | Lê apenas o HTML inicial |
Fonte: Vercel e MERJ, dezembro de 2024. Comportamentos podem mudar; teste periodicamente.
A consequência é simples: se o texto principal, os preços ou as especificações de um produto só aparecem depois da execução do JavaScript, esses assistentes simplesmente não veem essa informação. O estudo observa que conteúdo presente no HTML inicial, inclusive dados em JSON embutidos, ainda pode ser aproveitado.
Isso tem efeito direto em estratégias de GEO (Generative Engine Optimization). Já no ecossistema do Google, o cenário é diferente: AI Overviews e Modo IA usam o mesmo índice da busca, e o Google afirma que não há requisitos adicionais para aparecer neles. Entre as boas práticas listadas está garantir que o conteúdo importante esteja disponível em forma de texto e que o rastreamento seja permitido no robots.txt e na infraestrutura de CDN ou hospedagem.
Regra prática para 2026: trate o HTML inicial como a versão “oficial” da página. Tudo o que você quer que buscadores e IAs leiam (texto principal, título, meta description, canonical, links de navegação, dados estruturados) deve estar nele. Use JavaScript para melhorar a experiência, não para entregar o conteúdo essencial.
Uma auditoria de JavaScript SEO compara o que o servidor entrega com o que o navegador monta. Este roteiro cobre o essencial:
Sim. O Google renderiza JavaScript com um Chromium atualizado e consegue indexar conteúdo gerado no cliente. O risco está nos detalhes de implementação: links sem href, URLs com #, noindex no HTML inicial, erros de script e recursos bloqueados.
Não é obrigatório para o Google, mas é a recomendação oficial (junto com renderização estática e hidratação) e a forma mais segura de ser lido também por rastreadores de IA, que não executam JavaScript. Priorize as páginas que precisam ranquear.
Segundo o estudo da Vercel com a MERJ (dezembro de 2024), o GPTBot baixa arquivos JavaScript, mas não os executa. Conteúdo que só aparece depois da renderização tende a ficar invisível para ele. O que estiver no HTML inicial pode ser lido.
Use a ferramenta de inspeção de URL do Search Console, com o teste em tempo real. Ela mostra o HTML, a captura de tela da página renderizada, os recursos carregados e as mensagens do console JavaScript.
Fontes e referências
Ricardo Nakamura lidera o SEO Next+ da Oxigenweb, departamento dedicado a SEO e GEO (Generative Engine Optimization). Há mais de 5 anos conduz projetos digitais de ponta a ponta para marcas como JBS, Grupo Petrópolis, Caloi e Lufthansa City Center. Escreve sobre processos escaláveis de SEO, busca orientada por IA e como transformar otimização em resultado de negócio.
Ver perfil e todos os artigos de Ricardo →Entenda o que é conteúdo duplicado, por que não existe penalidade automática, como o Google escolhe a URL canônica e como corrigir duplicações no seu site.
Deixe seu comentário