SEO para Nuxt

O Nuxt oferece renderização no lado do servidor por padrão, mas isso é uma configuração por rota, não uma garantia — os rastreadores recebem HTML completo apenas nas rotas que mantêm esse comportamento. Modos de renderização, useSeoMeta(), o toolkit @nuxtjs/seo, hidratação e ressalvas do Nitro, Core Web Vitals e os erros que reduzem seu desempenho sem chamar atenção.

Publicado pela primeira vez: 26 de jun. de 2026 · Última atualização: 3 de set. de 2026 · Avançado
1 sinal de evidência nesta página

O Nuxt renderiza páginas no servidor por padrão, então uma rota que mantém esse padrão oferece aos rastreadores um documento HTML completo em vez do shell vazio de uma SPA Vue comum — mas é uma configuração por rota: routeRules ou um ssr:false global podem transformar qualquer rota em CSR, portanto verifique a rota real em vez de presumir pelo nome do framework. A decisão fundamental é o modo de renderização por rota — SSR (padrão), SSG via nuxt generate ou regras híbridas — porque meta tags, schema e sitemaps vêm depois disso. Use useSeoMeta() para metadados, trate o pacote @nuxtjs/seo de Harlan Wilton como toolkit opcional de terceiros (não parte do núcleo do Nuxt) para robots/sitemap/OG/schema/canonical, nunca recorra à renderização dinâmica (o Google a descontinuou), verifique hidratação/payload e o comportamento de preset de implantação/cache do Nitro separadamente do HTML do servidor e lembre que os contratos de renderização de rastreadores de IA variam por provedor — SSR/SSG coloca o conteúdo no HTML bruto e maximiza a cobertura.

TL;DR — O padrão do Nuxt é a renderização no servidor, então uma rota que mantém esse padrão recebe um DOM completo em vez do shell vazio que um SPA Vue puro entrega — mas isso é um resultado por rota: ssr: false ou uma substituição de routeRules pode transformar qualquer rota em CSR ou híbrido, então teste a rota real, não o nome do projeto. A estratégia de renderização é a decisão fundamental — SSR (padrão), SSG (nuxt generate) ou routeRules híbrido — porque meta, schema e sitemaps vêm depois dela. Use useSeoMeta() para meta tags (useHead() para o resto do head, variantes somente no servidor quando você não precisa de reatividade), e trate o pacote @nuxtjs/seo do Harlan Wilton como um kit de ferramentas de terceiros opcional para robots/sitemap/OG/schema/canonical — não faz parte do núcleo do Nuxt, e não é prova de que sua saída está correta até você verificar. Nunca use renderização dinâmica (o Google a descontinuou). A renderização para rastreadores de IA varia por provedor — SSR/SSG maximiza a cobertura de HTML bruto. Além do HTML inicial, verifique hidratação/payload, presets de implantação e cache do Nitro, e o status HTTP direto de forma independente — o HTML do servidor sozinho não prova nenhum desses. As regras usuais de SEO para JavaScript ainda se aplicam: links reais <a href>, não bloqueie JS/CSS, observe o HTML renderizado vs. bruto.

Nuxt é a resposta do Vue para o problema de SPA

Vue, por si só, entrega um aplicativo de página única: um shell HTML mais JavaScript que monta o DOM no navegador. Nuxt é o meta-framework sobre Vue (rodando no motor de servidor Nitro no Nuxt 3, com Nuxt 4 seguindo em 2025), e toda a sua razão de existir — do ponto de vista de SEO — é que ele renderiza no servidor por padrão. Cada página chega como um documento HTML totalmente formado, que é exatamente o que o Googlebot quer ler sem ter que executar JavaScript primeiro. SEO de Vue puro é um tópico próprio com seus próprios modos de falha; aqui estou assumindo que você escolheu Nuxt justamente para não ter que lutar contra o problema de SPA.

Este é o mesmo ponto que faço sobre JavaScript em geral: “qualquer configuração de SSR, renderização estática ou pré-renderização vai funcionar bem para mecanismos de busca. Gatsby, Next, Nuxt, etc., são todos ótimos.” Os padrões do Nuxt estão apontados na direção certa. A maioria dos problemas de SEO com Nuxt são pessoas desligando esses padrões, ou empilhando erros por cima deles.

A estratégia de renderização é a base — decidida por rota, não por projeto

