SEO para JavaScript
Como garantir que os mecanismos de busca possam rastrear, renderizar e indexar conteúdo dependente de JavaScript — links reais, paridade, lazy-loading, rolagem infinita, soft-404s e testes.
Idiomas
1 sinal de evidência nesta página
- Ferramenta relacionada ativaRaw vs. Rendered HTML Checker
JavaScript SEO trata de saber se os mecanismos de busca conseguem rastrear, renderizar e indexar conteúdo que depende de JavaScript. O Google consegue executar JS — os modos de falha são mais específicos: paridade (bruto vs renderizado), interação (o Google não rola nem clica), estado (o renderizador é sem estado) e tempo. Mantenha links como âncoras reais, não bloqueie JS/CSS, prefira SSR/prerenderização para conteúdo que precisa ranquear, e fique de olho na rolagem infinita — um viewport de renderização alto pode fazer duas páginas serem indexadas como uma.
TL;DR — JavaScript SEO trata de uma pergunta: os mecanismos de busca conseguem ver seu conteúdo? Sites modernos constroem grande parte da página no navegador com JavaScript. Se seu texto e links importantes só aparecem depois que os scripts são executados, você precisa confirmar se o Google ainda consegue alcançá-los. O Google geralmente consegue — o problema está nos detalhes.
O que é JavaScript SEO
Muitos sites constroem parte (ou todo) da página no seu navegador com JavaScript. O servidor envia algum HTML, e então scripts são executados para preencher conteúdo, carregar mais itens ou trocar visualizações sem recarregar a página inteira. JavaScript SEO é a prática de garantir que os mecanismos de busca ainda consigam rastrear, renderizar e indexar esse conteúdo.
Aqui está a ordem em que as coisas acontecem para o Google:
- Rastreamento — o Google baixa o HTML bruto da sua URL.
- Renderização — o Google executa o JavaScript da página em um navegador para construir a página final (a etapa de renderização).
- Indexação — o Google lê essa página final e a arquiva.
O Google documenta essas como as três principais fases para processar aplicativos web em JavaScript.
Evidence for this claim Google processes JavaScript web apps in three main phases: crawling, rendering, and indexing; without rendering, Google might not see JavaScript-provided content. Scope: Google Search's processing of JavaScript pages; successful rendering does not guarantee indexing or ranking. Confidence: high · Verified: Google Search Central: Understand the JavaScript SEO basicsSe o seu conteúdo só aparece depois que o JavaScript é executado, o Google precisa renderizar a página com sucesso antes de poder vê-la. Na maioria das vezes, ele consegue. Quando não consegue, seu conteúdo pode desaparecer silenciosamente da busca.
Primeiro, as boas notícias
JavaScript não é ruim para SEO. O Google executa uma versão atualizada do Chrome e pode executar o mesmo JavaScript que seus visitantes. O medo antigo — “o Google não consegue ler JavaScript” — simplesmente não é mais verdade.
O que pode dar errado é mais específico:
- Seu conteúdo precisa de um clique ou rolagem para carregar, e o Google não clica nem rola. Evidence for this claim Google Search does not interact with a page, so lazy-loaded content should load when it becomes visible in the viewport rather than requiring user interaction. Scope: Google Search's documented rendering behavior for lazy-loaded content; other crawlers can behave differently. Confidence: high · Verified: Google Search Central: Fix lazy-loaded content
- Seus links não são links reais (são botões ou manipuladores de clique), então o Google não consegue segui-los. Evidence for this claim Google can reliably discover links only when they are HTML anchor elements with an href attribute. Scope: Link discovery by Google Search; this does not claim that every discovered URL will be crawled or indexed. Confidence: high · Verified: Google Search Central: Make your links crawlable
- Você acidentalmente bloqueou seus arquivos de JavaScript ou CSS em
robots.txt, então o Google não consegue renderizar a página corretamente. - A página parece correta no seu navegador, mas o conteúdo nunca aparece na visualização renderizada do Google.
A lista de verificação simples
- Compare seu HTML bruto (clique com o botão direito → Ver código-fonte) com o HTML renderizado (a ferramenta Inspeção de URLs do Google Search Console). Se conteúdo importante estiver faltando na visualização renderizada, esse é o seu problema.
- Certifique-se de que os links sejam links reais
<a href>, não manipuladores de clique em um<div>. - Não bloqueie seus arquivos de JavaScript ou CSS em
robots.txt. - Se um recurso precisar de um clique ou rolagem para carregar conteúdo, certifique-se de que esse conteúdo também seja acessível de outra forma.
- Para conteúdo que absolutamente precisa ranquear, prefira renderização no servidor ou uma build estática/pré-renderizada, onde o conteúdo já está no HTML bruto. Evidence for this claim Google describes server-side rendering or pre-rendering as a good idea because it makes a website faster for users and crawlers. Scope: Google Search guidance for JavaScript sites; the source does not prescribe one framework or guarantee indexing. Confidence: high · Verified: Google Search Central: Understand the JavaScript SEO basics
Quer a versão mais aprofundada — os modos reais de falha, a armadilha do scroll infinito que faz com que duas páginas sejam indexadas como uma, e como testar o HTML renderizado? Mude para a aba Avançado. Para saber como o renderizador do Google funciona e qual configuração de renderização escolher, veja a página de renderização.
TL;DR — O Google consegue executar seu JavaScript, então “o Google consegue ler JS?” é a pergunta errada. Os modos de falha são paridade (DOM bruto vs. renderizado), interação (o Google não rola nem clica), estado (o renderizador é sem estado) e tempo. Mantenha links como âncoras reais
<a href>, não bloqueie JS/CSS, faça lazy-load com base no viewport, não na interação, retorne status reais para 404s no lado do cliente e lembre-se de que umnoindexbruto pode impedir a renderização antes que o JavaScript possa removê-lo. Combine diretivas que foram realmente processadas, mas não assuma um vencedor universal entre bruto/renderizado. Cuidado especialmente com o scroll infinito: um viewport de renderização alto pode acionar o carregador e mesclar duas URLs em uma página indexada. Para os detalhes internos do renderizador e qual modo de renderização escolher, veja renderização.
O Google consegue ler JavaScript? Sim — essa não é a pergunta
Three stages run left to right: crawl, render, and index. The render stage branches into four failure modes: parity, where the rendered DOM may not match expectations; interaction, where content requires a scroll or click; state, where content relies on cookies or storage that the renderer clears; and timing, where content is deferred behind slow JavaScript.
© Patrick Stox LLC · CC BY 4.0 ·
O Google processa aplicativos JavaScript em três fases: “Google processes JavaScript web apps in three main phases: 1. Crawling 2. Rendering 3. Indexing.” (tradução) «O Google processa aplicativos web JavaScript em três fases principais: 1. Rastreamento 2. Renderização 3. Indexação.» A fase do meio executa seu JS em um Chrome headless evergreen para construir o DOM que é indexado. “Rendering is important because websites often rely on JavaScript to bring content to the page, and without rendering Google might not see that content.” (tradução) «A renderização é importante porque os sites geralmente dependem de JavaScript para levar conteúdo à página, e sem a renderização o Google pode não ver esse conteúdo.»
Evidence for this claim Google processes JavaScript web apps in three main phases: crawling, rendering, and indexing; without rendering, Google might not see JavaScript-provided content. Scope: Google Search's processing of JavaScript pages; successful rendering does not guarantee indexing or ranking. Confidence: high · Verified: Google Search Central: Understand the JavaScript SEO basicsEntão o Google consegue executar seu JavaScript. As perguntas úteis são mais específicas:
- Paridade — o DOM renderizado realmente contém o que você pensa que contém?
- Interação — algo exige uma rolagem/clique que o Google não realizará?
- Estado — você depende de cookies/localStorage que o renderizador sem estado limpa?
- Tempo — o conteúdo crítico é adiado por JavaScript lento ou tardio?
Sobre o tempo especificamente: o Google enfileira uma página rastreada (que retornou um 200) para renderização, e “the page may stay on this queue for a few seconds, but it can take
longer than that.” (tradução) «a página pode permanecer nessa fila por alguns segundos, mas pode levar mais tempo do que isso.» Não há atraso ou tempo limite fixo publicado — e uma página que retorna um status diferente de 200, ou que começa com uma diretiva noindex, pode pular a fila de renderização em vez de esperar o JavaScript alterá-la.
A mecânica de como o Google renderiza — o Web Rendering Service, a ausência de estado, o cache, o mito das “duas ondas” — está na página de renderização. Aqui vou focar nos problemas práticos e nas correções.
Links precisam ser âncoras reais <a href>
Este é o bug de JS-SEO mais comum. “Google can only discover your links if
they are <a> HTML elements with an href attribute.” (tradução) «O Google só consegue descobrir seus links se eles forem elementos HTML <a> com um atributo href.» Um <div> clicável com um manipulador onclick é invisível para o Google como link — ele não será seguido, e páginas que dependem dele para descoberta podem ficar sem rastreamento. É perfeitamente aceitável injetar links com JavaScript, desde que eles acabem como âncoras reais <a href> no DOM renderizado. Essas âncoras renderizadas são analisadas depois que o JavaScript é executado, no entanto — cair no DOM renderizado torna um link descobrível, mas não é uma promessa de que a URL será rastreada, indexada ou tratada da mesma forma que um link presente no HTML bruto.
Conteúdo com carregamento preguiçoso e bloqueado por interação
O renderizador não se comporta como um usuário curioso: “Google Search does not interact with your page.” (tradução) «O Google Search não interage com sua página.» Sem rolagem, sem cliques, sem passar o mouse. Portanto, qualquer conteúdo que só carrega em um desses eventos não será visto.
A orientação do Google: carregue o conteúdo quando ele entrar no viewport, não quando o usuário agir — “make sure that your lazy-loading implementation loads all relevant content whenever
it is visible in the viewport,” (tradução) «certifique-se de que sua implementação de carregamento preguiçoso carregue todo o conteúdo relevante sempre que ele estiver visível no viewport,» e “don’t add lazy-loading to content that is
likely to be immediately visible when a user opens a page.” (tradução) «não adicione carregamento preguiçoso a conteúdo que provavelmente estará imediatamente visível quando um usuário abrir uma página.» Use IntersectionObserver ou loading="lazy" nativo para imagens — nunca um manipulador de rolagem ou clique — para que o conteúdo carregue durante uma renderização normal.
Rolagem infinita: quando duas páginas são indexadas como uma
A normal browser viewport stops after the first page, but Google's render viewport expands much taller. The expansion reaches an infinite-scroll trigger, fires the loader without a real user scroll, and appends the next page into the same DOM. Google then indexes both pages' content under one URL.
© Patrick Stox LLC · CC BY 4.0 ·
Este é o ponto que quase ninguém explica, e vale a seção inteira.
O Googlebot pode renderizar em um viewport consideravelmente mais alto do que uma janela típica de navegador. O Google não publica um tamanho exato de viewport de renderização — e ele pode mudar — então não projete com base em um número específico; teste sua própria implementação. O que importa é o mecanismo: se o seu carregador de scroll infinito dispara com base na posição de rolagem ou na altura do viewport, um viewport de renderização mais alto do que o esperado pode disparar o carregador durante a própria renderização — e o conteúdo da próxima página de artigo ou produto é anexado ao mesmo DOM. Agora, o conteúdo de duas URLs distintas foi renderizado junto, e o Google pode indexá-las como uma página. Na minha própria experiência, “ocasionalmente, duas páginas são indexadas como uma” — já tive páginas relatadas como “não indexadas” que foram realmente indexadas como parte de outra página (geralmente o post anterior no feed), porque “quando o Google redimensionou o viewport para ser mais longo … ele disparou o scroll infinito e carregou outro artigo durante a renderização.” Confirme se a sua própria configuração faz isso verificando o HTML renderizado da URL Inspection para uma página que você esperaria que parasse antes — não assuma um tamanho e não assuma que você está seguro.
Há duas camadas para acertar isso.
Torne o scroll infinito amigável para busca em primeiro lugar. Suporte carregamento paginado
por baixo do scroll infinito. Cada bloco deve ter “sua própria URL única e persistente,” o conteúdo em cada URL deve permanecer o mesmo a cada carregamento, você deve
evitar parâmetros relativos como ?date=yesterday, você deve “linkar sequencialmente para as
URLs individuais para que os mecanismos de busca possam descobrir as URLs em um conjunto paginado,”
e quando um novo bloco carrega ao rolar, você deve “atualizar a URL exibida usando a
History API.” Use links de paginação reais <a href> e URLs únicas — “não use
identificadores de fragmento de URL” (a parte após um #) para números de página, porque o Google os ignora.
Como digo no meu guia de SEO para JavaScript, “se você tem uma configuração de scroll infinito, ainda recomendo uma
versão de página paginada para que o Google possa rastrear corretamente.”
Se um carregador com bug está mesclando páginas ativamente, a correção mais rápida é direta: “bloqueie o arquivo JavaScript que lida com o scroll infinito para que a funcionalidade não possa disparar.” Se o carregador não puder rodar durante a renderização, ele não pode anexar o conteúdo da próxima página, e cada URL renderiza como ela mesma novamente.
Soft-404s após roteamento no lado do cliente
Aplicativos de página única podem trocar conteúdo sem alterar o código de status HTTP, então uma
visão de “não encontrado” ainda pode retornar 200. O Google pode classificar essa resposta como um
soft 404 após avaliar o conteúdo retornado, mas uma busca estática sozinha não pode provar
que o Google fez essa classificação. Duas correções:
navegue com a History API e, para um estado genuíno de não encontrado, ou roteie para uma
URL que retorne um status 404 real ou adicione uma tag noindex. E não dependa de fragmentos de URL para roteamento — “o esquema de rastreamento AJAX está obsoleto desde 2015, então
você não pode confiar em fragmentos de URL para funcionar com o Googlebot.”
Um redirecionamento no lado do cliente tem o mesmo problema de evidência: a resposta inicial pode permanecer
200 até que o JavaScript seja executado. O Google suporta redirecionamentos JavaScript apenas como fallback
quando redirecionamentos no lado do servidor ou meta-refresh não são possíveis. Relate o status estático
e a navegação renderizada observada separadamente; não reescreva o status HTTP na
auditoria nem chame toda mudança de URL renderizada de redirecionamento.
Não bloqueie JavaScript ou CSS no robots.txt
O Google não renderizará JavaScript de arquivos bloqueados ou em páginas bloqueadas. Uma
regra de robots.txt que desautoriza seu bundle (ou o diretório /_next/, /static/, /assets/
em que ele está) pode quebrar a renderização completamente — o Google busca o shell, não consegue
executar os scripts e indexa uma página vazia. Verifique os recursos da página da URL Inspection
para qualquer coisa bloqueada.
Paridade de DOM e diretivas de robots conscientes do estágio
Compare seu HTML bruto (Ver código-fonte) com o HTML renderizado (Inspeção de URL). O conteúdo que só existe no HTML renderizado ainda é indexado — se for renderizado. O conteúdo que não está em nenhum dos dois não existe para o Google.
Há um risco de ordem de estágios que o Google documenta diretamente: “When Google encounters the
noindex tag, it may skip rendering and JavaScript execution, which means using
JavaScript to change or remove the robots meta tag from noindex may not work as
expected.” (tradução) «Quando o Google encontra a tag noindex, ele pode pular a renderização e a execução de JavaScript, o que significa que usar JavaScript para alterar ou remover a meta tag robots de noindex pode não funcionar como esperado.» Se o seu HTML bruto envia um noindex inicial que você pretendia trocar com JavaScript, o Google pode agir com base nesse noindex bruto e nunca executar o script que o teria removido.
Não transforme isso em uma regra universal de “o renderizado vence”. A reconciliação é específica por campo:
| Campo | O que a comparação bruto/renderizado pode estabelecer |
|---|---|
| Conteúdo principal e links | O Google pode usar conteúdo e links reais <a href> produzidos durante a renderização se ela for bem-sucedida. A disponibilidade bruta reduz essa dependência. |
| Título e descrição | O Google pode processar metadados definidos por JavaScript, mas os títulos nos resultados e as descrições são selecionados de várias fontes. Mostre os dois estados; não afirme que o valor renderizado, o primeiro ou o último é garantido. |
| Diretivas de robots | Um noindex bruto pode fazer o Google pular a renderização, então a remoção via JavaScript pode nunca ser vista. Adicionar restrições depois não é evidência de que uma restrição anterior foi cancelada. |
| Canônico | A orientação sobre JavaScript do Google diz para não definir um valor no código-fonte e depois alterá-lo com JavaScript. Use um método e verifique uma declaração no head renderizado. |
| Status HTTP e redirecionamento | O JavaScript não pode alterar o status de resposta já recebido. Registre o status estático e qualquer navegação renderizada observada como fatos separados. |
Essa matriz é o motivo pelo qual um auditor deve manter o código-fonte, o renderizado, os cabeçalhos de resposta e o estado de pesquisa observado distintos, em vez de colapsá-los em um único valor “efetivo”.
Escolha um modo de renderização que coloque o conteúdo no DOM
A maior parte do risco de SEO com JS se resume a como o HTML é produzido. A versão curta: SSR, estático/pré-renderização e hidratação colocam o conteúdo no DOM (ou rapidamente nele), o que reduz o quanto sua visibilidade depende do renderizador ter sucesso; a renderização totalmente no lado do cliente deixa mais coisa dependendo de a renderização ser concluída corretamente, no prazo, todas as vezes. A renderização dinâmica é uma solução alternativa, não uma opção equivalente — conforme a orientação do Google atualizada pela última vez em dezembro de 2025, ela descreve a renderização dinâmica como uma solução alternativa em vez de uma solução de longo prazo e recomenda renderização no servidor, renderização estática ou hidratação. Como eu disse no meu guia de SEO para JavaScript, “any kind of SSR, static rendering, and prerendering setup is going to be fine for search engines.” (tradução) «qualquer tipo de configuração de SSR, renderização estática e pré-renderização vai funcionar bem para os mecanismos de busca.» O menu completo — CSR, SSR, SSG, hidratação, ISR, edge, streaming e renderização dinâmica — com uma tabela de trade-offs está na página de renderização. O Google separadamente descreve a renderização no servidor ou a pré-renderização como uma boa ideia para usuários e crawlers. Evidence for this claim Google describes server-side rendering or pre-rendering as a good idea because it makes a website faster for users and crawlers. Scope: Google Search guidance for JavaScript sites; the source does not prescribe one framework or guarantee indexing. Confidence: high · Verified: Google Search Central: Understand the JavaScript SEO basics
Como testar
A Inspeção de URL no Search Console é a fonte da verdade: execute um teste ao vivo e depois observe o HTML renderizado, a captura de tela e os recursos da página / mensagens do console para ver o que carregou e o que falhou. O Teste de resultados avançados oferece uma verificação rápida do HTML renderizado. Em escala, use um crawler que execute JavaScript (Ahrefs Site Audit, Screaming Frog no modo de renderização JS) para comparar o bruto com o renderizado em todo o site.
An illustrative page has 1 title in both raw and rendered HTML, 18 headings in raw HTML and 19 rendered, 42 internal links in raw HTML and 71 rendered, 0 product descriptions in raw HTML and 12 rendered, and 6 canonical tags in raw HTML but only 1 rendered. These counts are synthetic.
JavaScript não é ruim para SEO, e não é maligno. É apenas diferente do que muitos profissionais de SEO estão acostumados. Trabalhe com seus desenvolvedores, coloque seu conteúdo importante no DOM e deixe que as próprias ferramentas do Google — não suas suposições — sejam o árbitro do que foi renderizado.
Para onde ir a seguir: o cluster de SEO para JavaScript
Este hub é o mapa. Cada tópico abaixo é um mergulho profundo próprio:
Renderização e arquitetura
- SEO para CMS headless — como frontends desacoplados afetam rastreamento, renderização, metadados, sitemaps e tags canônicas; qual modo de renderização escolher; e os modos de falha específicos de headless que você precisa conhecer.
Guias específicos por framework
- React SEO — por que CSR-first em React cria risco de indexação, como o Google renderiza aplicativos React, React Router e History API, react-helmet-async para meta tags, e quando recorrer ao Next.js.
- Angular SEO — padrões SPA do Angular,
@angular/ssr(sucessor do Angular Universal), os serviços integrados Title e Meta, pré-renderização e hidratação incremental no Angular moderno. - Next.js SEO — Pages Router vs App Router, Metadata API,
next/imagee CWV, timing de ISR e Googlebot, sitemaps e os erros de SEO mais comuns no Next.js. - Nuxt SEO — SSR por padrão,
useSeoMeta(), modos de renderização do Nuxt, ecossistema de módulos@nuxtjs/seoe como o Nuxt se compara ao Vue puro para indexabilidade. - Vue SEO — padrão CSR do Vue 3 e o que isso significa para rastreadores,
createWebHistory(),@unhead/vue, opções de pré-renderização sem meta-framework e quando o Nuxt é a escolha certa. - Svelte SEO — Svelte vs SvelteKit, SSR por padrão no SvelteKit,
<svelte:head>, a armadilhaadapter-static+ssr: false, escolhas de adapters e implicações para rastreadores de IA. - Astro SEO — zero-JS por padrão, arquitetura de ilhas,
@astrojs/sitemap,astro:assets, View Transitions e History API, comportamento de fallback de Server Islands e vantagens de Core Web Vitals do Astro.
Resumo de IA
Uma visão condensada da versão Avançada:
- “O Google consegue ler JS?” é a pergunta errada — ele consegue. Os modos de falha são paridade (bruto vs. renderizado), interação (o Google não rola a página nem clica), estado (renderizador sem estado) e timing.
- Timing não tem atraso fixo — o Google enfileira uma página
200para renderização e pode esperar “alguns segundos” ou mais, sem timeout publicado; um status não-200 ou umnoindexinicial pode pular a fila de renderização completamente. - Links devem ser âncoras reais
<a href>—onclickem um<div>é invisível como link. Injetar links com JS é aceitável se eles virarem âncoras, mas âncoras renderizadas são parseadas após o JS rodar — descobríveis, não uma garantia de rastreamento/indexação. - Lazy-load no viewport, não na interação — o Google “não interage com a sua página.” Use IntersectionObserver / lazy-load nativo; não coloque conteúdo atrás de scroll ou clique.
- Scroll infinito pode fundir duas páginas em uma — o Googlebot pode renderizar em um viewport
mais alto que um navegador típico (sem tamanho exato publicado — teste sua própria configuração),
e essa diferença pode acionar o loader e anexar o conteúdo da próxima página. Correção:
URLs paginadas + links reais
<a href>+ History API; se um loader está fundindo páginas, bloqueie o arquivo JS dele. - Soft-404s após roteamento no cliente — retorne um
404real ounoindex; não indexe cascas vazias; não dependa de fragmentos de URL (AJAX-crawling descontinuado em 2015). - Não bloqueie JS/CSS no robots.txt — o Google não renderiza a partir de arquivos bloqueados.
noindexpode bloquear a própria remoção — o Google pode pular a renderização ao ver umnoindexinicial, então o JS destinado a removê-lo pode nunca rodar.- Paridade de DOM + ordem de estágios (robots meta tags) — compare bruto vs. renderizado, mas lembre-se
que um
noindexbruto inicial pode impedir a renderização. Aplique regras de combinação apenas a diretivas realmente processadas; teste a paridade canônica sob suas próprias regras. - Modo de renderização muda dependência, não resultado — SSR/estático/pré-renderização/hidratação colocam conteúdo no DOM mais cedo, reduzindo a dependência de renderização; CSR total depende mais dela; renderização dinâmica é um workaround antigo do Google, não uma opção equivalente. Detalhamento completo na página de renderização.
- Teste com URL Inspection (HTML renderizado + screenshot + console), Rich Results Test e um rastreador com renderização de JS.
Documentação oficial
Documentação de fonte primária dos mecanismos de busca.
- Entenda os fundamentos de SEO para JavaScript — as três fases, links rastreáveis e teste do HTML renderizado.
- Corrija problemas de JavaScript relacionados à pesquisa — tratamento de soft-404, History API e restrições do renderizador.
- Corrija conteúdo com carregamento lento — carregue na viewport (não na interação) e scroll infinito compatível com pesquisa.
- Paginação de e-commerce e carregamento incremental de páginas — URLs únicas, links
<a href>e por que o Google ignora identificadores de fragmento. - Guia aprofundado de como o Google Search funciona — onde a renderização se encaixa em rastreamento → indexação → exibição.
Bing / Microsoft
- Série bingbot: JavaScript, renderização dinâmica e cloaking. Oh, meu Deus! — a visão do Bing sobre renderização de JS e renderização dinâmica.
Citações da fonte
Declarações oficiais do Google (além de algumas da minha própria autoria). Cada link de mecanismo de pesquisa é um link profundo que salta para a passagem citada na página de origem.
Google — renderização e links
- “O Google processa aplicativos web JavaScript em três fases principais: 1. Rastreamento 2. Renderização 3. Indexação.” Ir para a citação
- “O Google só consegue descobrir seus links se eles forem elementos HTML <a> com um atributo href.” Ir para a citação
- “A renderização é importante porque os sites geralmente dependem de JavaScript para trazer conteúdo à página, e sem renderização o Google pode não ver esse conteúdo.” Ir para a citação
- “A página pode permanecer nesta fila por alguns segundos, mas pode levar mais tempo do que isso.” — sobre o tempo da fila de renderização, sem atraso fixo publicado. Ir para a citação
- “Quando o Google encontra a tag noindex, ele pode pular a renderização e a execução de JavaScript, o que significa que usar JavaScript para alterar ou remover a meta tag robots de noindex pode não funcionar como esperado.” Ir para a citação
Google — interação, carregamento lento e scroll infinito
- “Google Search does not interact with your page.” (tradução) «O Google Search não interage com a sua página.» Ir para a citação
- “…loads all relevant content whenever it is visible in the viewport.” (tradução) «…carrega todo o conteúdo relevante sempre que ele fica visível na viewport.» Ir para a citação
- “Give each chunk its own persistent, unique URL.” — search-friendly infinite scroll. (tradução) «Dê a cada bloco seu próprio URL persistente e exclusivo.» — rolagem infinita compatível com busca. Ir para a citação
- “Don’t use URL fragment identifiers (the text after a # in a URL) for page numbers in a collection. Google ignores fragment identifiers.” (tradução) «Não use identificadores de fragmento de URL (o texto após um # em um URL) para números de página em uma coleção. O Google ignora identificadores de fragmento.» Ir para a citação
Google — soft-404 e roteamento
- “We recommend using the History API to load different views.” (tradução) «Recomendamos usar a History API para carregar diferentes visualizações.» Ir para a citação
Patrick Stox (meu próprio trabalho — JavaScript SEO: A Definitive Guide)
- Sobre meta robots tags especificamente: “With meta robots tags, Google is always going to take the most restrictive option it sees — no matter the location… Google will choose the most restrictive statements between HTML and the rendered version of a page.” (tradução) «Com meta robots tags, o Google sempre vai adotar a opção mais restritiva que ele vê — independentemente da localização… O Google vai escolher as declarações mais restritivas entre o HTML e a versão renderizada de uma página.»
- “If you have an infinite scroll setup, I still recommend a paginated page version so that Google can still crawl properly.” (tradução) «Se você tem uma configuração de rolagem infinita, ainda recomendo uma versão de página paginada para que o Google ainda possa rastrear corretamente.»
- Sobre a fusão: “occasionally, two pages get indexed as one” — causada quando “Google resized the viewport to be longer … it triggered the infinite scroll and loaded another article in when it was rendering.” A correção: “block the JavaScript file that handles the infinite scrolling so the functionality can’t trigger.” (tradução) «ocasionalmente, duas páginas são indexadas como uma» — causada quando «o Google redimensionou a viewport para ficar mais longa … isso acionou a rolagem infinita e carregou outro artigo durante a renderização.» A correção: «bloqueie o arquivo JavaScript que lida com a rolagem infinita para que a funcionalidade não possa ser acionada.»
Checklist de SEO para JavaScript
Uma verificação rápida para confirmar que o Google consegue renderizar e indexar seu conteúdo dependente de JS:
- O conteúdo importante aparece no HTML renderizado (verifique a URL Inspection, não apenas o View Source).
- Os links são âncoras
<a href>reais — não manipuladoresonclickem<div>/<span>. - Os arquivos JavaScript e CSS não estão bloqueados em
robots.txt. - Nenhum conteúdo está atrás de um clique, rolagem ou hover (o Google não
interage); faça lazy-load na viewport via IntersectionObserver ou
loading="lazy". - O conteúdo acima da dobra não é carregado com lazy-load.
- As diretivas de robots correspondem entre o HTML bruto e o renderizado (sem JS injetando
noindex) — o Google adota a mais restritiva. - Mudanças de rota no lado do cliente que encontram um recurso ausente retornam um
404real ounoindex(sem shells de soft-404). - A rolagem infinita tem uma versão paginada com URLs
<a href>exclusivos e atualizações da History API — e não está mesclando páginas em uma viewport alta. - O conteúdo que precisa ranquear usa SSR / estático / pré-renderização, não CSR completo (veja a página de renderização).
- Você verificou por amostragem o screenshot renderizado e os erros de console no teste ao vivo da URL Inspection.
Os modelos mentais
1. “O Google consegue executar meu JS?” é a pergunta errada. Consegue. As perguntas reais são sobre paridade, interação, estado e tempo:
- Paridade — o DOM renderizado contém o que você pensa que contém?
- Interação — algo exige rolagem/clique que o Google não realizará?
- Estado — você depende de cookies/localStorage que o renderizador sem estado limpa?
- Tempo — o conteúdo crítico é adiado por JS lento/tardio?
2. Se não está no DOM renderizado, não existe. Ver código-fonte mostra o HTML bruto; Inspeção de URL mostra o DOM renderizado. As decisões de indexação são tomadas com base no DOM renderizado — então é esse o artefato a verificar, sempre.
3. Links reais ou nada de links.
A descoberta depende de âncoras <a href>. Manipuladores de clique, botões e navegação via JS que
nunca produzem uma âncora são becos sem saída para o rastreamento.
4. Projete para um bot que nunca toca na página. Sem rolagem, sem clique, sem passar o mouse. Se o conteúdo precisa de uma ação para aparecer, presuma que o Google não o verá — carregue-o na viewport.
5. Teste a armadilha da viewport alta no scroll infinito. O Googlebot pode renderizar em uma viewport mais alta que a de um navegador típico (nenhum tamanho fixo é publicado, então não projete contra um número específico), então um carregador acionado por rolagem/altura pode disparar durante a renderização e mesclar a próxima página. Projete para isso: URLs paginadas
- links reais + History API; se estiver mesclando ativamente, bloqueie o JS do carregador.
6. Deixe as ferramentas arbitrarem. Seu navegador não é o Googlebot. O HTML renderizado, a captura de tela e o console da Inspeção de URL são a fonte da verdade — não “parece bom na minha máquina”.
Armadilhas de SEO para JavaScript — folha de referência
| Coisa | O que realmente acontece |
|---|---|
robots.txt bloqueia seu JS/CSS | O Google não renderiza a partir de arquivos bloqueados — pode quebrar a página inteira |
index bruto + noindex injetado via JS | O Google obedece ao mais restritivo → noindex vence |
Link como onclick em um <div> | Não é descobrível — deve ser <a href> |
| Conteúdo carrega ao rolar/clicar | Não é carregado — o Google não interage; use lazy-load na viewport |
Fragmento de URL (#page=2) para paginação | Ignorado — use uma URL única real |
404 no lado do cliente com status 200 | Risco de soft-404 — retorne 404 real ou noindex |
| Scroll infinito em viewport alta | Pode mesclar duas URLs em uma página indexada — pagine + bloqueie o carregador se necessário |
Qual modo de renderização? (dependência do sucesso da renderização)
| Modo | Dependência |
|---|---|
| Estático / pré-renderizado (SSG) | Menor — o conteúdo já está no HTML |
| Renderização no servidor (SSR) | Baixa — o conteúdo está no HTML por requisição |
| Hidratação (isomórfico) | Baixa — o conteúdo chega ao DOM rapidamente |
| Renderização totalmente no cliente (CSR) | Maior — o conteúdo só existe após a renderização ser bem-sucedida |
| Renderização dinâmica | Apenas paliativo — o Google chama isso de remendo, não de correção |
Isso não é garantia de resultado — SSR/SSG/hidratação ainda precisam renderizar corretamente e passar em todas as outras verificações deste artigo. Detalhamento completo (ISR, edge, streaming, renderização dinâmica e as compensações) na página de renderização.
Veja o que o Googlebot vê
Bugs de renderização se escondem na lacuna entre o HTML bruto (o que o servidor envia) e o HTML renderizado (o que existe após o JS ser executado). Algumas verificações rápidas de linha de comando antes de recorrer a um crawler completo.
Busque o HTML bruto (o que volta antes de qualquer JS ser executado)
macOS / Linux:
# Raw HTML as the server sends it — this is the "first fetch"
curl -sL -A "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" \
https://example.com/page/ -o raw.html
# Is your important text actually in the raw HTML? (empty result = JS-dependent)
grep -o "Your headline text" raw.htmlWindows (PowerShell):
$ua = "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
Invoke-WebRequest -Uri "https://example.com/page/" -UserAgent $ua -OutFile raw.html
Select-String -Path raw.html -Pattern "Your headline text"Se o texto estiver ausente de raw.html mas visível no seu navegador, ele está sendo adicionado
por JavaScript — então depende da renderização. (Para o HTML renderizado, use a
Inspeção de URL “Ver página rastreada → HTML renderizado”, ou um rastreador headless-Chrome — um
curl simples não consegue executar JS.)
Confirme que você não está bloqueando JS/CSS no robots.txt
macOS / Linux:
curl -sL https://example.com/robots.txt | grep -iE "disallow.*\.(js|css)|Disallow:\s*/(_next|static|assets|dist)"Windows (PowerShell):
(Invoke-WebRequest "https://example.com/robots.txt").Content |
Select-String -Pattern "Disallow.*\.(js|css)","Disallow:\s*/(_next|static|assets|dist)"Um Disallow que corresponda ao seu JavaScript ou CSS significa que o Google não consegue renderizar a página
corretamente — quase sempre um erro. (A Inspeção de URL também lista recursos de página bloqueados;
o grep apenas captura os óbvios rapidamente.)
Ferramentas para depurar SEO de JavaScript
Veja a diferença entre HTML bruto e o que o Google renderiza com Render Gap:
- Cole a URL completa da página que você quer testar — uma página de modelo com muito JavaScript mostra mais.
- Limpe a verificação anti-abuso e pressione Testar página; ele busca o HTML bruto primeiro e só renderiza no headless Chrome quando esse HTML parece um shell vazio.
- Leia o veredito codificado por cores e depois examine a tabela HTML inicial vs DOM renderizado para linhas marcadas como alteradas.
- Mude para a aba Diff bruto vs renderizado para ver linha por linha o que o JavaScript adicionou ou removeu.
- Inspeção de URL (Google Search Console) — a fonte da verdade. Execute um teste ao vivo e depois veja o HTML renderizado, a captura de tela, os recursos da página (o que carregou vs. o que foi bloqueado) e as mensagens do console JavaScript.
- Teste de resultados avançados — uma maneira rápida de verificar HTML renderizado e dados estruturados para uma URL sem verificar o site.
- Chrome DevTools — compare Ver código-fonte (HTML bruto) com o painel Elements (DOM renderizado); o Console mostra erros de JS que podem apagar o conteúdo.
- Rastreadores com renderização JavaScript — Ahrefs Site Audit e Screaming Frog SEO Spider (modo de renderização JS) executam JS para que você possa comparar bruto vs. renderizado em escala.
- Ferramentas de ver código-fonte renderizado — extensões de navegador que mostram o DOM renderizado lado a lado com o HTML bruto para verificações rápidas.
- Análise de logs do servidor — confirme que o Googlebot está realmente buscando seus recursos JS/CSS (veja análise de arquivos de log).
Prompts para diagnóstico de SEO de JavaScript
Comparar HTML bruto e renderizado
Cole a resposta bruta e o DOM renderizado para a mesma URL. Remova dados do cliente e tokens primeiro.
Act as a technical SEO reviewer. Compare RAW_HTML and RENDERED_HTML below. Report only
meaningful differences in title, meta robots, canonical, headings, body copy,
structured data, and crawlable <a href> links. For each difference, label its likely
indexing impact, show the exact conflicting snippets, and give a verification step.
Do not infer content that is not present.
RAW_HTML:
[paste]
RENDERED_HTML:
[paste]Triagem de uma amostra de rotas
Review this CSV of JavaScript routes with columns URL, HTTP_STATUS, RAW_TITLE,
RENDERED_TITLE, RAW_CANONICAL, RENDERED_CANONICAL, RAW_WORDS, RENDERED_WORDS. Group
failures into shared-shell duplicates, restrictive-directive conflicts, soft 404s,
and likely render timeouts. Rank groups by affected URL count. Return the exact rows
that support each conclusion and a test to confirm it; do not invent thresholds.
[paste CSV] Validar uma mudança de SEO de JavaScript
Provar que o conteúdo da rota existe antes do JavaScript
Teste a executar: Busque rotas representativas com curl e inspecione o corpo
da resposta. Resultado esperado: Cada resposta contém seu título exclusivo, cabeçalho principal,
texto e links rastreáveis. Interpretação de falha: A implantação ainda serve um
shell de aplicativo compartilhado. Janela de monitoramento: Imediata. Gatilho de reversão: Uma rota
anteriormente visível no servidor se torna dependente de renderização.
Provar que as diretivas concordam entre as etapas de processamento
Teste a executar: Compare o HTML bruto com o HTML renderizado da Inspeção de URL para robots e
tags canônicas. Resultado esperado: Um conjunto de diretivas intencional aparece em ambos, sem
valor mais restritivo no shell bruto. Interpretação de falha: O JavaScript está
tentando sobrescrever um sinal de indexação tarde demais. Janela de monitoramento: Imediata na
renderização local; após o recrawl no Search Console. Gatilho de reversão: noindex ou
um canônico incorreto aparece em qualquer uma das etapas.
Provar que os links permanecem rastreáveis
Teste a executar: Desative o JavaScript e inspecione a navegação para rotas representativas.
Resultado esperado: Os destinos permanecem em atributos reais de href de âncoras. Interpretação de falha: Os manipuladores de cliente, não os links, são responsáveis pela descoberta. Janela de monitoramento:
Imediata. Gatilho de reversão: Rotas importantes desaparecem do grafo de links quando os scripts falham.
Recursos que valem seu tempo
Escritos relacionados meus
- JavaScript SEO: Um Guia Definitivo — meu guia completo sobre renderização, paridade de DOM, a regra da diretiva mais restritiva, rolagem infinita e o problema de duas páginas como uma. Este artigo é a versão condensada e com links para fontes.
- O Guia do Iniciante para SEO Técnico — onde o JavaScript SEO se encaixa no panorama geral.
Minhas palestras
- Como a Busca Funciona (SlideShare) — minha explicação sobre rastreamento, renderização, indexação e ranqueamento. (Minha ressalva padrão se aplica: “This is my understanding of systems… not going to be 100% complete or accurate.” (tradução) «Esta é a minha compreensão dos sistemas… não será 100% completa ou precisa.»)
De outros
- r/TechSEO — a comunidade para depurar problemas de renderização/índice.
- web.dev — Renderização na Web — o explicador canônico das compensações de renderização da equipe do Chrome.
- Google Search Central — JavaScript SEO — documentação oficial de fonte primária sobre o processo de três fases, links rastreáveis e teste de HTML renderizado.
- Onely — Hub de JavaScript SEO — posts técnicos aprofundados sobre renderização, indexação em duas ondas e auditoria de JS SEO de uma agência especializada.
- Playlist de JavaScript SEO de Martin Splitt — a série oficial de vídeos do Google que percorre cada conceito de JS SEO, produzida pela equipe de ecossistema web do Google.
- Search Engine Journal — Cobertura de JavaScript SEO — notícias do setor e guias práticos sobre problemas de renderização de JS à medida que surgem.
Podcasts
- Search Off the Record (Google Search Relations) — Martin Splitt, John Mueller e Gary Illyes cobrem regularmente JavaScript SEO e renderização por dentro. Ouça
Vídeos
- Google Search Central (YouTube) — a série JavaScript SEO de Martin Splitt é o melhor passo a passo oficial em vídeo de como o Google lida com seu JS. Canal
Estatísticas que valem citar
- Enquadramento oficial atual: sem atraso fixo. A documentação do Google (atualizada em 2026-03-04) diz que uma página
200rastreada “may stay on this queue for a few seconds, but it can take longer than that” — não há atraso ou tempo limite fixo publicado, e páginas que retornam status não-200 ou começam comnoindexpodem pular a renderização completamente. Ir para a citação - Ponto de dados histórico (datado) — atraso mediano de renderização de ~5 segundos. Em observações anteriores em conferências, funcionários do Google (Martin Splitt e Tom Greenaway) descreveram páginas chegando ao renderizador com uma mediana de ~5 segundos, com o 90º percentil em minutos — não as “semanas” que o medo antigo implicava. Cito isso no meu guia de JavaScript SEO. Trate como um ponto de dados histórico dessa palestra, não uma métrica publicada atual — o Google não o republicou como um número contínuo, e a citação sobre o tempo de fila acima é o enquadramento oficial atual.
- “Duas ondas de indexação” está desaparecendo, segundo Martin Splitt (observações de 2019). Em uma conversa de agosto de 2019 com John Mueller, Splitt disse que a indexação em duas ondas “play[s] less and less of a role” à medida que a renderização fica mais barata e o rastreamento, a renderização e a indexação convergem — sem prazo para quando pode parar completamente. Cobertura Esta é a caracterização de Splitt dessa conversa específica, não uma especificação datada e citável do Google — use como contexto direcional, não uma garantia atual em nenhum dos sentidos.
Make rendering an architecture decision before launch: if revenue pages depend on JavaScript for primary content or links, verify what search engines receive instead of assuming the browser experience is enough.
- Client-side rendering, interaction-gated content, and nonstandard links are structural risks that cost more to correct after launch.
- Raw-versus-rendered parity testing shows whether important content, links, and status signals survive the crawl, render, and index process.
- Server-rendered or static primary content with JavaScript used only for enhancement may require no special remediation.
A short, template-level diagnostic before a build or replatform can prevent later re-architecture and focus spending on the routes with organic traffic at risk.
Risco se ignorado: Search engines may miss primary content, interaction-gated elements, or internal links, leaving revenue pages under-indexed even though they work for users in a browser.
Pergunte à sua equipe: What do our top revenue templates return before JavaScript runs, and have we verified their content and links in rendered output before release?
O Google processa aplicativos JavaScript por meio de rastreamento, renderização e indexação.
Evidence for this claim Google processes JavaScript web apps in three main phases: crawling, rendering, and indexing; without rendering, Google might not see JavaScript-provided content. Scope: Google Search's processing of JavaScript pages; successful rendering does not guarantee indexing or ranking. Confidence: high · Verified: Google Search Central: Understand the JavaScript SEO basics Geralmente rastreia links quando eles são âncoras com atributos href. Evidence for this claim Google can reliably discover links only when they are HTML anchor elements with an href attribute. Scope: Link discovery by Google Search; this does not claim that every discovered URL will be crawled or indexed. Confidence: high · Verified: Google Search Central: Make your links crawlable O Google descreve a renderização no servidor ou a pré-renderização como uma boa ideia para usuários e rastreadores. Evidence for this claim Google describes server-side rendering or pre-rendering as a good idea because it makes a website faster for users and crawlers. Scope: Google Search guidance for JavaScript sites; the source does not prescribe one framework or guarantee indexing. Confidence: high · Verified: Google Search Central: Understand the JavaScript SEO basics O Google Search também não interage com uma página para acionar conteúdo. Evidence for this claim Google Search does not interact with a page, so lazy-loaded content should load when it becomes visible in the viewport rather than requiring user interaction. Scope: Google Search's documented rendering behavior for lazy-loaded content; other crawlers can behave differently. Confidence: high · Verified: Google Search Central: Fix lazy-loaded content
Registro de alterações
Atualizado em 27 de jul. de 2026.
Resumo editorial e detalhes registrados da alteração.Detalhes da alteração
-
As notas detalhadas sobre as alterações estão disponíveis atualmente em inglês.
Não é possível fazer a comparação completa — nenhum instantâneo anterior foi arquivado para esta revisão.
Atualizado em 18 de jul. de 2026.
Resumo editorial e detalhes registrados da alteração.Detalhes da alteração
-
As notas detalhadas sobre as alterações estão disponíveis atualmente em inglês.
-
As notas detalhadas sobre as alterações estão disponíveis atualmente em inglês.
-
As notas detalhadas sobre as alterações estão disponíveis atualmente em inglês.
-
As notas detalhadas sobre as alterações estão disponíveis atualmente em inglês.
Não é possível fazer a comparação completa — nenhum instantâneo anterior foi arquivado para esta revisão.