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.
Idiomas
1 sinal de evidência nesta página
- Ferramenta relacionada ativaCore Web Vitals History & Competitor Comparison
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 — Nuxt é the framework criado on top de Vue, e it’s good para SEO para one main motivo: on a rota that keeps the padrão, it builds páginas on the server, so mecanismos de busca get a finished HTML página instead de a blank one they’d têm para fill in themselves. That’s a por rota setting, não a site-wide guarantee —
routeRulesou a globalssr: falsepode turn any given rota back em a plain-Vue-style empty shell. Check the rota real, não apenas the project name. The most importante choice you’ll fazer é how each rota gets rendered; everything else (meta tags, sitemaps) comes depois that.
Por que o Nuxt é bom para SEO — nas rotas que mantêm o padrão
Vue, on its own, builds a single-página app: the server sends an almost-empty HTML shell, e JavaScript fills in the conteúdo once it runs in the browser. That’s tricky para search, porque the página looks empty until the JavaScript executes.
Nuxt é Vue’s “meta-framework” — a fuller toolkit criado around Vue — e its
padrão corrige that problema. Nuxt renders your páginas on the server first
(renderização no lado fazer servidor, ou SSR), so when Google ou a visitor asks para a página
on a rota that hasn’t been switched off SSR, they get the complete HTML right
away. Evidence for this claim Nuxt universal rendering returns server-rendered HTML to the browser by default. Scope: Nuxt default universal rendering. Confidence: high · Verified: Nuxt: Rendering modes No waiting para JavaScript. That’s the single
biggest motivo a Nuxt site pode ser easier para get indexado than a plain Vue app —
mas it’s a rota-by-rota outcome, não something the framework name guarantees.
A rota com ssr: false, ou one that leans on <ClientOnly> para its main
conteúdo, gives up that advantage e ships the mesmo empty-shell problema plain
Vue tem.
A decisão mais importante: renderização por rota
When someone asks para a specific página, where faz its HTML get criado? That’s a
routeRules-level question, não a em todo o projeto one — a Nuxt app pode mix modes
across rotas. Nuxt gives you a few options:
- Server-side rendering (SSR) — the padrão. The server builds the full página on every solicitação. Great para SEO.
- Static generation (SSG) — run
nuxt generatee Nuxt builds all your páginas em plain HTML arquivos ahead de time. Also great para SEO, e perfect para blogs e docs that don’t change every minute. - SPA mode — the página é criado in the browser, like plain Vue. Avoid this para anything you want found in search.
The good news é the padrões são already pointed the right way. You em sua maioria têm para evitar switching them off.
Adicionando títulos e meta tags
In Nuxt you set your página título e meta descrição com a criado-in function called
useSeoMeta(). Evidence for this claim Nuxt provides useSeoMeta for defining SEO and social metadata. Scope: Current Nuxt composable. Confidence: high · Verified: Nuxt: useSeoMeta You drop it em a página e pass in your título, descrição, e
social-share image:
useSeoMeta({
title: 'My Page Title',
description: 'A concise, page-specific summary with the key information first',
})That’s the modern, recommended way. (There’s an older function called useHead()
that ainda funciona e é usado para other things in the página’s <head>, mas para SEO
meta tags reach para useSeoMeta().) Google tem no fixed meta-descrição character
limit; snippets são query-dependent e truncated para fit the device, so preview
páginas importantes in their intended language e script instead de coding para a quota.
O complemento opcional: os módulos de SEO fazer Nuxt
Nuxt core doesn’t generate a robots.txt, an XML sitemap, social-share images,
structured dados, ou canonical URLs — those são jobs para separado, opcional
packages, não something nuxt.config.ts gives you by padrão. A developer named
Harlan Wilton maintains a gratuito, comunidade bundle de those packages — installed as
@nuxtjs/seo — that covers all de them at once. It’s a third-party toolkit, não
part de Nuxt itself, so installing it doesn’t automatically fazer any de that
output correct; you ainda confirm the sitemap, robots rules, e schema it
generates match what you realmente want.
O que as pessoas entendem errado
People assume “Vue/Nuxt can’t be in Google.” That era sort de verdadeiro para plain Vue apps years ago — it isn’t verdadeiro para Nuxt com its server rendering. The real erros são things like turning SSR off by accident, ou blocking your JavaScript arquivos so Google pode’t criar the página.
Want the deeper version — the full menu de modos de renderização, the module ecosystem in detail, Core Web Vitals, e the comum erros com corrige? Switch para the Avançado tab.
TL;DR — Nuxt’s padrão é renderização no lado fazer servidor, so a rota that keeps that padrão gets a complete DOM instead de the empty shell a plain Vue SPA ships — mas that’s a por rota outcome:
ssr: falseou arouteRulesoverride pode turn any rota em CSR ou hybrid, so test the rota real, não the project name. Rendering strategy é the foundational decision — SSR (padrão), SSG (nuxt generate), or hybridrouteRules— porque meta, schema, e sitemaps all come depois it. UseuseSeoMeta()para meta tags (useHead()para the rest de the head, server-apenas variants when you don’t need reactivity), e treat Harlan Wilton’s@nuxtjs/seobundle as an opcional third-party toolkit para robots/sitemap/OG/schema/canonical — não part de Nuxt core, e não proof its output é correct until you verificar it. Never usar dynamic rendering (Google deprecated it). AI-rastreador rendering varies by provedor — SSR/SSG maximizes raw-HTML coverage. Beyond the initial HTML, verify hidratação/payload, Nitro implantação presets e caching, e direct HTTP status independently — server HTML alone doesn’t prove any de those. The usual JS-SEO rules ainda apply: real<a href>links, don’t block JS/CSS, watch rendered vs. HTML bruto.
O Nuxt é a resposta fazer Vue ao problema das SPAs
Vue, by itself, ships a single-página application: an HTML shell plus JavaScript that builds the DOM in the browser. Nuxt é the meta-framework on top de Vue (running on the Nitro server engine in Nuxt 3, com Nuxt 4 following in 2025), e its whole motivo para existing — de an SEO standpoint — é that it renders on the server by padrão. Every página arrives as a fully-formed HTML document, which é exactly what Googlebot wants para ler sem having para execute JavaScript first. Plain Vue SEO é its own topic com its own failure modes; here I’m assuming you’ve picked Nuxt precisely so you don’t têm para fight the SPA problema.
This é the mesmo point I fazer about JavaScript generally: “any kind of SSR, static rendering, and prerendering setup is going to be fine for search engines. Gatsby, Next, Nuxt, etc., are all great.” Nuxt’s padrões são pointed the right way. Most Nuxt SEO problemas são people turning those padrões off, ou layering erros on top de them.
A estratégia de renderização é a base — decidida por rota, não por projeto
Before meta tags, antes schema, antes sitemaps, the question that decides
everything é how faz the HTML get produced para this specific rota? Nuxt
documents universal (server) rendering as the app-wide padrão, mas that padrão
isn’t a rota-level guarantee: a global ssr: false switches the whole app para
client rendering, e routeRules pode assign a diferente mode para any URL
pattern. “This is a Nuxt app” tells you nothing about how one particular página
renders — you têm para verificar the rota. Nuxt gives you five strategies:
| Mode | How you set it | SEO impact | Best para |
|---|---|---|---|
| Universal / SSR | Default (ssr: true) | Excellent — full HTML every solicitação | Dynamic, personalized conteúdo |
| Static / SSG | nuxt generate | Excellent — HTML criado at deploy time | Blogs, docs, marketing |
| Hybrid | routeRules por rota | Excellent — mix por rota | Large mixed-conteúdo sites |
| SPA / CSR | ssr: false | Poor para indexado conteúdo | Dashboards, admin panels |
| Edge-side | Deployment target | Excellent — low TTFB | Global performance |
The official Nuxt docs são blunt about why client-side rendering é the wrong choice
para conteúdo: “Indexing and updating the content delivered via client-side rendering
takes more time”, whereas com server (universal) rendering “web crawlers can
directly index the page’s content.” Evidence for this claim Nuxt documents that universal rendering delivers HTML content immediately and allows crawlers to index it directly. Scope: Nuxt rendering; no indexing guarantee. Confidence: high · Verified: Nuxt: Rendering modes
(Nuxt rendering docs.) CSR
(ssr: false) é positioned para back-office, dashboards, e games — não anything
you want indexado.
Hybrid rendering é the power move para grande sites. Route rules in
nuxt.config.ts let you set the rendering e caching mode per URL pattern:
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 (incremental static regeneration) generate
a página statically then refresh it in the background — ideal para high página-count
e-commerce ou news where a full rebuild on every change isn’t practical. Nuxt
Islands (<NuxtIsland>) render components sem shipping client-side JavaScript,
cutting hidratação cost e helping INP — the Core Web Vital that’s most often the
problema on Nuxt apps.
How para verify what you realmente shipped: View Source shows the HTML bruto the server sent; if your conteúdo é there, you’re server-rendering. DevTools’ Elements panel shows the rendered DOM. And GSC’s URL Inspection tool shows what Google realmente buscado e rendered — the source de truth. Don’t confiar “it looks fine in my browser.”
Como o Googlebot lida com um app Nuxt
Google processes any JavaScript app in three phases — rastrear, render, index — e the catch é timing: rendering happens in a queue, não instantly. As I put it in my JavaScript SEO guia, the renderer é patient — “there is no fixed timeout for the renderer… It’s really patient, and you should not be concerned.” But patient isn’t the mesmo as fast para fresh conteúdo. If you ship a client-rendered página, your conteúdo doesn’t exist para Google until that render wave runs; SSR e SSG close that gap porque the HTML é complete on the first buscar.
Two more things importar at scale. Rendering JavaScript é expensive — de my 2019
JavaScript SEO talk (Ungagged), rastrear costs go up by roughly 20× once Google tem para render
(directional, mas the order de magnitude ainda holds). And Google takes the most
restrictive directive across raw e rendered HTML — so a noindex injected by
JavaScript vai win sobre an index in the HTML bruto, e vice versa. A canonical
injected via JavaScript é respected apenas if there’s no canonical in the HTML bruto
already. Keep your robots e canonical signals in the renderizado no servidor HTML, which
Nuxt faz para you when SSR é on.
A realidade dos rastreadores de IA
This é the 2026 wrinkle. AI rastreadores — GPTBot, ClaudeBot, PerplexityBot, e the rest — generally don’t execute JavaScript at all. They index the HTML bruto e nothing else. So a client-rendered Nuxt página é effectively invisible para AI answer engines. SSR ou SSG isn’t apenas better para Google here; it’s the price de entry para answer engine optimization too. If you want your conteúdo cited by ChatGPT, Perplexity, ou Claude, it tem para ser in the HTML on first buscar.
Além fazer HTML inicial: payload, hidratação e códigos de status
Getting server HTML com your conteúdo in it é necessário mas não sufficient — several things pode ainda go wrong downstream de that first response, e “I checked View Source” doesn’t cover them:
- Payload e hidratação. Universal rendering sends the HTML e a serialized dados payload the client usa para hydrate — attach event listeners e pick up where the server left off — sem re-busca. Server HTML looking right doesn’t prove hidratação succeeded, that client navigation reproduces the mesmo conteúdo, ou that the payload isn’t stale. If a página feels fine on first load mas breaks depois a client-side rota change, that’s a hidratação/payload problema, não a rendering-mode problema.
<ClientOnly>e browser-apenas conteúdo. Wrapping something in<ClientOnly>— comum para browser-API-dependent widgets — significa it’s absent de the server response even on an otherwise-universal rota. If your main conteúdo, a key link, ou your meta tags end up inside a client-apenas boundary, rastreadores e AI bots that apenas ler the HTML bruto miss it, regardless de your modo de renderização setting. Inspect the real response, não apenas the rendering mode config.- Status codes e redirects aren’t self-certifying. A Nuxt error página
rendering in the browser, ou a
navigateTo()/composable-driven redirect, doesn’t by itself prove what HTTP status the direct server response sent. Google’s orientação é explicit that meaningful códigos de status importar para rastreamento e indexação — confirm the real header comcurl -I, não what the client-rendered error página displays.
None de this é an argument against universal rendering — it’s the reminder that “the HTML is server-rendered” é the first verificar, não the last one.
Nitro, presets de implantação e limites de cache
Nuxt’s server output é criado by Nitro, e Nitro compiles differently depending on the implantação preset you target (Node server, Cloudflare, Vercel, Netlify, static, e others). That importa para SEO porque presets e adapters pode differ in runtime APIs available, caching behavior, streaming suporte, regional implantação, e filesystem acesso — a rota rule ou server handler that funciona sob one preset isn’t guaranteed para behave identically sob another. Two consequences worth testing explicitly em vez disso than assuming:
- Cache keys e invalidation são rota-specific, não automatic.
swreisrrota rules cache e regenerate output, mas a wrong cache key, missing invalidation, ou a caching header set by your implantação platform pode servir stale, personalized, ou inconsistent HTML para rastreadores. Check the real response age e anyCache-Control/Ageheaders on a live URL, não apenas therouteRulesconfig. - Production parity isn’t guaranteed by staging behavior. A rota rendering correctly in local dev ou a preview implantação doesn’t confirm the production preset produces the mesmo output — server rotas, redirects, e error handling live in Nitro’s server layer, e that layer é the part most likely para differ by target. Test the production URL diretamente depois any implantação change, the mesmo way you’d verify modo de renderização.
Meta tags: useSeoMeta() e useHead()
Nuxt’s head management runs on Unhead, e it gives you two composables para diferente jobs.
useSeoMeta() é the one para reach para para SEO e social meta tags. It’s a flat,
type-safe API com typed parameters. Evidence for this claim useSeoMeta is a typed Nuxt API for SEO and social meta tags. Scope: Current Nuxt composable. Confidence: high · Verified: Nuxt: useSeoMeta It ajuda evitar the classic Open Graph
bug de usando name where you needed 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() é the general-finalidade head tool para everything else — scripts, link
tags, body attributes, e título templates:
useHead({
titleTemplate: '%s · My Site Name',
htmlAttrs: { lang: 'en' },
})The reliable layering pattern é: static padrões (charset, viewport, favicon) in
nuxt.config.ts → site-wide título template e global OG padrões in app.vue →
página-specific overrides via useSeoMeta() in the página component. A comum bug é
putting useSeoMeta() in a layout instead de the página, which overwrites specific
página tags com generic ones. And since mecanismos de busca ler the initial load, SEO meta
generally doesn’t need para ser reactive — useServerHead() skips the client-side
re-execution.
Qual API usar e o que ela realmente comprova:
| API | Scope | Reactive? | What it proves about output |
|---|---|---|---|
useSeoMeta() | Flat, typed SEO/social meta apenas | Yes (padrão) | Sets typed properties correctly — não that the rota é unique, canonical, ou indexable; you ainda own that logic |
useHead() | Anything in <head> — scripts, links, attrs, título template | Yes (padrão) | General head controlar; mesmo caveat — API usar isn’t proof de a correct server response |
useServerHead() / server-apenas calls | Same as above | No — server apenas, skips client re-execution | Confirms the tag ships once in server HTML; doesn’t confirm client navigation re-sets it if you rely on it there |
Calling one de these composables tells you the API ran — it doesn’t by itself dizer you what a direct server response ou a client-side rota change realmente emits. Confirm com View Source ou curl, não apenas “I called 0.”
O ecossistema fazer módulo @nuxtjs/seo (Harlan Wilton) — opcional, não parte fazer núcleo
Nuxt core doesn’t ship a sitemap, a robots.txt, OG image generation, ou
Schema.org out de the box — those são outside Nuxt’s own primitives (useHead,
useSeoMeta, rota rules, modos de renderização). The comunidade fills that gap com
Harlan Wilton’s @nuxtjs/seo — a separately-installed, third-party umbrella
package (nuxtseo.com, currently at v5.x, actively mantido, targeting Nuxt
3,16+ e Nuxt 4) that bundles six modules. Installing it gives you sitemap,
robots, OG-image, e schema generation — it doesn’t by itself guarantee the
output é correct para your rotas; verify what it produces the mesmo way you’d
verify anything else:
| Module | What it faz |
|---|---|
@nuxtjs/robots | robots.txt + meta robots + X-Robots-Tag headers |
@nuxtjs/sitemap | Auto XML sitemaps de páginas + dynamic rotas |
nuxt-og-image | Dynamic OG images (a Vue template → an image) |
nuxt-schema-org | Schema.org JSON-LD structured dados |
nuxt-seo-utils | Canonical URLs, breadcrumbs, padrões |
nuxt-link-checker | Build-time broken-link detection |
Install the whole bundle com npx nuxt module add seo, ou grab individual modules
(npx nuxt module add sitemap robots). A few behaviors worth knowing:
@nuxtjs/sitemapauto-generates de yourpages/directory plus dynamic rotas, splits em a sitemap index automatically past 50 000 URLs, oferece suporte i18n multi-language sitemaps, e tem criado-in IndexNow suporte. One thing para get right: Google ignoreschangefreqepriority; apenas an accuratelastmodimporta, e apenas when conteúdo de fato changes.@nuxtjs/robotsgeneratesrobots.txt, the robots meta tag, e theX-Robots-Tagheader — e by padrão it disallows all rastreadores on non-production environments, which é exactly the staging-indexation footgun that bites headless builds. It também gives you per-bot rules, so you pode block GPTBot specifically while leaving everyone else alone (ser intentional — block an AI rastreador e it won’t cite you).nuxt-seo-utilshandles canonical URLs e, usefully, strips tracking parameters (utm_*,fbclid,gclid) de canonicals automatically.
nuxt/image e Core Web Vitals
@nuxt/image é the image module: automatic responsive srcset, modern formats
(WebP/AVIF), criado-in optimization por meio de CDN provedores, e lazy loading. Two
rules carry most de the SEO value:
- Never lazy-load the LCP image. Your hero image deve load eagerly; lazy-loading it delays your Largest Contentful Paint.
- Always set
widtheheightso the browser reserves space e you don’t take a Cumulative Layout Shift hit.
<NuxtImg
src="/hero.jpg"
width="1200"
height="630"
alt="Descriptive alt text"
:loading="isHeroImage ? 'eager' : 'lazy'"
format="webp"
/>The 2026 targets para aim para (p75): LCP ≤ 2,5s, INP ≤ 200ms, CLS ≤ 0,1. On Nuxt apps,
INP é the one that tends para suffer porque hidratação creates input lag — which é
exactly what Nuxt Islands e <NuxtIsland> são para.
Nuxt Content + SEO
If you’re usando @nuxt/content (the markdown/MDX conteúdo module), the integration
com @nuxtjs/seo é straightforward mas tem one ordering gotcha: load @nuxtjs/seo
antes @nuxt/content in your modules array. You pode then set SEO in conteúdo
frontmatter (title, description, robots, ogImage, schemaOrg) e pull it
em your [slug].vue template com useSeoMeta() depois busca the conteúdo. This
é the Nuxt-native version de the headless-CMS pattern, e the mesmo “rebuild what the
plugin did” discipline applies.
Erros comuns de SEO no Nuxt
- Using SPA mode (
ssr: false) para conteúdo you want indexado. The most expensive erro — e the one that faz you invisible para AI rastreadores. - Relative URLs para OG images.
ogImagemust ser an absolute URL ou social previews break. useSeoMeta()in a layout instead de the página — generic tags overwrite página-specific ones.- Not verifying rendered HTML — View Source ≠ DevTools ≠ what Google rendered. Use URL Inspection.
- Blocking JS/CSS in
robots.txt— Google won’t render de blocked arquivos. - Leaving the staging
noindex/disallow in place depois launch (ou, conversely, forgetting@nuxtjs/robotsblocks non-prod by padrão e wondering why prod é fine mas a custom env isn’t). - Lazy-loading the LCP image — tanks your LCP.
- Missing
width/heighton images — CLS. changefreq/priorityin sitemaps — Google ignores them; apenaslastmodcounts.- Recorrendo à renderização dinâmica. Google deprecated it — “dynamic rendering is a workaround and not a long-term solution” — e it apenas serves the engines you configure it para, missing Bing e every AI rastreador. With Nuxt you never need it: SSR e SSG already give rastreadores complete HTML.
llms.txt e AEO
llms.txt é a plain-text arquivo — robots.txt’s cousin — that ajuda AI tools navigate
your conteúdo. The nuxt-llms module auto-generates /llms.txt e /llms-full.txt
de Nuxt Content. As de late 2025 its principal consumidores são MCP servers e AI coding
tools (Cursor, Claude Code) em vez disso than ChatGPT ou Perplexity diretamente, e it’s most
útil para documentation sites e technical blogs — less so para e-commerce ou news.
Worth adding if you’re a docs/dev site; não a priority otherwise.
Onde isso se encaixa
Nuxt SEO é realmente a concrete application de JavaScript SEO por meio de Nuxt’s own conventions — e it overlaps heavily com the SEO para a headless CMS topic when your Nuxt frontend pulls de a headless backend. The principles don’t change; Nuxt apenas gives you good padrões e a strong module ecosystem para implement them com.
Resumo de IA
Uma versão condensada fazer conteúdo Avançado:
- Nuxt é Vue’s meta-framework, e its SEO advantage é one padrão:
renderização no lado fazer servidor. A rota that keeps that padrão ships complete HTML,
não the empty shell a plain Vue SPA ships — mas it’s a por rota outcome, não a
em todo o projeto guarantee.
ssr: falseou arouteRulesoverride pode flip any rota para CSR ou hybrid, so verify the rota real. - Rendering strategy é the foundation, decided por rota — it decides
everything antes meta, schema, ou sitemaps. Modes: SSR (padrão), SSG
(
nuxt generate), hybrid (routeRules), SPA (ssr: false, evitar para indexado conteúdo), edge. - Hybrid
routeRulesmix modes per URL;swr/isrregenerate in the background; Nuxt Islands cut hidratação cost e ajudar INP. - Googlebot crawls → renders (queued, não instant) → indexes; takes the most restrictive directive across raw vs. rendered HTML. Rendering é ~20× rastrear cost. SSR/SSG close the timing gap.
- AI-rastreador rendering é provedor-specific — CSR depends on client execution that é não covered by one shared contract, so SSR/SSG maximizes AI visibility.
- Beyond first-load HTML: verify hidratação/payload independently (server HTML
≠ proof de successful hidratação ou client-nav parity), watch para
<ClientOnly>hiding conteúdo de rastreadores even on universal rotas, e confirm direct HTTP status/redirects comcurl -Iem vez disso than trusting a client-rendered error página. - Nitro e implantação presets (Node, Cloudflare, Vercel, Netlify, static) pode differ in runtime APIs, caching, streaming, e regions — test cache headers e production parity por rota, don’t assume presets behave identically.
- Meta tags:
useSeoMeta()para SEO/social (type-safe),useHead()para the rest de the head, server-apenas variants when reactivity isn’t needed. Layer:nuxt.config.ts→app.vue→ página. Don’t putuseSeoMeta()in a layout. OG images need absolute URLs. Calling an API proves the API ran, não what a direct response emits — confirm com View Source/curl. @nuxtjs/seo(Harlan Wilton) é an opcional third-party toolkit (v5.x, actively mantido, Nuxt 3,16+/4.x) — não part de Nuxt core. It bundles robots, sitemap, OG image, Schema.org, canonical, e link-checker, mas installing it doesn’t itself prove correct output. Sitemap: apenaslastmodimporta. Robots: blocks non-prod by padrão; per-bot AI rules.@nuxt/image+ CWV: never lazy-load the LCP image; always setwidth/height(CLS). Targets: LCP ≤ 2,5s, INP ≤ 200ms, CLS ≤ 0,1.- Don’t usar dynamic rendering — Google deprecated it; Nuxt’s SSR/SSG already servir full HTML.
Documentação oficial
Primary-source documentation de Nuxt e the mecanismos de busca.
Nuxt
- Nuxt — Rendering Concepts — universal, client-side, e hybrid (
routeRules) rendering, e why rastreadores prefer renderizado no servidor rotas. - Nuxt — SEO e Meta (getting started) —
useSeoMeta(),useHead(), e head management. - Nuxt —
useSeoMetacomposable — the type-safe meta API reference, including server-apenas usage. - Nuxt — Server Engine (Nitro) — implantação presets, cross-platform output, e where runtime/caching behavior pode diverge.
- Nuxt — Nuxt Lifecycle — server render, payload transfer, e hidratação as distinct stages.
- Nuxt Image —
<NuxtImg>, responsive formats, e provedor config para Core Web Vitals. @nuxtjs/seoon Nuxt Modules — the module catalog entry: atual version, downloads, e that it’s a separately-installed package.
- Understand the JavaScript SEO basics — the rastrear → render → index pipeline e crawlable links (framework-agnostic; Google’s docs don’t mention Nuxt by name).
- Dynamic Rendering (deprecated workaround) — why Google deprecated it e what para usar instead (SSR, static rendering, hidratação).
Citações da fonte
On-the-record statements de Nuxt, Google, e my own writing. Each search-engine / Nuxt link é a deep link that jumps para the quoted passage on the source página.
Nuxt — renderização para SEO
- “Indexing and updating the content delivered via client-side rendering takes more time.” — Nuxt rendering docs. Jump para quote
- “Web crawlers can directly index the page’s content, which makes Universal rendering a great choice for any content that you want to index quickly.” — Nuxt rendering docs. Jump para quote
Google — processamento de JavaScript e renderização dinâmica
- “Google processes JavaScript web apps in three main phases: 1. Crawling 2. Rendering 3. Indexing.” — Google Search Central docs. Jump para quote
- “Dynamic rendering is a workaround and not a long-term solution for problems with JavaScript-generated content in search engines. Instead, we recommend that you use server-side rendering, static rendering, or hydration as a solution.” — Google Search Central docs. Jump para quote
Patrick Stox (my own funcionar — JavaScript SEO: A Definitive Guide)
- “Any kind of SSR, static rendering, and prerendering setup is going to be fine for search engines. Gatsby, Next, Nuxt, etc., are all great.”
- “There is no fixed timeout for the renderer… It’s really patient, and you should not be concerned.”
- “JavaScript is not bad for SEO, and it’s not evil. It’s just different from what many SEOs are used to.” (Glossário em pt-BR: qualquer configuração de SSR, renderização estática e pré-renderização funciona para mecanismos de busca; Gatsby, Next, Nuxt e outros são ótimos. Não há um tempo limite fixo para o renderizador; ele é paciente. JavaScript não é ruim para SEO, apenas é diferente do que muitos profissionais de SEO estão acostumados.)
Checklist de SEO para Nuxt
A quick pass para confirm a Nuxt site é set up para search e AI rastreadores:
- Content you want indexado é rendered on the server ou at criar time (SSR ou
SSG) — não SPA mode (
ssr: false). - Confirmed via View Source that importante conteúdo é in the HTML bruto, e via URL Inspection that Google renders it.
-
useSeoMeta()é in página components, não a shared layout overwriting página tags. -
ogImageusa an absolute URL (não relative). - A título template é set once in
app.vue; per-página títulos/descrições são unique. -
@nuxtjs/sitemapé generating an XML sitemap;lastmodé accurate e you’re não relying onchangefreq/priority. -
@nuxtjs/robotsé configured; the non-prod auto-disallow isn’t accidentally applying para production. -
robots.txtfaz não block your JS/CSS. - Canonicals são absolute e per-página (
nuxt-seo-utils). - LCP image loads eagerly (não lazy); all images têm
width/height(CLS). - Real
<a href>links /<NuxtLink>para navigation — no<div @click>routing. - If usando
@nuxt/content,@nuxtjs/seoé loaded antes it in the modules array. - Dynamic rendering é não in usar anywhere.
Os modelos mentais
1. Rendering strategy comes first. Meta tags, schema, e sitemaps são downstream de one decision: how the HTML gets produced. Answer “is this content server-rendered, statically generated, or client-rendered?” antes debugging anything else.
2. SSR é the padrão — your job é em sua maioria não para break it.
Nuxt points the padrões the right way. Most Nuxt SEO failures são someone setting
ssr: false, blocking JS/CSS, ou injecting signals via JavaScript that conflict com
the HTML bruto.
3. Pick the modo de renderização by conteúdo type.
- Mostly-static (blog, docs, marketing) → SSG (
prerender: true). - Always-fresh / dynamic → SSR.
- Hourly/daily conteúdo wanting static speed →
swr/isr. - Behind a login, não indexado → SPA (
ssr: false) é fine. - Public conteúdo you want ranked ou cited by AI → never SPA.
4. HTML-first, JS-second para every signal. Content, meta, canonical, robots directives, e links all belong in the renderizado no servidor HTML. Google takes the most restrictive directive across raw vs. rendered; AI rastreadores see apenas the raw. JS-injected SEO é a fallback, não the plan.
5. Use the modules, mas understand what they fazer.
@nuxtjs/seo saves funcionar, mas the non-prod robots auto-disallow, the lastmod-apenas
sitemap realidade, e absolute-URL canonicals são ainda yours para get right.
Nuxt SEO — resumo
Modos de renderização
| Mode | Config | SEO | Best para |
|---|---|---|---|
| Universal / SSR | ssr: true (padrão) | ✅ Best | Dynamic / personalized |
| Static / SSG | nuxt generate | ✅ Best | Blogs, docs, marketing |
| Hybrid | routeRules | ✅ Best | Large mixed-conteúdo sites |
| SPA / CSR | ssr: false | ⚠️ Poor para indexação | Dashboards, admin |
| Edge-side | Deploy target | ✅ Low TTFB | Global performance |
Composables
| Use | Reach para |
|---|---|
| SEO + social meta tags | useSeoMeta() (type-safe) |
| Title templates, scripts, link tags, html attrs | useHead() |
| Skip client re-execution para static meta | useServerHead() |
@nuxtjs/seo modules
| Module | Job |
|---|---|
@nuxtjs/robots | robots.txt + meta robots + X-Robots-Tag (blocks non-prod by padrão) |
@nuxtjs/sitemap | XML sitemap (apenas lastmod importa; auto index past 50k URLs) |
nuxt-og-image | Dynamic OG images |
nuxt-schema-org | JSON-LD structured dados |
nuxt-seo-utils | Canonical URLs (strips utm_*/fbclid/gclid), breadcrumbs |
nuxt-link-checker | Build-time broken links |
Fast rules
- Install everything:
npx nuxt module add seo. - OG images: absolute URLs apenas.
- LCP image:
loading="eager"; all images needwidth/height(CLS). - CWV targets: LCP ≤ 2,5s, INP ≤ 200ms, CLS ≤ 0,1.
- Never block JS/CSS in robots.txt.
- Dynamic rendering: deprecated — Nuxt’s SSR/SSG replace it.
- AI rastreadores: no JavaScript → SPA conteúdo é invisible para them.
Veja o que uma página Nuxt realmente entrega
The whole Nuxt SEO question reduces para one verificar: é your conteúdo in the HTML bruto the server sends, ou apenas depois JavaScript runs? If it’s in the HTML bruto, you’re server-rendering e rastreadores (e AI bots) pode ler it.
Busque o HTML bruto e procure seu conteúdo
macOS / Linux:
# Raw HTML as the server sends it — before any client JS runs
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 headline actually in the server HTML? (empty = client-rendered)
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"If your text shows in the browser mas é missing de raw.html, the página é
client-rendered — flip the rota para SSR ou prerender it. (A plain curl pode’t run JS;
para the rendered DOM usar URL Inspection ou a headless-Chrome rastreador.)
Confirme que você não está bloqueando JS/CSS
macOS / Linux:
curl -sL https://example.com/robots.txt | grep -iE "disallow.*\.(js|css)|Disallow:\s*/(_nuxt|_ipx|assets)"A Disallow matching /_nuxt/ (Nuxt’s criar output) ou /_ipx/ (the @nuxt/image
optimizer) vai break rendering — almost always a erro.
Trecho de configuração estática (nuxt.config.ts)
export default defineNuxtConfig({
modules: ['@nuxtjs/seo'], // robots, sitemap, og-image, schema-org, utils
site: { url: 'https://mysite.com' }, // required for absolute canonicals + sitemap
routeRules: {
'/blog/**': { prerender: true }, // SSG for content
'/admin/**': { ssr: false }, // SPA for the dashboard (won't be indexed)
},
}) Ferramentas para SEO no Nuxt
- URL Inspection (Google Search Console) — the source de truth. Run a live test e verificar the rendered HTML, screenshot, e página recursos para confirm your Nuxt conteúdo realmente rendered e nothing’s blocked.
@nuxtjs/seo/ nuxtseo.com — Harlan Wilton’s module bundle; the dev tools panel shows your generated robots, sitemap, schema, e OG images in development.- Nuxt DevTools — inspect head tags, rota rules, e which modo de renderização each rota é usando.
- Rich Results Test — confirm
nuxt-schema-orgJSON-LD é present in the rendered output depois any rendering change. - Ahrefs Site Audit / Screaming Frog (JS-modo de renderização) — rastrear com JS rendering on vs. off para diff raw vs. rendered HTML across the whole Nuxt app e catch CSR gaps.
- Lighthouse / PageSpeed Insights — Core Web Vitals (LCP, INP, CLS) para the
@nuxt/imagee Nuxt Islands funcionar. - Bing Webmaster Tools — Bing’s rastrear/index view e where IndexNow submissions show up.
Erros de SEO no Nuxt a evitar
Concrete erros that show up repeatedly on real Nuxt sites — prevent these antes they ship, em vez disso than diagnosing them depois tráfego drops.
Flipping ssr: false on conteúdo you want indexado
The single most expensive Nuxt SEO erro. SPA mode ships the mesmo empty-shell problema plain Vue tem — mecanismos de busca têm para wait para a render queue para fill in the conteúdo. AI-rastreador rendering contracts vary by provedor, so a rastreador that fetches apenas the initial HTML vai miss the página conteúdo.
Why it’s wrong: you’re voluntarily giving up the one padrão (SSR) that faz Nuxt easier para index than plain Vue.
What para fazer instead: leave ssr: true (the padrão) para anything público e
indexable. Reserve ssr: false para de fato non-indexado surfaces — logged-in
dashboards, admin panels — via routeRules, não a global config flip.
Colocando useSeoMeta() em um layout compartilhado
Setting título/descrição inside a layout component feels efficient — one place,
applies everywhere — mas it significa every página that usa that layout gets the mesmo
generic tags, e página-level useSeoMeta() calls pode get overwritten depending on
render order.
Why it’s wrong: unique, página-specific títulos e descrições são basic relevance signals; a layout-level padrão collapses them all para one string.
What para fazer instead: set global fallbacks once in app.vue (título template, OG
padrões), then call useSeoMeta() inside each página component com that página’s
real título e descrição.
Publicando uma URL relativa de ogImage
ogImage: '/social.png' looks fine in the browser e completely falha when
Facebook, LinkedIn, ou X try para buscar it, porque social rastreadores don’t resolve
relative paths against your site.
Why it’s wrong: social platforms need an absolute URL para buscar the image; a relative path resolves para nothing de their side.
What para fazer instead: always pass a full https:// URL, e set site.url in
nuxt.config.ts so @nuxtjs/seo’s modules pode criar absolute URLs para you
automatically.
Recorrendo à renderização dinâmica
Serving a prerendered snapshot para known bots e the SPA para everyone else era a legitimate workaround years ago. Google tem since called it out diretamente: “dynamic rendering is a workaround and not a long-term solution.”
Why it’s wrong: it apenas serves the bots you configure, misses everything else (Bing, most AI rastreadores), e adiciona real infrastructure para manter — para a problema Nuxt’s own SSR/SSG already solves.
What para fazer instead: usar SSR ou nuxt generate e skip dynamic rendering
entirely. There’s no scenario where a Nuxt site needs it.
Blocking /_nuxt/ ou /_ipx/ in robots.txt
A blanket Disallow: /assets/ ou an overzealous robots rule pode accidentally catch
Nuxt’s criar output directory (/_nuxt/) ou the @nuxt/image optimizer path
(/_ipx/).
Why it’s wrong: if Googlebot pode’t buscar the JS/CSS that builds the página, it pode’t confirm your SSR output é what it looks like — e any client-side enhancements silently stop rendering para it.
What para fazer instead: never disallow criar-output ou image-optimizer paths. Check
robots.txt depois every deploy that touches routing ou module config, não apenas once
at launch.
Mantendo ativo o bloqueio de robôs de não produção após o lançamento
@nuxtjs/robots disallows all rastreadores on non-production environments by padrão —
a good safety net para staging, mas it lê environment variables para decidir, e a
misconfigured NODE_ENV ou preview-deploy setting pode fazer it fire in production
too.
Why it’s wrong: the site looks completely fine in a browser while robots.txt
quietly disallows everything, e nothing gets indexado until someone notices.
What para fazer instead: depois any deploy ou environment change, buscar
https://yoursite.com/robots.txt diretamente e confirm it’s não a blanket
Disallow: /.
KPIs permanentes para SEO no Nuxt
The ongoing numbers para track once your rendering setup é correct — não one-time checks, mas recurring signals that catch regressions as the app changes.
Core Web Vitals (LCP, INP, CLS)
What it tells you: whether real visitors são getting a fast, stable página — diretamente affected by Nuxt Islands/hidratação cost (INP) e image-loading choices (LCP, CLS).
How para pull it: field dados de the Chrome UX Report via /tools/crux-tracker/ ou /tools/cwv-checker/; lab dados de Lighthouse para pre-release checks.
Benchmark / realistic range: Google’s publicado “good” thresholds são LCP ≤ 2,5s, INP ≤ 200ms, CLS ≤ 0,1 at the 75th percentile — those são the pass/falhar lines CrUX itself usa, não a number I’m inventing. Where you land within “good” depends heavily on your image weight e how much you hydrate.
Cadence: CrUX field dados updates on a rolling 28-day window — verificar monthly, e immediately depois any change para images, fonts, ou hidratação.
Paridade entre HTML renderizado e bruto
What it tells you: whether the conteúdo mecanismos de busca e AI rastreadores pode
realmente see (the HTML bruto) matches what a visitor sees in the browser (the rendered
DOM) — the core Nuxt SEO risk if ssr gets flipped ou a rota regresses para CSR.
How para pull it: /tools/render-gap/ diffs raw vs. rendered HTML para a URL; para the authoritative Google-side view, usar GSC’s URL Inspection → “View Crawled Page.”
Benchmark / realistic range: this é a binary verificar, não a range — your key conteúdo (headline, body copy, internal links) deve ser present in the HTML bruto, full stop. Any gap on a página you want indexado ou cited é a regression para corrigir, não a number para tolerate.
Cadence: depois every deploy that touches routeRules, layouts, ou the ssr
config; spot-verificar key templates monthly otherwise.
Cobertura fazer índice (relatório de indexação de páginas)
What it tells you: how many de your submitted URLs Google tem realmente indexado, e why the rest eram excluded (duplicate, crawled-não-indexado, blocked, etc.) — the downstream signal that rendering problemas eventually surface as.
How para pull it: Search Console → Page Indexing relatório, filtered para your Nuxt site’s URL patterns.
Benchmark / realistic range: there’s no universal healthy percentage — it depends on how many near-duplicate ou thin URLs your rota structure generates. Watch the trend e the exclusion reasons, não a target number.
Cadence: weekly during e depois a rendering-mode migration; monthly otherwise.
Acesso de rastreadores de IA
What it tells you: whether GPTBot, ClaudeBot, PerplexityBot, e similar AI
rastreadores pode realmente buscar your páginas — separado de Google, since these bots
generally don’t execute JavaScript e ler apenas the HTML bruto your robots.txt
lets them reach.
How para pull it: /tools/ai-rastreador-checker/ para confirm no AI user-agente é disallowed; logs fazer servidor para confirm the bots são realmente requesting páginas, não apenas permitted para.
Benchmark / realistic range: there’s no citation-rate benchmark I pode give you honestly — how often an AI answer engine cites you depends on the query space e competition, não something Nuxt configuration controla diretamente. Track acesso (allowed vs. blocked), não a feito-up citation percentage.
Cadence: depois every robots.txt ou @nuxtjs/robots config change; monthly log
spot-verificar otherwise.
Teste seus conhecimentos: Nuxt SEO
Five quick questions on optimizing a Nuxt site para search. Pick an answer para each, then verificar.
Recursos que valem seu tempo
My related writing
- JavaScript SEO: A Definitive Guide — my full guia para rendering, DOM parity, the most-restrictive-directive rule, e why SSR/static/prerender (Nuxt included) são all fine para search.
- The Beginner’s Guide para Technical SEO — where rendering e rastreamento fit in the bigger picture.
My speaking
- JavaScript SEO — Ungagged 2019 (SlideShare) — Googlebot’s evergreen Chromium, the ~20× rastrear cost de rendering, History API sobre hash routing, e how Google handles JS-injected canonicals. (Standing disclaimer: the dynamic-rendering advice in that deck é now outdated — Google deprecated it.)
Do restante fazer setor
- Nuxt — Rendering Concepts (official) — universal vs. client-side rendering e why rastreadores prefer SSR.
- Nuxt — SEO e Meta (official) —
useSeoMeta()euseHead(), the getting-started reference. - Learn SEO com Nuxt (Harlan Wilton / nuxtseo.com) — the most comprehensive developer-focused Nuxt SEO guia, kept atual.
- harlan-zw/nuxt-seo (GitHub) — the source para the
@nuxtjs/seomodule bundle. - Nuxt Image (official) —
<NuxtImg>e Core Web Vitals optimization. - Optimize Nuxt Performance (DebugBear) — a practitioner walkthrough de Nuxt Core Web Vitals corrige.
- Nuxt 3 Rendering Modes (RisingStack) — a technical comparison de SSR, SSG, e hybrid rendering.
- r/TechSEO — the comunidade para rendering/indexação debugging.
Vídeos
- Google Search Central (YouTube) — Martin Splitt’s JavaScript SEO series é the best official walkthrough de how Google crawls, renders, e indexes JS apps; it’s framework-agnostic mas applies diretamente para Nuxt. Channel
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.
-
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.