Antes de meta tags, antes de schema, antes de sitemaps, a pergunta que decide tudo é como o HTML é produzido para esta rota específica? O Nuxt documenta a renderização universal (no servidor) como o padrão de todo o aplicativo, mas esse padrão não é uma garantia no nível da rota: um ssr: false global muda todo o aplicativo para renderização no cliente, e routeRules pode atribuir um modo diferente a qualquer padrão de URL. “Este é um aplicativo Nuxt” não te diz nada sobre como uma página específica renderiza — você tem que verificar a rota. O Nuxt oferece cinco estratégias:

ModoComo você defineImpacto no SEOMelhor para
Universal / SSRPadrão (ssr: true)Excelente — HTML completo a cada requisiçãoConteúdo dinâmico e personalizado
Estático / SSGnuxt generateExcelente — HTML construído no momento da implantaçãoBlogs, documentação, marketing
HíbridorouteRules por rotaExcelente — mistura por rotaSites grandes com conteúdo misto
SPA / CSRssr: falseRuim para conteúdo indexadoPainéis de controle, painéis administrativos
Edge-sideAlvo de implantaçãoExcelente — TTFB baixoPerformance global

A documentação oficial do Nuxt é direta sobre por que a renderização no lado do cliente é a escolha errada para conteúdo: “Indexar e atualizar o conteúdo entregue via renderização no lado do cliente leva mais tempo”, enquanto com a renderização no servidor (universal) “os rastreadores da web podem indexar diretamente o conteúdo da página.” Evidência desta afirmação Nuxt documents that universal rendering delivers HTML content immediately and allows crawlers to index it directly. Escopo: Nuxt rendering; no indexing guarantee. Confiança: alta · Verificado: Nuxt: Rendering modes (Documentação de renderização do Nuxt.) CSR (ssr: false) é posicionado para back-office, dashboards e jogos — não para qualquer coisa que você queira indexada.

A renderização híbrida é a jogada de mestre para sites grandes. Regras de rota em nuxt.config.ts permitem definir o modo de renderização e cache por padrão de URL:

routeRules: {
  '/blog/**':     { prerender: true },        // SSG for the blog
  '/product/**':  { swr: 3600 },              // ISR-style: regenerate hourly
  '/admin/**':    { ssr: false },             // SPA for the admin area
  '/checkout/**': { ssr: true },              // always-fresh SSR
}

swr (stale-while-revalidate) e isr (regeneração estática incremental) geram uma página estaticamente e depois a atualizam em segundo plano — ideal para e-commerce com alto número de páginas ou notícias onde uma reconstrução completa a cada alteração não é prática. Nuxt Islands (<NuxtIsland>) renderizam componentes sem enviar JavaScript do lado do cliente, reduzindo o custo de hidratação e ajudando o INP — a Core Web Vital que mais frequentemente é o problema em aplicativos Nuxt.

Como verificar o que você realmente enviou: View Source mostra o HTML bruto que o servidor enviou; se o seu conteúdo estiver lá, você está renderizando no servidor. O painel Elements do DevTools mostra o DOM renderizado. E a ferramenta URL Inspection do GSC mostra o que o Google realmente buscou e renderizou — a fonte da verdade. Não confie em “parece bom no meu navegador.”

Como o Googlebot lida com um aplicativo Nuxt

O Google processa qualquer aplicativo JavaScript em três fases — rastreamento, renderização, indexação — e o problema é o tempo: a renderização acontece em uma fila, não instantaneamente. Como eu disse no meu guia de SEO para JavaScript, o renderizador é paciente — “não há um tempo limite fixo para o renderizador… Ele é realmente paciente, e você não deve se preocupar.” Mas paciente não é o mesmo que rápido para conteúdo novo. Se você enviar uma página renderizada no cliente, seu conteúdo não existe para o Google até que essa onda de renderização seja executada; SSR e SSG fecham essa lacuna porque o HTML está completo na primeira busca.

Mais duas coisas importam em escala. Renderizar JavaScript é caro — da minha palestra de 2019 JavaScript SEO (Ungagged), os custos de rastreamento aumentam em cerca de 20× quando o Google precisa renderizar (direcional, mas a ordem de grandeza ainda se mantém). E o Google adota a diretiva mais restritiva entre o HTML bruto e o renderizado — então um noindex injetado por JavaScript vencerá um index no HTML bruto, e vice-versa. Um canonical injetado via JavaScript é respeitado apenas se não houver um canonical no HTML bruto já. Mantenha seus sinais de robots e canonical no HTML renderizado no servidor, o que o Nuxt faz por você quando o SSR está ativado.

A realidade dos rastreadores de IA

