Vue und SEO
Vue 3 standardmäßig Client-Side Rendering verwendet, daher ist der Inhalt nicht im rohen HTML. So machen Sie Vue-Apps crawlbar und indexierbar – Router-Modus, @unhead/vue, Prerendering mit vite-ssg, SSR/SSG mit Nuxt, Hydration und Core Web Vitals.
Sprachen
Vue 3 verwendet standardmäßig Client-Side Rendering, daher liefert eine einfache Vite + Vue-App eine leere HTML-Hülle und erstellt die Seite im Browser. Google kann sie rendern – aber das Rendering ist verzögert und asynchrone Daten können übersehen werden, und Bing und Social-Scraper können das JS oft gar nicht ausführen. Die Lösungen: Verwenden Sie den Vue-Router im History-Modus (nicht im Hash-Modus), verwalten Sie <head> mit @unhead/vue, und bringen Sie den Inhalt mit Prerendering (vite-ssg), SSR oder SSG über Nuxt ins HTML. Dynamisches Rendering ist veraltet – bauen Sie nicht darauf auf.
TL;DR — Vue baut Ihre Seite standardmäßig im Browser auf. Das bedeutet, dass das rohe HTML, das eine Suchmaschine zuerst herunterlädt, nahezu leer ist – der eigentliche Inhalt erscheint erst nachdem JavaScript ausgeführt wurde. Google kann das normalerweise verarbeiten, aber Bing und die Bots, die Social-Sharing-Vorschauen erstellen, können das oft nicht. Die Lösungen: Verwenden Sie den “history”-Modus von Vue Router für saubere URLs, fügen Sie eine kleine Bibliothek namens
@unhead/vuefür Ihre Titel und Beschreibungen hinzu, und für Seiten, die ranken sollen, bauen Sie das HTML im Voraus auf (Prerendering oder Nuxt), anstatt es nur im Browser zu rendern.
Warum Vue besondere SEO-Aufmerksamkeit benötigt
Wenn Sie eine Website mit Vue 3 auf die übliche Weise (Vite + Vue) erstellen, sendet der Server eine winzige HTML-Datei – im Grunde einen leeren Container – und ein großes JavaScript-Bundle. Der Browser führt dieses JavaScript aus, um die eigentliche Seite zu zeichnen. Dies wird als Client-seitiges Rendering (CSR) bezeichnet. Evidence for this claim A Vue application can render its interface in the browser with client-side JavaScript. Scope: Vue client-side rendering architecture. Confidence: high · Verified: Vue: SSR guide
Ein Mensch bemerkt das nie. Eine Suchmaschine vielleicht. Das Erste, was ein Crawler herunterlädt, ist dieser fast leere Container. Er muss Ihr JavaScript ausführen, um etwas zu sehen – und nicht jeder Crawler macht das gut.
- Google führt eine aktuelle Version von Chrome aus und kann Ihre Vue-App rendern. Es führt das Rendering jedoch später in einer Warteschlange aus, und wenn Ihr Inhalt auf eine langsame Datenanfrage wartet, kann Google weitermachen, bevor sie geladen ist.
- Bing, DuckDuckGo und Social-Preview-Bots (diejenigen, die die kleine Karte erstellen, wenn Sie einen Link in X, Slack oder iMessage einfügen) sind beim Ausführen von JavaScript viel weniger zuverlässig. Bei einer einfachen Vue-App können Ihre Social-Previews leer erscheinen.
Die drei Dinge, die Sie richtig machen sollten
-
Verwenden Sie den “history”-Modus in Vue Router, nicht den “hash”-Modus. URLs im Hash-Modus sehen aus wie
example.com/#/about. Die eigene Dokumentation von Vue Router sagt, dass der Hash-Modus “einen schlechten Einfluss auf SEO hat.” Verwenden SiecreateWebHistory(), damit Ihre URLs wieexample.com/aboutaussehen. Evidence for this claim Vue Router recommends HTML5 history mode for normal-looking URLs and warns that hash mode has a negative SEO effect. Scope: Vue Router history modes. Confidence: high · Verified: Vue Router: History modes -
Verwalten Sie Ihre Titel und Meta-Tags mit
@unhead/vue. Standardmäßig teilen sich alle Vue-Seiten denselben Titel und dieselbe Beschreibung.@unhead/vueermöglicht es jeder Seite, ihre eigenen zu setzen – einschließlich der Open-Graph- und Twitter-Tags, die Social-Previews steuern. -
Platzieren Sie Ihren Inhalt im HTML für Seiten, die ranken sollen. Anstatt alles im Browser zu erstellen, bauen Sie es im Voraus auf, sodass der Inhalt bereits da ist, wenn ein Crawler ankommt. Der einfache Einstieg ist Prerendering mit einem Tool namens
vite-ssg. Für größere oder dynamischere Websites erledigt Nuxt (das offizielle Vue-Framework dafür) das für Sie.
Sollten Sie einfach Nuxt verwenden?
Für die meisten Websites, bei denen SEO wirklich wichtig ist, ja – und die eigene Dokumentation von Vue verweist Sie dorthin. Nuxt übernimmt das Rendering, die Meta-Tags, Sitemaps und robots.txt für
Sie. Wenn Ihre Website relativ statisch ist (eine Marketing-Website, Dokumentation, ein Blog), ist vite-ssg
eine leichtere Option, die keinen Framework-Wechsel erfordert.
Möchten Sie die tiefere Version – wie die Render-Warteschlange von Google funktioniert, den @unhead/vue-Code,
Prerendering vs. SSR, Hydration-Mismatches und Core Web Vitals? Wechseln Sie zum
Erweitert-Tab.
TL;DR — Vue 3 ist standardmäßig CSR, daher ist der Inhalt nicht im rohen HTML – Google rendert es später über seine Evergreen-Chromium-WRS, aber das Rendering wird in die Warteschlange gestellt und asynchrone Daten, die in
onMountedabgerufen werden, können übersehen werden, und Bing/Social-Scraper führen das JS oft gar nicht aus. Nicht verhandelbar: Vue RoutercreateWebHistory()(Hash-Modus hat “einen schlechten Einfluss auf SEO”),<head>über@unhead/vue/useSeoMeta(), und eine Rendering-Strategie, die Inhalte ins HTML bringt –vite-ssg-Prerendering für inhaltsstabile Websites, Nuxt für vollständiges SSR/SSG. Dynamisches Rendering ist veraltet;prerender-spa-pluginist Legacy. Achten Sie auf Hydration-Mismatches (eine Server/Client-Inhaltsdifferenz ist ein SEO-Problem, nicht nur ein Performance-Problem) und die Auswirkung des CSR-Bundles auf LCP. Für die framework-agnostische Version all dessen, siehe JavaScript SEO.
Das Standard-Vite-+-Vue-Gerüst ist client-seitig gerendert
Eine einfache npm create vue@latest-App (Vite + Vue) liefert eine fast leere HTML-Hülle und ein JavaScript-Bundle. Der Browser führt dieses Bundle aus, um das DOM aufzubauen. Das ist für Nutzer in Ordnung, aber ein Problem für Crawler: Das rohe HTML enthält fast keinen Inhalt, und alles hängt vom Rendering ab.
Das ist eine Eigenschaft des Standard-Scaffolds, keine Grenze von Vue selbst – Vue Core unterstützt auch Server-Rendering (createSSRApp) und statische Generierung als erstklassige Pfade, und Vues eigener SSR-Leitfaden lenkt die meisten Produktions-SSR/SSG-Arbeiten eher zu Nuxt als zu einem handgebauten Setup. Bevor Sie also zu einer Lösung greifen, prüfen Sie, was Ihre App tatsächlich ausliefert: Eine nackte Vite-SPA ohne Rendering-Konfiguration ist CSR; dieselbe App hinter Nuxt oder vite-ssg ist es nicht.
Vues eigener SSR-Leitfaden ist direkt, was den Vorteil angeht, dies nicht zu tun: Mit Server-Side-Rendering “the search engine crawlers will directly see the fully rendered page.” (Übersetzung) „Die Suchmaschinen-Crawler sehen die vollständig gerenderte Seite direkt.“ Die Kehrseite ist das, was Sie standardmäßig ausliefern – Inhalte, die erst existieren, nachdem JavaScript läuft. Evidence for this claim Vue server-side rendering sends rendered HTML so crawlers can directly see page content. Scope: Vue SSR benefits; does not guarantee indexing. Confidence: high · Verified: Vue: SSR guide
(Vue 2 erreichte im Dezember 2023 das Ende seiner Lebensdauer; hier geht es alles um Vue 3.)
Wie Googlebot eine Vue-App verarbeitet
Google verarbeitet JavaScript in Phasen – das rohe HTML wird gecrawlt, dann in einer Evergreen-Headless-Chromium-Instanz (dem Web Rendering Service) gerendert, und dann wird das gerenderte Ergebnis indexiert. Daraus folgen zwei Dinge:
- Rendering wird in eine Warteschlange gestellt und verzögert. Eine Seite sitzt in der Render-Warteschlange – normalerweise Sekunden bis Minuten, aber es kann auch ausschlagen. Inhalte, die erst nach der JS-Ausführung existieren, sind nicht sofort indexierbar; Inhalte im rohen HTML sind es.
- Asynchrone Daten sind das eigentliche Risiko. Synchrones JavaScript rendert zuverlässig. Daten, die nach dem Mounten von einer API geholt werden, sind nicht garantiert erfasst. Vues SSR-Leitfaden sagt es deutlich: “If your app starts with a loading spinner, then fetches content via Ajax, the crawler will not wait for you to finish. This means if you have content fetched asynchronously on pages where SEO is important, SSR might be necessary.” (Übersetzung) „Wenn Ihre App mit einem Lade-Spinner startet und dann Inhalte per Ajax abruft, wartet der Crawler nicht, bis Sie fertig sind. Das bedeutet: Wenn Sie Inhalte asynchron auf Seiten abrufen, bei denen SEO wichtig ist, könnte SSR notwendig sein.“ Praktisch: Daten, die in
onMountedabgerufen werden, sind nur clientseitig und für Crawler, die nicht rendern, unsichtbar – und selbst bei denen, die es tun, riskant.
John Mueller hat den Fehlermodus für SPA-artige Setups beschrieben, bei denen das statische HTML weitgehend identisch ist und alle einzigartigen Inhalte von JavaScript abhängen: Wenn dieses JS nicht ordnungsgemäß ausgeführt werden kann, sehen die Seiten für Google gleich aus, und der Fokus bleibt auf dem Boilerplate-HTML statt auf den JS-geladenen Inhalten. Die Lektion ist dieselbe wie auf der breiteren JavaScript-SEO-Seite: Bringen Sie die Inhalte schnell und zuverlässig ins DOM.
Bing und Social-Bots sind dabei schlechter als Google. Bing hat keine mit Google vergleichbare Rendering-Pipeline, und Social-Preview-Scraper (X, Slack, iMessage) führen im Allgemeinen überhaupt kein JavaScript aus – eine nackte CSR-Vue-App erzeugt also leere Share-Previews. Wenn Bing-Traffic oder Social-Sharing wichtig ist, sind Prerendering oder SSR nicht optional.
Vue Router: createWebHistory() verwenden, nicht den Hash-Modus
Vue Router hat zwei Verlaufsmodi. Hash-Modus (createWebHashHistory()) erzeugt URLs wie example.com/#/about; die Vue-Router-Dokumentation sagt, dass er “does however have a bad impact in SEO” (Übersetzung) „jedoch einen schlechten Einfluss auf SEO hat“, weil alles nach dem # ein Fragment ist, das der Server ignoriert. Evidence for this claim Vue Router hash history uses a URL fragment that is not sent to the server and is discouraged for SEO. Scope: Vue Router hash history. Confidence: high · Verified: Vue Router: History modes
Verwenden Sie den HTML5-Verlaufsmodus:
import { createRouter, createWebHistory } from 'vue-router'
const router = createRouter({
history: createWebHistory(),
routes: [/* ... */],
})Der Verlaufsmodus ergibt saubere URLs (example.com/about), erfordert aber einen Server-Fallback – jede direkte Anfrage an eine Route muss index.html ausliefern, damit Vue übernehmen kann, sonst führen direkte Treffer zu 404. Konfigurieren Sie diesen Catch-all auf Ihrem Host (Nginx try_files, ein SPA-Rewrite auf Netlify/Vercel/Cloudflare usw.).
Begrenzen Sie dieses Rewrite sorgfältig – ein Catch-all, der zu breit ist, liefert auch index.html für fehlende statische Assets, echte API-Routen oder Seiten aus, die Sie tatsächlich als 404 haben möchten. Das macht die Soft-404-Anleitung unten stillschweigend zunichte und kann einen kaputten Link hinter einer Seite verstecken, die aussieht, als hätte sie „funktioniert“.
Für echte Nicht-gefunden-Zustände vermeiden Sie Soft-404s – eine clientseitige „Nicht gefunden“-Ansicht, die weiterhin 200 zurückgibt, kann als leere Hülle indexiert werden. Die Anleitung von Google lautet, entweder auf eine URL umzuleiten, die einen echten 404-Status zurückgibt, oder ein <meta name="robots" content="noindex"> zu Fehlerseiten hinzuzufügen, und die History API für das Routing zwischen Ansichten zu verwenden.
Head- und Meta-Verwaltung: @unhead/vue
Standardmäßig teilen sich alle Vue-Routen einen <title> und eine Meta-Description. Die Tag-Historie ist hier wichtig, weil die alten Antworten Sackgassen sind:
vue-meta– die Bibliothek aus der Nuxt-2-Ära. Veraltet.@vueuse/head– ihr Nachfolger, inzwischen eingestellt.@unhead/vue– der aktuelle Community-Standard und das, was Sie für eine Nicht-Nuxt-Vue-3-App verwenden sollten.
Der ergonomische Einstiegspunkt ist das useSeoMeta()-Komposable – typsicher, XSS-sicher und mit Kenntnis von über 100 Meta-Tags, einschließlich Open Graph und Twitter Card:
import { useSeoMeta } from '@unhead/vue'
useSeoMeta({
title: 'Vue SEO Guide',
description: 'How to make a Vue 3 app crawlable and indexable.',
ogTitle: 'Vue SEO Guide',
ogDescription: 'How to make a Vue 3 app crawlable and indexable.',
twitterCard: 'summary_large_image',
})Meta kann reaktiv sein – übergeben Sie einen Getter oder einen berechneten Wert, und die Tags aktualisieren sich, wenn sich Ihre Daten ändern. Für kanonische Tags ist das sicherste Muster immer noch HTML, nicht JS: Die Anleitung von Google besagt, dass “the best way to set the canonical URL is to use HTML,” und wenn Sie es mit JavaScript injizieren müssen, setzen Sie es immer auf denselben Wert, den das HTML hätte. (Ich habe JS-Kanonische bei Ahrefs getestet und festgestellt, dass Google sie respektiert – es führte sogar dazu, dass Google eine Ausnahme zu seiner Dokumentation hinzufügte – aber HTML ist immer noch der risikoärmere Weg.)
Wählen Sie eine Rendering-Strategie
Dies ist die Entscheidung, die wirklich den Unterschied macht. Gleiches Menü wie auf der framework-agnostischen JavaScript-SEO-Seite, angewendet auf Vue.
Client-seitiges Rendering (CSR) – der Standard und der riskante. Akzeptabel für app-ähnliche Seiten hinter einem Login, Dashboards und alles, was nicht indexiert werden muss. Nicht akzeptabel für Inhalte, die ranken oder geteilt werden müssen.
Prerendering mit vite-ssg. Für inhaltsstabile Vue-3-SPAs generiert vite-ssg statisches HTML zur Build-Zeit – tauschen Sie Ihr Build-Skript von vite build auf vite-ssg build. Es enthält @unhead/vue integriert. Großartig für Marketing-Websites, Dokumentationen und Blogs; kein Ersatz für SSR auf stark dynamischen, pro Anfrage generierten Seiten. Beachten Sie, dass das alte webpack-zeitliche prerender-spa-plugin veraltet und praktisch nicht mehr gewartet ist – vite-ssg (oder Nuxt) ist der moderne Ersatz.
Server-seitiges Rendering. Der offizielle Vue-Leitfaden behandelt ein manuelles SSR-Setup mit @vue/server-renderer, lenkt die meisten Projekte jedoch ausdrücklich zu einem Meta-Framework, anstatt ein eigenes zu entwickeln – und für einfache Fälle sagt er sogar “if you’re only investigating SSR to improve the SEO of a handful of marketing pages … then you probably want SSG instead of SSR.” Wenn Sie manuelles SSR durchführen, erstellen Sie App, Router und Store pro Anfrage neu: Auf einem langlebigen Node-Server werden Modulebene-Singletons über Anfragen hinweg wiederverwendet, und das Mutieren von gemeinsamem Zustand mit den Daten eines Benutzers kann diese in die Antwort eines anderen Benutzers leaken. Das ist ein weiterer Grund, warum die Vue-Dokumentation die meisten Projekte auf Nuxt verweist, das die Isolierung pro Anfrage für Sie übernimmt.
Nuxt – die empfohlene Komplettlösung. Nuxt bietet SSR und SSG out of the box, integriertes useSeoMeta() und Head-Management sowie das @nuxtjs/seo-Modul für Sitemaps, robots.txt und strukturierte Daten. Für die meisten Vue-Projekte, bei denen SEO wichtig ist, ist dies der Weg, den Vues eigene Dokumentation aufzeigt. (Nuxt hat seine eigene Tiefe – separat behandelt; betrachten Sie dies als Querverweis, nicht als tiefen Einblick.)
Dynamisches Rendering – nicht tun. Das Ausliefern von vorgerendertem HTML an Bots und der SPA an Benutzer war immer ein Workaround, und Google hat es 2024 als veraltet eingestuft, wobei die Implementierungsdokumentation entfernt wurde. Bauen Sie stattdessen auf SSR oder SSG auf.
Für Dokumentationen im Speziellen ist VitePress der Vue-native Static-Site-Generator. Jede Seite wird als reines HTML ausgeliefert – keine JS-Rendering-Barriere – und SEO wird über Frontmatter (title, description, head) oder den transformHead-Build-Hook für kanonische/dynamische Tags konfiguriert.
Hydratationsabweichungen sind ein SEO-Problem, nicht nur ein Performance-Problem
Wenn Sie SSR/SSG verwenden, mountet der Client mit createSSRApp() – nicht mit dem einfachen
createApp() – und hydratisiert das serverseitig gerenderte HTML, anstatt es von Grund auf
neu aufzubauen. Wenn das Server-HTML und das Client-Rendering divergieren, verwirft Vue die
abweichenden Knoten und rendert sie neu. In SEO-Begriffen bedeutet das, dass der Inhalt, den Google
aus dem Server-Rendering indexiert hat, von dem abweichen kann, was der Benutzer nach der Hydratation
sieht – eine Inkonsistenz im Qualitätssignal, nicht nur ein Flackern. Häufige Ursachen: ungültiges
HTML-Verschachteln, zufällige Werte in Vorlagen und Datums-/Zeitabweichungen zwischen Server und
Client. Vue 3.5+ fügt data-allow-mismatch hinzu, um die Warnung über die Abweichung selektiv zu
unterdrücken, wo eine Abweichung beabsichtigt ist – es beruhigt die Konsole, macht aber die Server-
und Client-Ausgabe nicht äquivalent. Greifen Sie also nicht einfach danach, um eine Abweichung zu
verstummen, die Sie nicht tatsächlich diagnostiziert haben.
Core Web Vitals sind ein Vue-spezifisches Anliegen
Standard-CSR-Vue liefert ein großes JS-Bundle, das heruntergeladen, geparst und ausgeführt werden muss, bevor der größte Inhalt gemalt wird – also leidet LCP, wenn Sie nichts tun. Hebel:
- Code-Splitting (Vite-Standard) und lazy-loaded Routen, damit Sie nicht die gesamte App im Voraus ausliefern.
fetchpriority="high"auf dem LCP-Heldenbild.- Vapor Mode – ein optionaler Compiler-Modus, der für geeignete Komponenten das virtuelle DOM umgeht, was die Hydratationskosten auf SSR-Seiten senken kann. Es ist Vue 3,6, nicht 3,5 – noch experimentell (Beta/Release-Kandidat ab Mitte 2026, noch nicht in der stabilen 3,5.x-Linie) – es ist beobachtenswert, aber nichts, worauf man heute in der Produktion angewiesen sein sollte.
Strukturierte Daten in Vue
Google führt JavaScript aus, bevor es strukturierte Daten liest, daher funktioniert das Einfügen von
JSON-LD – @unhead/vue’s useHead() mit einem script vom Typ
application/ld+json ist das zuverlässige Muster. Da es vom Rendering abhängt,
bestätigen Sie es mit URL Inspection, anstatt anzunehmen, dass Google es gesehen hat.
Wo dies einzuordnen ist
Vue-SEO ist ein Beispiel für das allgemeine JavaScript-SEO Problem – Parität, Interaktion, Zustand, Timing – und es teilt fast alles mit der Headless-CMS Situation, bei der der Rendering-Modus des Frontends das Ergebnis bestimmt.
Eine Einschränkung, die für jede der oben genannten Optionen gilt: SSR und SSG bringen Ihre Inhalte in das HTML, aber keines von beiden garantiert Indexierung, Rankings, Core Web Vitals oder dass die Hydratation exakt mit der Server-Ausgabe übereinstimmt. Sie entfernen die JavaScript-Rendering-Barriere – der Rest der SEO (und Korrektheit) liegt weiterhin bei Ihnen.
Wenn Sie sich eines merken: Bringen Sie Ihre Inhalte ins HTML. Alles andere ist Detail.
KI-Zusammenfassung
Eine komprimierte Darstellung der erweiterten Version:
- Das Standard-Vite-+-Vue-Gerüst ist CSR – eine einfache
npm create vue@latest-App liefert eine fast leere HTML-Hülle und baut das DOM im Browser auf. Das ist eine Eigenschaft des nackten Gerüsts, keine Grenze von Vue selbst – Vue Core unterstützt auch SSR (createSSRApp) und SSG als erstklassige Pfade. - Google rendert Vue, aber mit Einschränkungen – sein immergrüner Chromium-WRS führt das JS aus,
aber das Rendering wird in die Warteschlange gestellt/verzögert und async-Daten (z. B. in
onMountedabgerufen) können übersehen werden. Vues SSR-Dokumentation: Ein Crawler “wird nicht darauf warten, dass Sie fertig sind” mit einem Ajax- Abruf hinter einem Spinner. - Bing und Social-Scraper sind schlechter – sie führen oft gar kein JS aus, sodass eine nackte CSR-Vue-App leere Share-Vorschauen erzeugt.
- Router: Verwenden Sie
createWebHistory(), nicht den Hash-Modus (Hash hat “einen schlechten Einfluss auf SEO”). Der History-Modus benötigt einen Server-index.html-Fallback – so begrenzt, dass er nicht auch echte statische Assets, API-Routen oder beabsichtigte 404s verschluckt. Vermeiden Sie Soft-404s. - Head/Meta:
@unhead/vuemituseSeoMeta()ist der aktuelle Standard;vue-metaist veraltet,@vueuse/headist eingestellt. Bevorzugen Sie HTML-Kanonische. - Die Rendering-Strategie entscheidet: CSR (riskant, OK für App-Seiten) →
vite-ssgVorab-Rendering (inhaltsstabile Websites) → SSR/SSG über Nuxt (die empfohlene vollständige Lösung).prerender-spa-pluginist veraltet; dynamisches Rendering ist veraltet. Wenn Sie manuelles SSR rollen, bauen Sie die App/den Router/den Store pro Anfrage neu auf, um Cross-Request-State-Leaks zu vermeiden. - VitePress für Dokumentationsseiten (einfaches statisches HTML).
- Hydration verwendet
createSSRApp(); Abweichungen erzeugen eine Server/Client-Inhaltsdifferenz – ein SEO-Qualitätsproblem, nicht nur ein Flackern. Vuesdata-allow-mismatchab 3,5+ unterdrückt die Warnung für beabsichtigte Fälle – es macht die beiden Renderings nicht gleichwertig. - Core Web Vitals: Ein großes CSR-Bundle schadet LCP – Code-Splitting, Lazy Routes,
fetchpriority="high"und (experimentell, Vue 3.6 Beta/RC – noch nicht stabil) Vapor Mode. - Strukturierte Daten über
@unhead/vueuseHead()JSON-LD; verifizieren Sie mit URL Inspection. - Keine Option hier garantiert Indexierung, Rankings, CWV oder Hydration-Parität – SSR/SSG entfernen die JS-Rendering-Barriere; der Rest der SEO liegt weiterhin bei Ihnen.
Offizielle Dokumentation
Primärquellen-Dokumentation von Vue und den Suchmaschinen.
Vue
- Server-Side Rendering (SSR) | Vue.js – der SEO-Vorteil von SSR, die Async/Spinner-Einschränkung und die SSG-Empfehlung für Marketingseiten.
- Different History modes | Vue Router –
createWebHistory()vs. Hash-Modus, der SEO-Hinweis und die Server-Fallback-Anforderung. - useSeoMeta() · Unhead – die aktuelle
@unhead/vue-Composable für typsicheres Meta-Management. - Site Config | VitePress und Frontmatter Config | VitePress – SEO-Konfiguration für Vue-basierte Dokumentationsseiten.
- antfu-collective/vite-ssg | GitHub – Build-Zeit-Vorab-Rendering für Vue-3-SPAs.
- Understand the JavaScript SEO basics – Zwei-Phasen-Verarbeitung, die History-API-Empfehlung, Soft-404-Behandlung und HTML-Kanonische.
- Dynamic Rendering as a workaround – jetzt als veraltet markiert; stattdessen werden SSR/statisches Rendering/Hydration empfohlen.
- Introducing a new JavaScript SEO video series – Googles offizielle JS-SEO-Serie (einschließlich der Vue.js-Episode).
Zitate aus der Quelle
Aussagen auf dem Prüfstand von Vue und Google. Jeder Link ist ein Deep Link, der zur zitierten Passage auf der Quellseite springt.
Vue – SSR & SEO
- “Better SEO: the search engine crawlers will directly see the fully rendered page.” (Übersetzung) „Besseres SEO: Die Suchmaschinen-Crawler sehen direkt die vollständig gerenderte Seite.“ — Vue.js-SSR-Leitfaden. Zum Zitat springen
- “As of now, Google and Bing can index synchronous JavaScript applications just fine. Synchronous being the key word there. If your app starts with a loading spinner, then fetches content via Ajax, the crawler will not wait for you to finish.” (Übersetzung) „Google und Bing können synchrone JavaScript-Anwendungen derzeit problemlos indexieren. Synchron ist dabei das Schlüsselwort. Wenn Ihre App mit einem Lade-Spinner startet und dann Inhalte per Ajax abruft, wartet der Crawler nicht, bis Sie fertig sind.“ Zum Zitat springen
- “If you’re only investigating SSR to improve the SEO of a handful of marketing pages … then you probably want SSG instead of SSR.” (Übersetzung) „Wenn Sie SSR nur untersuchen, um das SEO einiger weniger Marketing-Seiten zu verbessern … dann möchten Sie wahrscheinlich SSG statt SSR.“ Zum Zitat springen
Vue Router – History-Modus
- Im Hash-Modus: “It does however have a bad impact in SEO.” (Übersetzung) „Es hat jedoch einen schlechten Einfluss auf SEO.“ Zum Zitat springen
Google – JavaScript-SEO-Grundlagen
- Zu Kanonischen: “The best way to set the canonical URL is to use HTML, but if you have to use JavaScript, make sure that you always set the canonical URL to the same value as the original HTML.” (Übersetzung) „Der beste Weg, die kanonische URL festzulegen, ist die Verwendung von HTML. Wenn Sie jedoch JavaScript verwenden müssen, stellen Sie sicher, dass Sie die kanonische URL immer auf denselben Wert wie das ursprüngliche HTML setzen.“ Zum Zitat springen
Google – Dynamic Rendering (veraltet)
- “Dynamic rendering was a workaround and not a long-term solution for problems with JavaScript-generated content in search engines.” (Übersetzung) „Dynamic Rendering war eine Notlösung und keine langfristige Lösung für Probleme mit JavaScript-generierten Inhalten in Suchmaschinen.“ Zum Zitat springen
Vue-SEO-Checkliste
Ein Durchgang, um zu bestätigen, dass eine Vue-3-App crawlbar und indexierbar ist:
- Vue Router verwendet
createWebHistory()(HTML5-History-Modus), nichtcreateWebHashHistory(). - Der Server hat einen
index.html-Fallback, sodass direkte Routen-Treffer keinen 404-Fehler ergeben. -
@unhead/vueist eingerichtet; jede Seite setzt ihren eigenen Titel, ihre eigene Beschreibung und ihre eigene kanonische URL (nicht alle teilen sich den Standard). - Open-Graph-/Twitter-Card-Tags sind vorhanden (und werden tatsächlich für Social-Scraper gerendert – d. h. sie stehen im ausgelieferten HTML, nicht nur im CSR).
- Die kanonische URL ist nach Möglichkeit im HTML gesetzt; wenn sie per JS injiziert wird, stimmt sie überein.
- SEO-kritische Inhalte stehen im HTML über SSR/SSG/Prerendering – nicht per
onMountedauf einer CSR-Seite abgerufen. - Clientseitige Nicht-gefunden-Zustände geben einen echten
404oder einnoindexzurück (keine Soft-404-Seiten). - JavaScript und CSS sind nicht blockiert in
robots.txt. - Keine Abhängigkeit von Dynamic Rendering in neuen Builds (von Google als veraltet eingestuft).
- Core Web Vitals bestehen – Code-Splitting, Lazy Routes,
fetchpriority="high"auf dem LCP-Bild. - Bei SSR/SSG: keine Hydration-Mismatches (Konsole prüfen;
data-allow-mismatchnur für beabsichtigte verwenden). - Strukturierte Daten (JSON-LD) im gerenderten HTML über URL Inspection bestätigt.
Die mentalen Modelle
1. Die Standardeinstellung ist die Falle. Vue 3 ist standardmäßig CSR – Inhalte stehen nicht im rohen HTML. Bei Vue-SEO geht es darum, diese Standardeinstellung für Seiten zu überschreiben, die gefunden werden müssen.
2. Rendering entscheidet über das Ergebnis.
Die wichtigste Entscheidung ist, wie das HTML erzeugt wird: CSR (riskant) →
Prerendering/vite-ssg (inhaltsstabil) → SSR/SSG über Nuxt (dynamisch, SEO-kritisch).
Wählen Sie die leichteste Option, die Ihre Inhalte in das HTML bringt.
3. Synchron im HTML, nicht asynchron nach dem Mount. Inhalte, die synchron vorhanden sind, werden zuverlässig gerendert; Daten, die nach dem Mount abgerufen werden, können übersehen werden – von den Crawlern, die spät rendern, und vollständig von denen, die es nicht tun.
4. Zwei Zielgruppen von Bots. Google rendert (irgendwann). Bing und Social-Scraper tun das größtenteils nicht. Entwerfen Sie für die schlechtere Variante, wenn Bing-Traffic oder Share-Previews wichtig sind – das bedeutet HTML, nicht CSR.
5. Der Entscheidungsbaum für ein neues Vue-Projekt.
Reine App hinter einem Login? CSR ist in Ordnung. Inhaltsstabile Marketing-/Dokumentations-/Blog-Seiten? vite-ssg
oder VitePress. Dynamische, pro Anfrage SEO-kritische Inhalte? Nuxt. Greifen Sie niemals zu
Dynamic Rendering oder prerender-spa-plugin – beides sind Sackgassen im Jahr 2026.
6. Server und Client müssen übereinstimmen. Hydration-Mismatch ist nicht nur ein Performance-Detail – es ist eine Inhaltsdifferenz zwischen dem, was Google indexiert hat, und dem, was der Benutzer erhält. Halten Sie die beiden Renderings identisch.
Vue SEO – Spickzettel
Router-Modus
| Modus | URL | SEO |
|---|---|---|
createWebHistory() | example.com/about | Dies verwenden (benötigt Server-Fallback) |
createWebHashHistory() | example.com/#/about | ”Bad impact in SEO” – vermeiden |
Head-/Meta-Bibliotheken
| Bibliothek | Status |
|---|---|
vue-meta | Legacy (Nuxt-2-Ära) |
@vueuse/head | Eingestellt |
@unhead/vue (useSeoMeta()) | Aktueller Standard |
Rendering-Strategien
| Strategie | Wann | SEO-Risiko |
|---|---|---|
| CSR (Standard) | App-Seiten, hinter Login | Höchstes |
vite-ssg Prerendering | Inhaltsstabile SPAs (Marketing/Doku/Blog) | Niedrig |
| SSR (Nuxt) | Dynamische, pro Anfrage Seiten | Niedrig |
| SSG (Nuxt / VitePress) | Inhalte zur Build-Zeit bekannt | Niedrigstes |
prerender-spa-plugin | — | Legacy/nicht gewartet – nicht verwenden |
| Dynamic Rendering | — | Von Google veraltet – nicht verwenden |
Schnelle Fakten
- Google rendert Vue (Evergreen-Chromium-WRS) – aber verzögert, und asynchrone Daten können übersehen werden.
- Bing + Social-Scraper führen oft kein JS aus – reines CSR = leere Share-Previews.
- Kanonische URLs: HTML zuerst; JS-Kanonische funktionieren, sind aber riskanter.
- Vue 2 ist EOL (Dez. 2023) – nur Vue 3.
Wie sollte eine Vue-Route rendern?
Choose a Vue SEO rendering path
Vue-SEO-Fehler
- Versand von Such-Landingpages als Vite-SPA-Shell. Verwenden Sie Nuxt SSR/SSG oder Prerendering, damit wesentliche Inhalte im Quell-HTML sind.
- Verwendung des Hash-Modus für öffentliche Inhaltsrouten. Fragmente erzeugen keine normalen Server-URLs. Verwenden Sie History-Routing mit korrekt konfiguriertem Host-Fallback.
- Setzen von Head-Tags erst nach Client-Fetches. Generieren Sie Metadaten aus Server-/Build-Daten über die Head-Integration.
- Verwendung von Dynamic Rendering als langfristige Lösung. Pflegen Sie einen konsistenten Benutzer-/Crawler-Rendering-Pfad statt bot-spezifischer Ausgaben.
- Nur mit Google testen. Rohes HTML ist für andere Suchmaschinen, Social-Scraper und Tools, die die Anwendung nicht vollständig ausführen, wichtig.
Rohes HTML enthält nur das Vue-Mount-Element
Wahrscheinliche Ursache: Die Route ist nur CSR. Fix: Verschieben Sie sie zu Nuxt SSR/SSG oder prerendern Sie die endliche Routenmenge. Bestätigen: curl gibt den primären Inhalt und Links zurück.
Direkte Routenanfragen geben 404 zurück
Wahrscheinliche Ursache: Der History-Modus von Vue Router hat keinen Server-Fallback oder das Deployment hat generierte Routen ausgelassen. Fix: Konfigurieren Sie Host-Rewrites für reine SPA-Routen oder deployen Sie tatsächliche SSR-/statische Routenausgaben. Bestätigen: Aktualisieren und direkte Anfragen geben den beabsichtigten Status und die Seite zurück.
Titel aktualisieren im Browser, aber nicht im Quellcode
Wahrscheinliche Ursache: Metadaten hängen vom Client-Lebenszyklus oder einem asynchronen Browser-Fetch ab. Fix: Lösen Sie Daten während SSR/SSG auf und rendern Sie Head-Tags mit @unhead/vue oder Nuxts Head-APIs. Bestätigen: Rohe und gerenderte Titel, Kanonische und Robots-Direktiven stimmen überein.
Hydration ersetzt korrekten Serverinhalt
Wahrscheinliche Ursache: Server-/Client-Daten oder Umgebungszweige stimmen nicht überein. Behebung: Machen Sie die Anfangsdaten deterministisch und entfernen Sie browserabhängige Bedingungen aus dem wesentlichen Markup. Bestätigung: Die Hydration wird ohne Mismatch-Warnungen abgeschlossen und ändert keine indexierbaren Inhalte.
Vue-Roh- und -gerenderten Output vergleichen
curl -fsSL https://example.com/page/ > raw.html
grep -Eio '<title>[^<]+|<h1[^>]*>[^<]+|<link[^>]+rel="canonical"[^>]*' raw.htmlFühren Sie dies nach der Hydration in der DevTools-Konsole aus:
({title: document.title, h1: document.querySelector('h1')?.textContent.trim(), canonical: document.querySelector('link[rel="canonical"]')?.href, links: [...document.querySelectorAll('a[href]')].length});Wenn die wichtigen Werte nur im Konsolenergebnis vorhanden sind, ist SSR/Prerendering unvollständig.
Hash-basierte Inhaltslinks finden
[...document.querySelectorAll('a[href^="#"]')].map(a => ({text: a.textContent.trim(), href: a.getAttribute('href')}));Überprüfen Sie die Liste manuell: In-Page-Navigation ist in Ordnung; die Verwendung von Fragmenten als separate Inhaltsrouten ist das Problem.
Tools für Vue-SEO
- URL Inspection (Google Search Console) – die Quelle der Wahrheit. Führen Sie einen Live-Test durch und prüfen Sie das gerenderte HTML, den Screenshot, die Seitenressourcen (war JS/CSS blockiert?) und die Konsolenmeldungen. So bestätigen Sie, dass Ihre Vue-Inhalte, Meta und JSON-LD tatsächlich gerendert wurden.
- Rich Results Test – eine schnelle Prüfung von gerendertem HTML und strukturierten Daten für eine einzelne URL ohne Verifizierung der Website.
- Chrome DevTools – vergleichen Sie View Source (rohes HTML, was ein nicht rendernder Bot sieht) mit dem Elements-Panel (das hydrierte DOM). Die Konsole zeigt Hydration-Mismatch-Warnungen.
- Vue Devtools – inspizieren Sie den Komponentenstatus und den Router-Modus, während Sie debuggen, was clientseitig vs. serverseitig gerendert ist.
vite-ssg– Build-Zeit-Prerendering für inhaltsstabile Vue-3-SPAs (ersetzen Sievite build→vite-ssg build).- JavaScript-rendering-Crawler – Ahrefs Site Audit und Screaming Frog (JS-Rendering-Modus) führen das JS aus, sodass Sie rohes vs. gerendertes HTML über die gesamte Vue-Site vergleichen können.
- Lighthouse / PageSpeed Insights – erkennen Sie den Einfluss des CSR-Bundles auf LCP und die Core-Web-Vitals-Hebel (Code-Splitting, Lazy Routes, Bildpriorität).
Testen Sie sich selbst: Vue-SEO
Fünf kurze Fragen zur Crawlbarkeit und Indexierbarkeit von Vue-Apps. Wählen Sie für jede eine Antwort und prüfen Sie dann.
Ressourcen, die Ihre Zeit wert sind
Meine Texte
- JavaScript SEO: A Definitive Guide – mein vollständiger Leitfaden zu Rendering, DOM-Parität und Framework-Entscheidungen; enthält die Vue-Router-History-vs-Hash-Empfehlung und meinen JS-Kanon-Test.
- The Beginner’s Guide to Technical SEO – wo Rendering und JavaScript-SEO im größeren Zusammenhang stehen.
Meine Vorträge
- How Search Works (SlideShare) – meine Erläuterung von Crawling, Rendering, Indexierung und Ranking. (Mein üblicher Haftungsausschluss gilt: “This is my understanding of systems… not going to be 100% complete or accurate.” (Übersetzung) „Das ist mein Verständnis von Systemen … es wird nicht zu 100 % vollständig oder genau sein.“)
Aus der Branche
- Server-Side Rendering (SSR) | Vue.js – der offizielle Leitfaden: SSR-SEO-Vorteil, der Async-Vorbehalt und wann SSG stattdessen gewählt werden sollte.
- Different History modes | Vue Router – warum Hash-Modus SEO schadet und wie Sie den History-Modus konfigurieren.
- useSeoMeta() · Unhead – die aktuelle
@unhead/vue-Meta-API. - antfu-collective/vite-ssg | GitHub – Build-Zeit-Prerendering für Vue-3-SPAs.
- Site Config | VitePress – SEO für Vue-basierte Dokumentationsseiten.
- How Nuxt.js solves the SEO problems in Vue.js | LogRocket – das Argument für Nuxt als SSR/SSG-Weg.
- Google no longer recommends using dynamic rendering | Search Engine Land – Berichterstattung über die Abschaffung von Dynamic Rendering.
- Vue.js And SEO: How To Optimize Reactive Websites | Smashing Magazine – ein vielzitierter Beitrag von 2019; nützlich für die Async-Timing-Experimente, aber veraltet bei den Tools (vor Evergreen-Chromium).
Videos
- Technische SEO-Tipps für Vue.js von Martin Splitt (Google Search Central, 2019) — Googles eigene Vue-spezifische JavaScript-SEO-Folge: Titel, Beschreibungen und URLs auffindbar machen, wenn Sie mit Vue entwickeln. Ansehen
- Google Search Central (YouTube) — Martin Splitts breitere JavaScript-SEO- Serie behandelt Rendering, die Render-Warteschlange und die Fehlermodi, die auf jede Vue-App zutreffen. Kanal
Änderungsprotokoll
Aktualisiert am 18. Juli 2026.
Redaktionelle Zusammenfassung und aufgezeichnete Änderungsdetails.Änderungsdetails
-
Detaillierte Änderungsangaben sind derzeit auf Englisch verfügbar.
-
Detaillierte Änderungsangaben sind derzeit auf Englisch verfügbar.
-
Detaillierte Änderungsangaben sind derzeit auf Englisch verfügbar.
-
Detaillierte Änderungsangaben sind derzeit auf Englisch verfügbar.
-
Detaillierte Änderungsangaben sind derzeit auf Englisch verfügbar.
-
Detaillierte Änderungsangaben sind derzeit auf Englisch verfügbar.
Vollständiger Vergleich nicht verfügbar — für diese Version wurde kein früherer Schnappschuss archiviert.