SEO Nuxt
Nuxt ships serwer-side renderowanie by domyślny, ale że's a per-route setting, nie a guarantee — pełny HTML to crawlers tylko on routes że zachować it. renderowanie modes, useSeoMeta(), the @nuxtjs/seo toolkit, hydration i Nitro caveats, Core Web Vitals, i the mistakes że quietly cost you.
Języki
1 sygnał dowodowy na tej stronie
- Powiązane działające narzędzieCore Web Vitals History & Competitor Comparison
Nuxt serwer-renders strony by domyślny, so a route że zachowuje że domyślny gives crawlers a complete HTML document zamiast the empty shell a plain Vue SPA ships — ale it's a per-route setting: routeRules lub a global ssr:fałszywy może flip dowolny route to CSR, so verify the rzeczywisty route zamiast assuming z the framework nazwa. The foundational decision jest renderowanie mode per route — SSR (domyślny), SSG via nuxt generate, lub hybrid route reguły — ponieważ meta znaczniki, schemat, i sitemaps wszystkie come po że. używać useSeoMeta() dla meta, treat Harlan Wilton's @nuxtjs/seo bundle as an optional third-party toolkit (nie Nuxt core) dla robots/mapa witryny/OG/schemat/canonical, nigdy reach dla dynamiczny renderowanie (Google deprecated it), verify hydration/payload i Nitro deployment-preset/pamięć podręczna behavior independently of serwer HTML, i remember że AI-crawler renderowanie contracts vary by provider — SSR/SSG puts treść in raw HTML i maximizes coverage.
TL;DR — Nuxt jest the framework built on top of Vue, i it’s good dla SEO dla one main powód: on a route że zachowuje the domyślny, it builds strony on the serwer, so wyszukiwarki get a finished HTML strona zamiast a blank one they’d mieć to fill in themselves. że’s a per-route setting, nie a witryna-wide guarantee —
routeRuleslub a globalssr: falsemoże turn dowolny given route back do a plain-Vue-style empty shell. sprawdź rzeczywisty route, nie just the project nazwa. The najbardziej ważny choice you’ll make jest how każdy route gets wyrenderowany; everything else (meta znaczniki, sitemaps) comes po że.
Why Nuxt jest good dla SEO — on the routes że zachowaj domyślny
Vue, on jego own, builds a single-strona app: the serwer wysyła an almost-empty HTML shell, i JavaScript fills in the treść once it runs in the przeglądarka. że’s tricky dla search, ponieważ the strona looks empty until the JavaScript executes.
Nuxt jest Vue’s “meta-framework” — a fuller toolkit built around Vue — i jego
domyślny fixes że problem. Nuxt renders twój strony on the serwer pierwszy
(serwer-side renderowanie, lub SSR), so gdy Google lub a visitor asks dla a strona
on a route że hasn’t był 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 dla JavaScript. że’s the single
biggest powód a Nuxt witryna może być easier to get zindeksowany than a plain Vue app —
ale it’s a route-by-route outcome, nie something the framework nazwa guarantees.
A route z ssr: false, lub one że leans on <ClientOnly> dla jego main
treść, gives up że advantage i ships the same empty-shell problem plain
Vue ma.
The one decision że matters najbardziej: renderowanie, per route
gdy someone asks dla a specific strona, gdzie robi jego HTML get built? że’s a
routeRules-level question, nie a project-wide one — a Nuxt app może mix modes
w całym routes. Nuxt gives you a kilka options:
- serwer-side renderowanie (SSR) — the domyślny. The serwer builds the pełny strona on każdy żądanie. Great dla SEO.
- statyczny generation (SSG) — run
nuxt generatei Nuxt builds wszystkie twój strony do plain HTML files ahead of time. również great dla SEO, i perfect dla blogs i docs że don’t change każdy minute. - SPA mode — the strona jest built in the przeglądarka, like plain Vue. Avoid ten dla anything you want found in search.
The good news jest the defaults są już pointed the right way. You mostly mieć to avoid switching them off.
Adding tytuły i meta znaczniki
In Nuxt you ustawić twój tytuł strony i opis meta z a built-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 do a strona i pass in twój tytuł, opis, i
social-share image:
useSeoMeta({
title: 'My Page Title',
description: 'A concise, page-specific summary with the key information first',
})że’s the modern, recommended way. (There’s an older function called useHead()
że nadal działa i jest używany dla other things in the strona’s <head>, ale dla SEO
meta znaczniki reach dla useSeoMeta().) Google ma no fixed meta-opis character
limit; snippets są zapytanie-dependent i truncated to fit the urządzenie, so preview
ważny strony in ich intended język i script zamiast coding to a quota.
The optional dodawać-on: the Nuxt SEO modules
Nuxt core doesn’t generate a robots.txt, an mapa witryny XML, social-share images,
dane strukturalne, lub canonical URLs — tamte są jobs dla oddzielny, optional
packages, nie something nuxt.config.ts gives you by domyślny. A programista named
Harlan Wilton maintains a free, community bundle of tamte packages — installed as
@nuxtjs/seo — że covers wszystkie of them at once. It’s a third-party toolkit, nie
part of Nuxt itself, so installing it doesn’t automatically make dowolny of że
output poprawny; you nadal confirm the mapa witryny, robots reguły, i schemat it
generates match co you actually want.
The thing people get błędny
People assume “Vue/Nuxt can’t be in Google.” że był sort of prawdziwy dla plain Vue apps years ago — it isn’t prawdziwy dla Nuxt z jego serwer renderowanie. The rzeczywisty mistakes są things like turning SSR off by accident, lub blocking twój JavaScript files so Google może’t zbuduj strona.
Want the deeper version — the pełny menu of renderowanie modes, the module ecosystem in detail, Core Web Vitals, i the częste błędy z fixes? Switch to the Advanced tab.
TL;DR — Nuxt’s domyślny jest serwer-side renderowanie, so a route że zachowuje że domyślny gets a complete DOM zamiast the empty shell a plain Vue SPA ships — ale że’s a per-route outcome:
ssr: falselub arouteRulesoverride może turn dowolny route do CSR lub hybrid, so test the rzeczywisty route, nie the project nazwa. renderowanie strategy jest the foundational decision — SSR (domyślny), SSG (nuxt generate), or hybridrouteRules— ponieważ meta, schemat, i sitemaps wszystkie come po it. używaćuseSeoMeta()dla meta znaczniki (useHead()dla the rest of the head, serwer-tylko warianty gdy you don’t need reactivity), i treat Harlan Wilton’s@nuxtjs/seobundle as an optional third-party toolkit dla robots/mapa witryny/OG/schemat/canonical — nie part of Nuxt core, i nie proof jego output jest poprawny until you sprawdzenie it. nigdy używać dynamiczny renderowanie (Google deprecated it). AI-crawler renderowanie varies by provider — SSR/SSG maximizes raw-HTML coverage. Beyond the initial HTML, verify hydration/payload, Nitro deployment presets i buforowanie, i bezpośredni HTTP status independently — serwer HTML alone doesn’t prove dowolny of tamte. The usual JS-SEO reguły nadal apply: rzeczywisty<a href>links, don’t blok JS/CSS, watch wyrenderowany vs. raw HTML.
Nuxt jest Vue’s answer to the SPA problem
Vue, by itself, ships a single-strona application: an HTML shell plus JavaScript że builds the DOM in the przeglądarka. Nuxt jest the meta-framework on top of Vue (running on the Nitro serwer engine in Nuxt 3, z Nuxt 4 following in 2025), i jego whole powód dla existing — z an SEO standpoint — jest że it renders on the serwer by domyślny. każdy strona arrives as a fully-formed HTML document, który jest exactly co Googlebot wants to read bez having to execute JavaScript pierwszy. Plain Vue SEO jest jego own topic z jego own awaria modes; here I’m assuming you’ve picked Nuxt precisely so you don’t mieć to fight the SPA problem.
ten jest the same point I make o JavaScript generally: “dowolny kind of SSR, statyczny renderowanie, i prerendering setup jest going to być fine dla wyszukiwarki. Gatsby, następny, Nuxt, etc., są wszystkie great.” Nuxt’s defaults są pointed the right way. najbardziej Nuxt SEO problems są people turning tamte defaults off, lub layering mistakes on top of them.
renderowanie strategy jest the foundation — decided per route, nie per project
przed meta znaczniki, przed schemat, przed sitemaps, the question że decides
everything jest how robi the HTML get produced dla ten specific route? Nuxt
documents universal (serwer) renderowanie as the app-wide domyślny, ale że domyślny
isn’t a route-level guarantee: a global ssr: false switches the whole app to
client renderowanie, i routeRules może assign a różny mode to dowolny URL
pattern. “This is a Nuxt app” tells you nothing o how one particular strona
renders — you mieć to sprawdź route. Nuxt gives you five strategies:
| Mode | How you ustawić it | SEO impact | Best dla |
|---|---|---|---|
| Universal / SSR | domyślny (ssr: true) | Excellent — pełny HTML każdy żądanie | dynamiczny, personalized treść |
| statyczny / SSG | nuxt generate | Excellent — HTML built at deploy time | Blogs, docs, marketing |
| Hybrid | routeRules per route | Excellent — mix per route | duży mixed-treść witryny |
| SPA / CSR | ssr: false | Poor dla zindeksowany treść | panele, admin panels |
| Edge-side | Deployment target | Excellent — niski TTFB | Global wydajność |
The official Nuxt docs są blunt o why client-side renderowanie jest the błędny choice
dla treść: “indeksowanie i updating the treść delivered via client-side renderowanie
takes więcej time”, whereas with server (universal) rendering “web crawlers może
directly index the strona’s treść.” 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 renderowanie docs.) CSR
(ssr: false) jest positioned dla back-office, panele, i games — nie anything
you want zindeksowany.
Hybrid renderowanie jest the power move dla duży witryny. Route reguły in
nuxt.config.ts let you ustawić the renderowanie i buforowanie 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-podczas gdy-revalidate) i isr (incremental statyczny regeneration) generate
a strona statically then refresh it in the background — ideal dla wysoki strona-count
e-handel lub news gdzie a pełny rebuild on każdy change isn’t practical. Nuxt
Islands (<NuxtIsland>) render components bez wysyłka client-side JavaScript,
cutting hydration cost i helping INP — the Core Web Vital że’s najbardziej często the
problem on Nuxt apps.
How to verify co you actually shipped: View źródło pokazuje the raw HTML the serwer sent; if twój treść jest there, you’re serwer-renderowanie. DevTools’ elementy panel pokazuje the wyrenderowany DOM. i GSC’s URL Inspection narzędzie pokazuje co Google actually fetched i wyrenderowany — the źródło of truth. Don’t trust “it looks fine in my przeglądarka.”
How Googlebot handles a Nuxt app
Google procesy dowolny JavaScript app in three phases — crawl, render, index — i the catch jest timing: renderowanie happens in a queue, nie instantly. As I put it in my SEO JavaScript poradnik, the renderer jest patient — “there jest no fixed timeout dla the renderer… It’s really patient, i you powinien nie być concerned.” ale patient isn’t the same as fast dla fresh treść. If you ship a client-wyrenderowany strona, twój treść doesn’t exist dla Google until że render wave runs; SSR i SSG close że gap ponieważ the HTML jest complete on the pierwszy fetch.
Two więcej things matter at scale. renderowanie JavaScript jest expensive — z my 2019
SEO JavaScript talk (Ungagged), crawl costs go up by roughly 20× once Google ma to render
(directional, ale the order of magnitude nadal holds). i Google takes the najbardziej
restrictive directive w całym raw i wyrenderowany HTML — so a noindex injected by
JavaScript będzie win ponad an index in the raw HTML, i vice versa. A canonical
injected via JavaScript jest respected tylko if there’s no canonical in the raw HTML
już. zachować twój robots i canonical signals in the serwer-wyrenderowany HTML, który
Nuxt robi dla you gdy SSR jest on.
The AI-crawler reality
ten jest the 2026 wrinkle. AI crawlers — GPTBot, ClaudeBot, PerplexityBot, i the rest — generally don’t execute JavaScript at wszystkie. They index the raw HTML i nothing else. So a client-wyrenderowany Nuxt strona jest effectively invisible to AI answer engines. SSR lub SSG isn’t just better dla Google here; it’s the cena of entry dla optymalizacja silników odpowiedzi too. If you want twój treść cited by ChatGPT, Perplexity, lub Claude, it ma to być in the HTML on pierwszy fetch.
Beyond the initial HTML: payload, hydration, i kody stanu
Getting serwer HTML z twój treść in it jest necessary ale nie sufficient — several things może nadal go błędny downstream of że pierwszy odpowiedź, i “I checked View źródło” doesn’t cover them:
- Payload i hydration. Universal renderowanie wysyła the HTML i a serialized data payload the client używa to hydrate — attach event listeners i pick up gdzie the serwer left off — bez re-pobieranie. serwer HTML looking right doesn’t prove hydration succeeded, że client navigation reproduces the same treść, lub że the payload isn’t stale. If a strona feels fine on pierwszy load ale breaks po a client-side route change, że’s a hydration/payload problem, nie a renderowanie-mode problem.
<ClientOnly>i przeglądarka-tylko treść. Wrapping something in<ClientOnly>— common dla przeglądarka-API-dependent widgets — means it’s absent z the serwer odpowiedź even on an otherwise-universal route. If twój main treść, a key link, lub twój meta znaczniki end up inside a client-tylko granica, crawlers i AI bots że tylko przeczytaj raw HTML miss it, regardless of twój renderowanie mode setting. Inspect the rzeczywisty odpowiedź, nie just the renderowanie mode config.- kody stanu i redirects aren’t self-certifying. A Nuxt błąd strona
renderowanie in the przeglądarka, lub a
navigateTo()/composable-driven redirect, doesn’t by itself prove co HTTP status the bezpośredni serwer odpowiedź sent. Google’s guidance jest explicit że meaningful kody stanu matter dla crawling i indeksowanie — confirm the rzeczywisty header zcurl -I, nie co the client-wyrenderowany błąd strona displays.
None of ten jest an argument wobec universal renderowanie — it’s the reminder że “the HTML is server-rendered” jest the pierwszy sprawdzenie, nie the ostatni one.
Nitro, deployment presets, i pamięć podręczna granice
Nuxt’s serwer output jest built by Nitro, i Nitro compiles differently depending on the deployment preset you target (Node serwer, Cloudflare, Vercel, Netlify, statyczny, i others). że matters dla SEO ponieważ presets i adapters może differ in runtime APIs available, buforowanie behavior, streaming obsługiwać, regional deployment, i filesystem access — a route reguła lub serwer handler że działa poniżej one preset isn’t guaranteed to behave identically poniżej another. Two consequences worth testing explicitly zamiast assuming:
- pamięć podręczna keys i invalidation są route-specific, nie automatic.
swriisrroute reguły pamięć podręczna i regenerate output, ale a błędny pamięć podręczna key, missing invalidation, lub a buforowanie header ustawić by twój deployment platforma może serve stale, personalized, lub inconsistent HTML to crawlers. sprawdź rzeczywisty odpowiedź age i dowolnyCache-Control/Ageheaders on a live URL, nie just therouteRulesconfig. - Production parity isn’t guaranteed by staging behavior. A route renderowanie correctly in local dev lub a preview deployment doesn’t confirm the production preset produces the same output — serwer routes, redirects, i błąd handling live in Nitro’s serwer warstwa, i że warstwa jest the part najbardziej prawdopodobny to differ by target. Test the production URL directly po dowolny deployment change, the same way you’d verify renderowanie mode.
Meta znaczniki: useSeoMeta() i useHead()
Nuxt’s head management runs on Unhead, i it gives you two composables dla różny jobs.
useSeoMeta() jest the one to reach dla dla SEO i social meta znaczniki. It’s a flat,
type-bezpieczny API z typed parametry. 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 pomaga unikaj classic otwarty Graph
bug of używając name gdzie 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() jest the general-purpose head narzędzie dla everything else — scripts, link
znaczniki, body atrybuty, i tytuł templates:
useHead({
titleTemplate: '%s · My Site Name',
htmlAttrs: { lang: 'en' },
})The niezawodny layering pattern jest: statyczny defaults (charset, viewport, favicon) in
nuxt.config.ts → witryna-wide tytuł template i global OG defaults in app.vue →
strona-specific overrides via useSeoMeta() in the strona component. A common bug jest
putting useSeoMeta() in a layout zamiast the strona, który overwrites specific
strona znaczniki z generic ones. i since wyszukiwarki przeczytaj initial load, SEO meta
generally doesn’t need to być reactive — useServerHead() skips the client-side
re-execution.
który API, i co it actually proves:
| API | Scope | Reactive? | co it proves o output |
|---|---|---|---|
useSeoMeta() | Flat, typed SEO/social meta tylko | Yes (domyślny) | ustawia typed właściwości correctly — nie że the route jest unique, canonical, lub indeksowalny; you nadal own że logic |
useHead() | Anything in <head> — scripts, links, attrs, tytuł template | Yes (domyślny) | General head control; same caveat — API używać isn’t proof of a poprawny serwer odpowiedź |
useServerHead() / serwer-tylko calls | Same as above | No — serwer tylko, skips client re-execution | Confirms the znacznik ships once in serwer HTML; doesn’t confirm client navigation re-ustawia it if you rely on it there |
Calling one of te composables tells you the API ran — it doesn’t by itself tell
you co a bezpośredni serwer odpowiedź lub a client-side route change actually emits.
Confirm z View źródło lub curl, nie just “I called useSeoMeta().”
The @nuxtjs/seo module ecosystem (Harlan Wilton) — optional, nie core
Nuxt core doesn’t ship a mapa witryny, a robots.txt, OG image generation, lub
schemat.org out of the box — tamte są outside Nuxt’s own primitives (useHead,
useSeoMeta, route reguły, renderowanie modes). The community fills że gap z
Harlan Wilton’s @nuxtjs/seo — a osobno-installed, third-party umbrella
package (nuxtseo.com, currently at v5.x, actively maintained, targeting Nuxt
3,16+ i Nuxt 4) że bundles six modules. Installing it gives you mapa witryny,
robots, OG-image, i schemat generation — it doesn’t by itself guarantee the
output jest poprawny dla twój routes; verify co it produces the same way you’d
verify anything else:
| Module | co it robi |
|---|---|
@nuxtjs/robots | robots.txt + meta robots + X-Robots-Tag headers |
@nuxtjs/sitemap | Auto XML sitemaps z strony + dynamiczny routes |
nuxt-og-image | dynamiczny OG images (a Vue template → an image) |
nuxt-schema-org | schemat.org JSON-LD dane strukturalne |
nuxt-seo-utils | Canonical URLs, breadcrumbs, defaults |
nuxt-link-checker | Build-time broken-link detection |
Install the whole bundle z npx nuxt module add seo, lub grab individual modules
(npx nuxt module add sitemap robots). A kilka behaviors worth knowing:
@nuxtjs/sitemapauto-generates z twójpages/directory plus dynamiczny routes, splits do a mapa witryny index automatically past 50 000 URLs, obsługuje i18n multi-język sitemaps, i ma built-in IndexNow obsługiwać. One thing to get right: Google ignoreschangefreqipriority; tylko an accuratelastmodmatters, i tylko gdy treść genuinely changes.@nuxtjs/robotsgeneratesrobots.txt, the robots meta znacznik, i theX-Robots-Tagheader — i by domyślny it disallows wszystkie crawlers on non-production environments, który jest exactly the staging-indexation footgun że bites headless builds. It również gives you per-bot reguły, so you może blok GPTBot specifically podczas gdy leaving everyone else alone (być intentional — blok an AI crawler i it won’t cite you).nuxt-seo-utilshandles canonical URLs i, usefully, strips tracking parametry (utm_*,fbclid,gclid) z canonicals automatically.
nuxt/image i Core Web Vitals
@nuxt/image jest the image module: automatic responsive srcset, modern formaty
(WebP/AVIF), built-in optymalizacja przez CDN providers, i lazy ładowanie. Two
reguły carry najbardziej of the SEO wartość:
- nigdy lazy-load the LCP image. twój hero image powinien load eagerly; lazy-ładowanie it opóźnienia twój Largest Contentful Paint.
- zawsze ustawić
widthiheightso the przeglądarka reserves space i 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 to aim dla (p75): LCP ≤ 2,5s, INP ≤ 200ms, CLS ≤ 0,1. On Nuxt apps,
INP jest the one że tends to suffer ponieważ hydration creates input lag — który jest
exactly co Nuxt Islands i <NuxtIsland> są dla.
Nuxt treść + SEO
If you’re używając @nuxt/content (the markdown/MDX treść module), the integracja
z @nuxtjs/seo jest straightforward ale ma one ordering gotcha: load @nuxtjs/seo
przed @nuxt/content in twój modules tablica. You może then ustawić SEO in treść
frontmatter (title, description, robots, ogImage, schemaOrg) i pull it
do twój [slug].vue template z useSeoMeta() po pobieranie the treść. ten
jest the Nuxt-native version of the headless-CMS pattern, i the same “rebuild co the
plugin zrobił” discipline applies.
Common Nuxt SEO mistakes
- używając SPA mode (
ssr: false) dla treść you want zindeksowany. The najbardziej expensive mistake — i the one że makes you invisible to AI crawlers. - Relative URLs dla OG images.
ogImagemusi być an absolute URL lub social previews break. useSeoMeta()in a layout zamiast the strona — generic znaczniki overwrite strona-specific ones.- nie verifying wyrenderowany HTML — View źródło ≠ DevTools ≠ co Google wyrenderowany. używać URL Inspection.
- Blocking JS/CSS in
robots.txt— Google won’t render z blocked files. - Leaving the staging
noindex/disallow in place po launch (lub, conversely, forgetting@nuxtjs/robotsbloki non-prod by domyślny i wondering why prod jest fine ale a custom env isn’t). - Lazy-ładowanie the LCP image — tanks twój LCP.
- Missing
width/heighton images — CLS. changefreq/priorityin sitemaps — Google ignores them; tylkolastmodcounts.- Reaching dla dynamiczny renderowanie. Google deprecated it — “dynamic rendering is a workaround and not a long-term solution” — i it tylko serves the engines you configure it dla, missing Bing i każdy AI crawler. z Nuxt you nigdy need it: SSR i SSG już give crawlers complete HTML.
llms.txt i AEO
llms.txt jest a plain-tekst file — robots.txt’s cousin — że pomaga AI narzędzia navigate
twój treść. The nuxt-llms module auto-generates /llms.txt i /llms-full.txt
z Nuxt treść. As of late 2025 jego primary consumers są MCP serwery i AI coding
narzędzia (Cursor, Claude Code) zamiast ChatGPT lub Perplexity directly, i it’s najbardziej
użyteczny dla documentation witryny i technical blogs — mniej so dla e-handel lub news.
Worth adding if you’re a docs/dev witryna; nie a priority otherwise.
gdzie ten fits
Nuxt SEO jest really a concrete application of SEO JavaScript przez Nuxt’s own conventions — i it overlaps heavily z the SEO dla a headless CMS topic gdy twój Nuxt frontend pulls z a headless backend. The principles don’t change; Nuxt just gives you good defaults i a strong module ecosystem to implement them z.
AI summary
A condensed take on the Advanced version:
- Nuxt jest Vue’s meta-framework, i jego SEO advantage jest one domyślny:
serwer-side renderowanie. A route że zachowuje że domyślny ships complete HTML,
nie the empty shell a plain Vue SPA ships — ale it’s a per-route outcome, nie a
project-wide guarantee.
ssr: falselub arouteRulesoverride może flip dowolny route to CSR lub hybrid, so verify the rzeczywisty route. - renderowanie strategy jest the foundation, decided per route — it decides
everything przed meta, schemat, lub sitemaps. Modes: SSR (domyślny), SSG
(
nuxt generate), hybrid (routeRules), SPA (ssr: false, avoid dla zindeksowany treść), edge. - Hybrid
routeRulesmix modes per URL;swr/isrregenerate in the background; Nuxt Islands cut hydration cost i pomagać INP. - Googlebot crawls → renders (queued, nie instant) → indexes; takes the najbardziej restrictive directive w całym raw vs. wyrenderowany HTML. renderowanie jest ~20× crawl cost. SSR/SSG close the timing gap.
- AI-crawler renderowanie jest provider-specific — CSR depends on client execution że jest nie covered by one shared contract, so SSR/SSG maximizes AI visibility.
- Beyond pierwszy-load HTML: verify hydration/payload independently (serwer HTML
≠ proof of udany hydration lub client-nav parity), watch dla
<ClientOnly>hiding treść z crawlers even on universal routes, i confirm bezpośredni HTTP status/redirects zcurl -Izamiast trusting a client-wyrenderowany błąd strona. - Nitro i deployment presets (Node, Cloudflare, Vercel, Netlify, statyczny) może differ in runtime APIs, buforowanie, streaming, i regions — test pamięć podręczna headers i production parity per route, don’t assume presets behave identically.
- Meta znaczniki:
useSeoMeta()dla SEO/social (type-bezpieczny),useHead()dla the rest of the head, serwer-tylko warianty gdy reactivity isn’t needed. warstwa:nuxt.config.ts→app.vue→ strona. Don’t putuseSeoMeta()in a layout. OG images need absolute URLs. Calling an API proves the API ran, nie co a bezpośredni odpowiedź emits — confirm z View źródło/curl. @nuxtjs/seo(Harlan Wilton) jest an optional third-party toolkit (v5.x, actively maintained, Nuxt 3,16+/4.x) — nie part of Nuxt core. It bundles robots, mapa witryny, OG image, schemat.org, canonical, i link-checker, ale installing it doesn’t itself prove poprawny output. mapa witryny: tylkolastmodmatters. Robots: bloki non-prod by domyślny; per-bot AI reguły.@nuxt/image+ CWV: nigdy lazy-load the LCP image; zawsze ustawićwidth/height(CLS). Targets: LCP ≤ 2,5s, INP ≤ 200ms, CLS ≤ 0,1.- Don’t używać dynamiczny renderowanie — Google deprecated it; Nuxt’s SSR/SSG już serve pełny HTML.
Official documentation
Primary-źródło documentation z Nuxt i the wyszukiwarki.
Nuxt
- Nuxt — renderowanie Concepts — universal, client-side, i hybrid (
routeRules) renderowanie, i why crawlers prefer serwer-wyrenderowany routes. - Nuxt — SEO i Meta (getting started) —
useSeoMeta(),useHead(), i head management. - Nuxt —
useSeoMetacomposable — the type-bezpieczny meta API reference, w tym serwer-tylko usage. - Nuxt — serwer Engine (Nitro) — deployment presets, cross-platforma output, i gdzie runtime/buforowanie behavior może diverge.
- Nuxt — Nuxt Lifecycle — serwer render, payload transfer, i hydration as distinct stages.
- Nuxt Image —
<NuxtImg>, responsive formaty, i provider config dla Core Web Vitals. @nuxtjs/seoon Nuxt Modules — the module catalog entry: current version, downloads, i że it’s a osobno-installed package.
- zrozum SEO JavaScript basics — the crawl → render → index pipeline i crawlable links (framework-agnostic; Google’s docs don’t mention Nuxt by nazwa).
- dynamiczny renderowanie (deprecated workaround) — why Google deprecated it i co to używać instead (SSR, statyczny renderowanie, hydration).
cytaty z the źródło
On-the-record statements z Nuxt, Google, i my own writing. każdy search-engine / Nuxt link jest a deep link że jumps to the quoted passage on the źródło strona.
Nuxt — renderowanie dla SEO
- “Indexing and updating the content delivered via client-side rendering takes more time.” — Nuxt renderowanie docs. Jump to cytat
- “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 renderowanie docs. Jump to cytat
Google — JavaScript processing & dynamiczny renderowanie
- “Google processes JavaScript web apps in three main phases: 1. Crawling 2. Rendering 3. Indexing.” — Google Search Central docs. Jump to cytat
- “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 to cytat
Patrick Stox (my own działać — SEO JavaScript: A Definitive poradnik)
- “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.”
Nuxt SEO checklist
A quick pass to confirm a Nuxt witryna jest ustawić up dla search i AI crawlers:
- treść you want zindeksowany jest wyrenderowany on the serwer lub at build time (SSR lub
SSG) — nie SPA mode (
ssr: false). - Confirmed via View źródło że ważny treść jest in the raw HTML, i via URL Inspection że Google renders it.
-
useSeoMeta()jest in strona components, nie a shared layout overwriting strona znaczniki. -
ogImageużywa an absolute URL (nie relative). - A tytuł template jest ustawić once in
app.vue; per-strona tytuły/opisy są unique. -
@nuxtjs/sitemapjest generating an mapa witryny XML;lastmodjest accurate i you’re nie relying onchangefreq/priority. -
@nuxtjs/robotsjest configured; the non-prod auto-disallow isn’t accidentally applying to production. -
robots.txtrobi nie blok twój JS/CSS. - Canonicals są absolute i per-strona (
nuxt-seo-utils). - LCP image loads eagerly (nie lazy); wszystkie images mieć
width/height(CLS). - rzeczywisty
<a href>links /<NuxtLink>dla navigation — no<div @click>routing. - If używając
@nuxt/content,@nuxtjs/seojest załadowany przed it in the modules tablica. - dynamiczny renderowanie jest nie in używać anywhere.
The mental modele
1. renderowanie strategy comes pierwszy. Meta znaczniki, schemat, i sitemaps są downstream of one decision: how the HTML gets produced. Answer “jest ten treść serwer-wyrenderowany, statically generated, lub client-wyrenderowany?” przed debugging anything else.
2. SSR jest the domyślny — twój job jest mostly nie to break it.
Nuxt points the defaults the right way. najbardziej Nuxt SEO awarie są someone setting
ssr: false, blocking JS/CSS, lub injecting signals via JavaScript że conflict z
the raw HTML.
3. Pick the renderowanie mode by treść type.
- Mostly-statyczny (blog, docs, marketing) → SSG (
prerender: true). - zawsze-fresh / dynamiczny → SSR.
- Hourly/daily treść wanting statyczny speed →
swr/isr. - Behind a login, nie zindeksowany → SPA (
ssr: false) jest fine. - Public treść you want ranked lub cited by AI → nigdy SPA.
4. HTML-pierwszy, JS-second dla każdy signal. treść, meta, canonical, robots directives, i links wszystkie belong in the serwer-wyrenderowany HTML. Google takes the najbardziej restrictive directive w całym raw vs. wyrenderowany; AI crawlers see tylko the raw. JS-injected SEO jest a fallback, nie the plan.
5. użyj modules, ale understand co they robić.
@nuxtjs/seo saves działać, ale the non-prod robots auto-disallow, the lastmod-tylko
mapa witryny reality, i absolute-URL canonicals są nadal yours to get right.
Nuxt SEO — cheat sheet
renderowanie modes
| Mode | Config | SEO | Best dla |
|---|---|---|---|
| Universal / SSR | ssr: true (domyślny) | ✅ Best | dynamiczny / personalized |
| statyczny / SSG | nuxt generate | ✅ Best | Blogs, docs, marketing |
| Hybrid | routeRules | ✅ Best | duży mixed-treść witryny |
| SPA / CSR | ssr: false | ⚠️ Poor dla indeksowanie | panele, admin |
| Edge-side | Deploy target | ✅ niski TTFB | Global wydajność |
Composables
| używać | Reach dla |
|---|---|
| SEO + social meta znaczniki | useSeoMeta() (type-bezpieczny) |
| tytuł templates, scripts, link znaczniki, html attrs | useHead() |
| Skip client re-execution dla statyczny meta | useServerHead() |
@nuxtjs/seo modules
| Module | Job |
|---|---|
@nuxtjs/robots | robots.txt + meta robots + X-Robots-znacznik (bloki non-prod by domyślny) |
@nuxtjs/sitemap | mapa witryny XML (tylko lastmod matters; auto index past 50k URLs) |
nuxt-og-image | dynamiczny OG images |
nuxt-schema-org | JSON-LD dane strukturalne |
nuxt-seo-utils | Canonical URLs (strips utm_*/fbclid/gclid), breadcrumbs |
nuxt-link-checker | Build-time broken links |
Fast reguły
- Install everything:
npx nuxt module add seo. - OG images: absolute URLs tylko.
- LCP image:
loading="eager"; wszystkie images needwidth/height(CLS). - CWV targets: LCP ≤ 2,5s, INP ≤ 200ms, CLS ≤ 0,1.
- nigdy blok JS/CSS in robots.txt.
- dynamiczny renderowanie: deprecated — Nuxt’s SSR/SSG zastępować it.
- AI crawlers: no JavaScript → SPA treść jest invisible to them.
See co a Nuxt strona actually ships
The whole Nuxt SEO question reduces to one sprawdzenie: jest twój treść in the raw HTML the serwer wysyła, lub tylko po JavaScript runs? If it’s in the raw HTML, you’re serwer-renderowanie i crawlers (i AI bots) może read it.
Fetch the raw HTML i look dla twój treść
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 twój tekst pokazuje in the przeglądarka ale jest missing z raw.html, the strona jest
client-wyrenderowany — flip the route to SSR lub prerender it. (A plain curl może’t run JS;
dla the wyrenderowany DOM używać URL Inspection lub a headless-Chrome crawler.)
Confirm you aren’t blocking 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 build output) lub /_ipx/ (the @nuxt/image
optimizer) będzie break renderowanie — almost zawsze a mistake.
statyczny config snippet (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)
},
}) narzędzia dla Nuxt SEO
- URL Inspection (Google Search Console) — the źródło of truth. Run a live test i sprawdź wyrenderowany HTML, screenshot, i strona zasoby to confirm twój Nuxt treść actually wyrenderowany i nothing’s blocked.
@nuxtjs/seo/ nuxtseo.com — Harlan Wilton’s module bundle; the dev narzędzia panel pokazuje twój generated robots, mapa witryny, schemat, i OG images in development.- Nuxt DevTools — inspect head znaczniki, route reguły, i który renderowanie mode każdy route jest używając.
- wyniki z elementami rozszerzonymi Test — confirm
nuxt-schema-orgJSON-LD jest present in the wyrenderowany output po dowolny renderowanie change. - Ahrefs witryna Audit / Screaming Frog (JS-renderowanie mode) — crawl z JS renderowanie on vs. off to diff raw vs. wyrenderowany HTML w całym the whole Nuxt app i catch CSR gaps.
- Lighthouse / PageSpeed Insights — Core Web Vitals (LCP, INP, CLS) dla the
@nuxt/imagei Nuxt Islands działać. - Bing narzędzia dla webmasterów — Bing’s crawl/index view i gdzie IndexNow submissions pokazywać up.
Nuxt SEO mistakes to avoid
Concrete mistakes że pokazywać up repeatedly on rzeczywisty Nuxt witryny — zapobiegać te przed they ship, zamiast diagnosing them po ruch drops.
Flipping ssr: false on treść you want zindeksowany
The single najbardziej expensive Nuxt SEO mistake. SPA mode ships the same empty-shell problem plain Vue ma — wyszukiwarki mieć to wait dla a render queue to fill in the treść. AI-crawler renderowanie contracts vary by provider, so a crawler że fetches tylko the initial HTML będzie miss the strona treść.
Why it’s błędny: you’re voluntarily giving up the one domyślny (SSR) że makes Nuxt easier to index than plain Vue.
co to robić instead: leave ssr: true (the domyślny) dla anything public i
indeksowalny. Reserve ssr: false dla genuinely non-zindeksowany surfaces — logged-in
panele, admin panels — via routeRules, nie a global config flip.
Putting useSeoMeta() in a shared layout
Setting tytuł/opis inside a layout component feels efficient — one place,
applies everywhere — ale it means każdy strona że używa że layout gets the same
generic znaczniki, i strona-level useSeoMeta() calls może get overwritten depending on
render order.
Why it’s błędny: unique, strona-specific tytuły i opisy są basic relevance signals; a layout-level domyślny collapses them wszystkie to one ciąg znaków.
co to robić instead: ustawić global fallbacks once in app.vue (tytuł template, OG
defaults), then call useSeoMeta() inside każdy strona component z że strona’s
rzeczywisty tytuł i opis.
wysyłka a relative ogImage URL
ogImage: '/social.png' looks fine in the przeglądarka i completely fails gdy
Facebook, LinkedIn, lub X try to fetch it, ponieważ social crawlers don’t resolve
relative paths wobec twój witryna.
Why it’s błędny: social platformy need an absolute URL to fetch the image; a relative path resolves to nothing z ich side.
co to robić instead: zawsze pass a pełny https:// URL, i ustawić site.url in
nuxt.config.ts so @nuxtjs/seo’s modules może build absolute URLs dla you
automatically.
Reaching dla dynamiczny renderowanie
Serving a prerendered snapshot to znany bots i the SPA to everyone else był a legitimate workaround years ago. Google ma since called it out directly: “dynamiczny renderowanie jest a workaround i nie a long-term solution.”
Why it’s błędny: it tylko serves the bots you configure, misses everything else (Bing, najbardziej AI crawlers), i dodaje rzeczywisty infrastructure to maintain — dla a problem Nuxt’s own SSR/SSG już solves.
co to robić instead: używać SSR lub nuxt generate i skip dynamiczny renderowanie
entirely. There’s no scenario gdzie a Nuxt witryna needs it.
Blocking /_nuxt/ lub /_ipx/ in robots.txt
A blanket Disallow: /assets/ lub an overzealous robots reguła może accidentally catch
Nuxt’s build output directory (/_nuxt/) lub the @nuxt/image optimizer path
(/_ipx/).
Why it’s błędny: if Googlebot może’t fetch the JS/CSS że builds the strona, it może’t confirm twój SSR output jest co it looks like — i dowolny client-side enhancements silently stop renderowanie dla it.
co to robić instead: nigdy disallow build-output lub image-optimizer paths. sprawdzenie
robots.txt po każdy deploy że touches routing lub module config, nie just once
at launch.
Leaving the non-production robots blok active po launch
@nuxtjs/robots disallows wszystkie crawlers on non-production environments by domyślny —
a good safety net dla staging, ale it reads environment variables to decide, i a
misconfigured NODE_ENV lub preview-deploy setting może make it fire in production
too.
Why it’s błędny: the witryna looks completely fine in a przeglądarka podczas gdy robots.txt
quietly disallows everything, i nothing gets zindeksowany until someone notices.
co to robić instead: po dowolny deploy lub environment change, fetch
https://yoursite.com/robots.txt directly i confirm it’s nie a blanket
Disallow: /.
Standing KPIs dla Nuxt SEO
The ongoing liczby to track once twój renderowanie setup jest poprawny — nie one-time sprawdzenia, ale recurring signals że catch regressions as the app changes.
Core Web Vitals (LCP, INP, CLS)
co it tells you: whether rzeczywisty visitors są getting a fast, stable strona — directly affected by Nuxt Islands/hydration cost (INP) i image-ładowanie choices (LCP, CLS).
How to pull it: pole data z the Chrome UX raport via /narzędzia/crux-tracker/ lub /narzędzia/cwv-checker/; lab data z Lighthouse dla pre-release sprawdzenia.
Benchmark / realistic range: Google’s opublikowany “good” thresholds są LCP ≤ 2,5s, INP ≤ 200ms, CLS ≤ 0,1 at the 75th percentile — tamte są the pass/fail wiersze CrUX itself używa, nie a liczba I’m inventing. gdzie you land w “good” depends heavily on twój image weight i how much you hydrate.
Cadence: CrUX pole data updates on a rolling 28-day window — sprawdzenie monthly, i immediately po dowolny change to images, fonts, lub hydration.
wyrenderowany-vs-raw HTML parity
co it tells you: whether the treść wyszukiwarki i AI crawlers może
actually see (the raw HTML) matches co a visitor sees in the przeglądarka (the wyrenderowany
DOM) — the core Nuxt SEO risk if ssr gets flipped lub a route regresses to CSR.
How to pull it: /narzędzia/render-gap/ diffs raw vs. wyrenderowany HTML dla a URL; dla the authoritative Google-side view, używać GSC’s URL Inspection → “View Crawled Page.”
Benchmark / realistic range: ten jest a binary sprawdzenie, nie a range — twój key treść (headline, body copy, linki wewnętrzne) powinien być present in the raw HTML, pełny stop. dowolny gap on a strona you want zindeksowany lub cited jest a regression to fix, nie a liczba to tolerate.
Cadence: po każdy deploy że touches routeRules, layouts, lub the ssr
config; spot-sprawdzenie key templates monthly otherwise.
Index coverage (strona indeksowanie raport)
co it tells you: how wiele of twój submitted URLs Google ma actually zindeksowany, i why the rest były excluded (duplicate, crawled-nie-zindeksowany, blocked, etc.) — the downstream signal że renderowanie problems eventually surface as.
How to pull it: Search Console → strona indeksowanie raport, filtered to twój Nuxt witryna’s URL patterns.
Benchmark / realistic range: there’s no universal healthy percentage — it depends on how wiele near-duplicate lub thin URLs twój route structure generates. Watch the trend i the exclusion powody, nie a target liczba.
Cadence: weekly podczas i po a renderowanie-mode migration; monthly otherwise.
AI crawler access
co it tells you: whether GPTBot, ClaudeBot, PerplexityBot, i similar AI
crawlers może actually fetch twój strony — oddzielny z Google, since te bots
generally don’t execute JavaScript i read tylko the raw HTML twój robots.txt
lets them reach.
How to pull it: /narzędzia/ai-crawler-checker/ to confirm no AI użytkownik-agent jest disallowed; serwer logs to confirm the bots są actually requesting strony, nie just permitted to.
Benchmark / realistic range: there’s no cytowanie-rate benchmark I może give you honestly — how często an AI answer engine cites you depends on the zapytanie space i competition, nie something Nuxt konfiguracja controls directly. Track access (allowed vs. blocked), nie a made-up cytowanie percentage.
Cadence: po każdy robots.txt lub @nuxtjs/robots config change; monthly log
spot-sprawdzenie otherwise.
Test yourself: Nuxt SEO
Five quick questions on optimizing a Nuxt witryna dla search. Pick an answer dla każdy, then sprawdzenie.
zasoby worth twój time
My powiązany writing
- SEO JavaScript: A Definitive poradnik — my pełny poradnik to renderowanie, DOM parity, the najbardziej-restrictive-directive reguła, i why SSR/statyczny/prerender (Nuxt included) są wszystkie fine dla search.
- The Beginner’s poradnik to techniczne SEO — gdzie renderowanie i crawling fit in the bigger picture.
My speaking
- SEO JavaScript — Ungagged 2019 (SlideShare) — Googlebot’s evergreen Chromium, the ~20× crawl cost of renderowanie, History API ponad hash routing, i how Google handles JS-injected canonicals. (Standing disclaimer: the dynamiczny-renderowanie advice in że deck jest now outdated — Google deprecated it.)
z around the industry
- Nuxt — renderowanie Concepts (official) — universal vs. client-side renderowanie i why crawlers prefer SSR.
- Nuxt — SEO i Meta (official) —
useSeoMeta()iuseHead(), the getting-started reference. - Learn SEO z Nuxt (Harlan Wilton / nuxtseo.com) — the najbardziej comprehensive programista-focused Nuxt SEO poradnik, kept current.
- harlan-zw/nuxt-seo (GitHub) — the źródło dla the
@nuxtjs/seomodule bundle. - Nuxt Image (official) —
<NuxtImg>i Core Web Vitals optymalizacja. - Optimize Nuxt wydajność (DebugBear) — a practitioner walkthrough of Nuxt Core Web Vitals fixes.
- Nuxt 3 renderowanie Modes (RisingStack) — a technical comparison of SSR, SSG, i hybrid renderowanie.
- r/TechSEO — the community dla renderowanie/indeksowanie debugging.
Videos
- Google Search Central (YouTube) — Martin Splitt’s SEO JavaScript series jest the best official walkthrough of how Google crawls, renders, i indexes JS apps; it’s framework-agnostic ale applies directly to Nuxt. Channel
Dziennik zmian
Zaktualizowano 27 lip 2026.
Podsumowanie redakcyjne i zapisane szczegóły zmian.Szczegóły zmian
-
Szczegółowe uwagi dotyczące zmian są obecnie dostępne po angielsku.
Pełne porównanie jest niedostępne — dla tej wersji nie zarchiwizowano wcześniejszej migawki.
Zaktualizowano 18 lip 2026.
Podsumowanie redakcyjne i zapisane szczegóły zmian.Szczegóły zmian
-
Szczegółowe uwagi dotyczące zmian są obecnie dostępne po angielsku.
-
Szczegółowe uwagi dotyczące zmian są obecnie dostępne po angielsku.
-
Szczegółowe uwagi dotyczące zmian są obecnie dostępne po angielsku.
-
Szczegółowe uwagi dotyczące zmian są obecnie dostępne po angielsku.
-
Szczegółowe uwagi dotyczące zmian są obecnie dostępne po angielsku.
Pełne porównanie jest niedostępne — dla tej wersji nie zarchiwizowano wcześniejszej migawki.