Esta é a novidade de 2026. Rastreadores de IA — GPTBot, ClaudeBot, PerplexityBot e os demais — geralmente não executam JavaScript de forma alguma. Eles indexam o HTML bruto e nada mais. Portanto, uma página Nuxt renderizada no cliente é efetivamente invisível para os mecanismos de resposta de IA. SSR ou SSG não é apenas melhor para o Google aqui; é o preço de entrada para a otimização para mecanismos de resposta também. Se você quer que seu conteúdo seja citado pelo ChatGPT, Perplexity ou Claude, ele precisa estar no HTML na primeira busca.

Além do HTML inicial: payload, hidratação e códigos de status

Obter HTML do servidor com seu conteúdo é necessário, mas não suficiente — várias coisas ainda podem dar errado depois dessa primeira resposta, e “eu verifiquei o View Source” não cobre isso:

  • Payload e hidratação. A renderização universal envia o HTML e um payload de dados serializado que o cliente usa para hidratar — anexar ouvintes de eventos e continuar de onde o servidor parou — sem buscar novamente. O HTML do servidor parecer correto não prova que a hidratação foi bem-sucedida, que a navegação do cliente reproduz o mesmo conteúdo ou que o payload não está desatualizado. Se uma página parece boa no primeiro carregamento, mas quebra após uma mudança de rota no lado do cliente, isso é um problema de hidratação/payload, não um problema de modo de renderização.
  • <ClientOnly> e conteúdo somente no navegador. Envolver algo em <ClientOnly> — comum para widgets que dependem de APIs do navegador — significa que está ausente na resposta do servidor, mesmo em uma rota universal. Se o seu conteúdo principal, um link importante ou suas meta tags acabarem dentro de um limite somente do cliente, rastreadores e bots de IA que apenas leem o HTML bruto não o verão, independentemente da sua configuração de modo de renderização. Inspecione a resposta real, não apenas a configuração do modo de renderização.
  • Códigos de status e redirecionamentos não são autocertificáveis. Uma página de erro do Nuxt renderizada no navegador, ou um redirecionamento orientado por navigateTo()/composable, não prova por si só qual status HTTP a resposta direta do servidor enviou. A orientação do Google é explícita de que códigos de status significativos importam para rastreamento e indexação — confirme o cabeçalho real com curl -I, não o que a página de erro renderizada no cliente exibe.

Nada disso é um argumento contra a renderização universal — é o lembrete de que “o HTML é renderizado no servidor” é a primeira verificação, não a última.

Nitro, presets de implantação e limites de cache

A saída do servidor do Nuxt é construída pelo Nitro, e o Nitro compila de forma diferente dependendo do preset de implantação que você segmenta (servidor Node, Cloudflare, Vercel, Netlify, estático e outros). Isso importa para SEO porque presets e adaptadores podem diferir nas APIs de runtime disponíveis, comportamento de cache, suporte a streaming, implantação regional e acesso ao sistema de arquivos — uma regra de rota ou manipulador de servidor que funciona sob um preset não é garantido que se comporte de forma idêntica sob outro. Duas consequências que valem a pena testar explicitamente em vez de assumir:

  • Chaves de cache e invalidação são específicas da rota, não automáticas. Regras de rota swr e isr armazenam em cache e regeneram a saída, mas uma chave de cache errada, invalidação ausente ou um cabeçalho de cache definido pela sua plataforma de implantação pode servir HTML desatualizado, personalizado ou inconsistente para rastreadores. Verifique a idade real da resposta e quaisquer cabeçalhos Cache-Control/Age em uma URL ao vivo, não apenas a configuração routeRules.
  • A paridade de produção não é garantida pelo comportamento de staging. Uma rota renderizando corretamente no dev local ou em uma implantação de preview não confirma que o preset de produção produz a mesma saída — rotas de servidor, redirecionamentos e tratamento de erros vivem na camada de servidor do Nitro, e essa camada é a parte mais provável de diferir por destino. Teste a URL de produção diretamente após qualquer mudança de implantação, da mesma forma que você verificaria o modo de renderização.

Meta tags: useSeoMeta() e useHead()

O gerenciamento de head do Nuxt roda no Unhead, e ele oferece dois composables para trabalhos diferentes.

useSeoMeta() é o que você deve usar para SEO e meta tags sociais. É uma API plana e type-safe com parâmetros tipados. Evidência desta afirmação useSeoMeta is a typed Nuxt API for SEO and social meta tags. Escopo: Current Nuxt composable. Confiança: alta · Verificado: Nuxt: useSeoMeta Ela ajuda a evitar o clássico bug do Open Graph de usar name onde você precisava de property:

useSeoMeta({
  title: 'My Page Title',
  ogTitle: 'My Page Title',
  description: 'Concise page-specific description with the key information first',
  ogDescription: 'Concise social description tailored to this page',
  ogImage: 'https://mysite.com/og-image.png', // must be an absolute URL
  twitterCard: 'summary_large_image',
})

useHead() é a ferramenta de head de uso geral para todo o resto — scripts, tags de link, atributos de body e modelos de título:

useHead({
  titleTemplate: '%s · My Site Name',
  htmlAttrs: { lang: 'en' },
})

O padrão confiável de camadas é: padrões estáticos (charset, viewport, favicon) em nuxt.config.ts → modelo de título para todo o site e padrões globais de OG em app.vue → substituições específicas de página via useSeoMeta() no componente da página. Um erro comum é colocar useSeoMeta() em um layout em vez da página, o que sobrescreve tags específicas da página com tags genéricas. E como os mecanismos de busca leem o carregamento inicial, as meta tags de SEO geralmente não precisam ser reativas — useServerHead() pula a reexecução no lado do cliente.

Qual API, e o que ela realmente prova:

APIEscopoReativa?O que ela prova sobre a saída
useSeoMeta()Apenas meta de SEO/social plana e tipadaSim (padrão)Define propriedades tipadas corretamente — não que a rota seja única, canônica ou indexável; você ainda é responsável por essa lógica
useHead()Qualquer coisa em <head> — scripts, links, atributos, modelo de títuloSim (padrão)Controle geral do head; mesma ressalva — o uso da API não é prova de uma resposta correta do servidor
useServerHead() / chamadas somente no servidorIgual ao acimaNão — somente no servidor, pula a reexecução no clienteConfirma que a tag é enviada uma vez no HTML do servidor; não confirma que a navegação no cliente a redefine se você depender dela lá

Chamar um desses composables informa que a API foi executada — isso por si só não informa o que uma resposta direta do servidor ou uma mudança de rota no lado do cliente realmente emite. Confirme com Ver código-fonte ou curl, não apenas “Eu chamei useSeoMeta().”

O ecossistema de módulos @nuxtjs/seo (Harlan Wilton) — opcional, não essencial

O núcleo do Nuxt não inclui um sitemap, um robots.txt, geração de imagens OG ou Schema.org por padrão — esses estão fora das primitivas do próprio Nuxt (useHead, useSeoMeta, regras de rota, modos de renderização). A comunidade preenche essa lacuna com o @nuxtjs/seo de Harlan Wilton — um pacote guarda-chuva de terceiros, instalado separadamente (nuxtseo.com, atualmente na v5.x, mantido ativamente, direcionado ao Nuxt 3,16+ e Nuxt 4) que agrupa seis módulos. Instalá-lo fornece geração de sitemap, robots, imagem OG e schema — isso por si só não garante que a saída esteja correta para suas rotas; verifique o que ele produz da mesma forma que verificaria qualquer outra coisa:

MóduloO que ele faz
@nuxtjs/robotsrobots.txt + meta robots + cabeçalhos X-Robots-Tag
@nuxtjs/sitemapSitemaps XML automáticos a partir de páginas + rotas dinâmicas
nuxt-og-imageImagens OG dinâmicas (um template Vue → uma imagem)
nuxt-schema-orgDados estruturados Schema.org JSON-LD
nuxt-seo-utilsURLs canônicas, breadcrumbs, padrões
nuxt-link-checkerDetecção de links quebrados em tempo de build

Instale o pacote inteiro com npx nuxt module add seo, ou pegue módulos individuais (npx nuxt module add sitemap robots). Alguns comportamentos que vale a pena conhecer:

  • @nuxtjs/sitemap gera automaticamente a partir do seu diretório pages/ mais rotas dinâmicas, divide em um índice de sitemap automaticamente após 50 000 URLs, suporta sitemaps multilíngues com i18n e tem suporte integrado ao IndexNow. Uma coisa para acertar: o Google ignora changefreq e priority; apenas um lastmod preciso importa, e somente quando o conteúdo realmente muda.
  • @nuxtjs/robots gera robots.txt, a meta tag robots e o cabeçalho X-Robots-Tag — e por padrão ele desautoriza todos os rastreadores em ambientes não de produção, que é exatamente a armadilha de indexação em staging que afeta builds headless. Ele também oferece regras por bot, então você pode bloquear o GPTBot especificamente enquanto deixa todos os outros em paz (seja intencional — bloqueie um rastreador de IA e ele não vai citar você).
  • nuxt-seo-utils lida com URLs canônicas e, utilmente, remove parâmetros de rastreamento (utm_*, fbclid, gclid) das canônicas automaticamente.

nuxt/image e Core Web Vitals

@nuxt/image é o módulo de imagens: srcset responsivo automático, formatos modernos (WebP/AVIF), otimização integrada por meio de provedores de CDN e carregamento preguiçoso. Duas regras carregam a maior parte do valor de SEO:

  • Nunca faça lazy-load da imagem LCP. Sua imagem hero deve carregar com eager; fazer lazy-load atrasa seu Largest Contentful Paint.
  • Sempre defina width e height para que o navegador reserve espaço e você não sofra um impacto de Cumulative Layout Shift.
<NuxtImg
  src="/hero.jpg"
  width="1200"
  height="630"
  alt="Descriptive alt text"
  :loading="isHeroImage ? 'eager' : 'lazy'"
  format="webp"
/>

As metas de 2026 a buscar (p75): LCP ≤ 2,5 s, INP ≤ 200 ms, CLS ≤ 0,1. Em apps Nuxt, INP é o que tende a sofrer porque a hidratação cria atraso de entrada — que é exatamente para isso que servem Nuxt Islands e <NuxtIsland>.

Nuxt Content + SEO

Se você está usando @nuxt/content (o módulo de conteúdo markdown/MDX), a integração com @nuxtjs/seo é direta, mas tem um detalhe de ordem: carregue @nuxtjs/seo antes de @nuxt/content no seu array de módulos. Você pode então definir SEO no frontmatter do conteúdo (title, description, robots, ogImage, schemaOrg) e puxá-lo para o seu template [slug].vue com useSeoMeta() após buscar o conteúdo. Este é a versão nativa do Nuxt do padrão headless-CMS, e a mesma disciplina de “reconstruir o que o plugin fez” se aplica.

Erros comuns de SEO no Nuxt

  1. Usar o modo SPA (ssr: false) para conteúdo que você quer indexado. O erro mais caro — e o que te torna invisível para crawlers de IA.
  2. URLs relativas para imagens OG. ogImage deve ser uma URL absoluta ou as prévias sociais quebram.
  3. useSeoMeta() em um layout em vez da página — tags genéricas sobrescrevem as específicas da página.
  4. Não verificar o HTML renderizado — View Source ≠ DevTools ≠ o que o Google renderizou. Use URL Inspection.
  5. Bloquear JS/CSS no robots.txt — o Google não renderiza a partir de arquivos bloqueados.
  6. Deixar o noindex/disallow de staging no lugar após o lançamento (ou, inversamente, esquecer que @nuxtjs/robots bloqueia não-prod por padrão e se perguntar por que prod está ok, mas um env customizado não está).
  7. Fazer lazy-load da imagem LCP — derruba seu LCP.
  8. Faltando width/height nas imagens — CLS.
  9. changefreq/priority em sitemaps — o Google os ignora; apenas lastmod conta.
  10. Recorrer a dynamic rendering. O Google depreciou isso — “dynamic rendering is a workaround and not a long-term solution” (tradução) «dynamic rendering é um workaround e não uma solução de longo prazo» — e isso só serve para os mecanismos que você configurar, perdendo Bing e todo crawler de IA. Com Nuxt você nunca precisa disso: SSR e SSG já entregam HTML completo para crawlers.

llms.txt e AEO

llms.txt é um arquivo de texto simples — primo do robots.txt — que ajuda ferramentas de IA a navegar seu conteúdo. O módulo nuxt-llms gera automaticamente /llms.txt e /llms-full.txt a partir do Nuxt Content. Desde o final de 2025, seus principais consumidores são servidores MCP e ferramentas de codificação com IA (Cursor, Claude Code), em vez de ChatGPT ou Perplexity diretamente, e é mais útil para sites de documentação e blogs técnicos — menos para e-commerce ou notícias. Vale a pena adicionar se você tem um site de docs/dev; não é prioridade caso contrário.

Onde isso se encaixa

SEO no Nuxt é realmente uma aplicação concreta de JavaScript SEO através das próprias convenções do Nuxt — e se sobrepõe fortemente ao tópico SEO para CMS headless quando seu frontend Nuxt puxa de um backend headless. Os princípios não mudam; o Nuxt apenas oferece bons padrões e um ecossistema forte de módulos para implementá-los.

Adicionar uma nota de especialista

Fixar uma citação de especialista

É uma pessoa nova? Crie o perfil não reivindicado dela em /admin/experts/ → Fixar uma citação de especialista primeiro.