Prerendering: Wie aus einer React-SPA eine Google-freundliche Seite wird
TL;DR: „Prerendering rendert deine SPA zur Build-Zeit zu statischem HTML – mit JSON-LD, Meta-Tags und Edge-Deploy. So bleibt die DX einer SPA, aber Google sieht eine echte Seite."
— Till FreitagDas Problem: SPAs sind für Crawler ein leeres Blatt
Eine React-SPA liefert beim ersten Request ein nahezu leeres <div id="root"></div>. Erst nachdem JavaScript geladen, geparst und ausgeführt wurde, entsteht der eigentliche Inhalt. Für Nutzer kein Problem – für Crawler, Social-Sharing-Previews und LLM-Bots ist das Spiel oft schon vorbei.
Wir haben das in Vibe Coding SEO ausführlich beschrieben. Dieser Artikel geht eine Ebene tiefer: Wie prerendert man eine moderne React/Vite-SPA, ohne auf Next.js oder einen SSR-Server umzusteigen?
Die Lösung: Build-Time-Prerendering mit Playwright
Statt jeden Request live auf einem Node-Server zu rendern, machen wir es einmal – zur Build-Zeit:
- Vite baut die SPA wie gewohnt zu statischen JS/CSS-Bundles
- Ein Playwright-Headless-Browser startet einen lokalen Server und besucht jede Route
- Das vollständig hydrierte HTML wird pro Route als
index.htmlabgelegt - JSON-LD, Meta-Tags und Sitemap werden in den HTML-Stream injiziert
- Der gesamte statische Output wird auf das Vercel Edge Network deployed
Das Ergebnis: Crawler bekommen vollständiges HTML in einem einzigen Request. Nutzer bekommen die SPA-Erfahrung, sobald JS hydratisiert.
Die Pipeline im Überblick
React SPA → Playwright → Static HTML → Schema.org → Edge Deploy → Crawler
(Vite) (Headless) (per Route) (JSON-LD) (Vercel) & UserVier Bausteine, deterministisch verkettet. Kein Plugin-Roulette, kein PHP, kein „läuft beim Kunden, nicht bei mir".
Warum nicht einfach Next.js?
Eine berechtigte Frage. Next.js löst das gleiche Problem – aber mit anderem Trade-off:
| Aspekt | Next.js SSR | Playwright-SSG |
|---|---|---|
| Hosting | Node-Server / Edge-Functions | Reine statische Files |
| Latenz | Cold Starts möglich | Reines CDN, < 50 ms |
| Build-Komplexität | Framework-Konventionen | Vite + Playwright-Skript |
| Vendor-Bindung | Hoch (Vercel-optimiert) | Keine |
| Eignung für Vibe Coding | Schwierig (Konventionen) | Ideal (Standard-React) |
Für AI-native Web-Apps mit Lovable ist die Standard-React-SPA der schnellere Pfad. Prerendering setzt sauber obendrauf, ohne dass der Agent Framework-Konventionen lernen muss.
Die kritischen Details
1. Routen entdecken
Wir lesen alle Routen aus dem React-Router-Tree und ergänzen dynamische Pfade aus Markdown-Frontmatter (Blog-Posts, Events). Ein Skript erzeugt die vollständige Route-Liste – Single Source of Truth.
2. Meta-Tags zur Build-Zeit injizieren
react-helmet-async setzt Meta-Tags clientseitig – das reicht Crawlern oft nicht. Unser Vite-Plugin inject-seo liest die fertig gerenderte <head> aus dem Playwright-Output und schreibt sie als statisches Markup in die index.html. So sehen Bots <title>, <meta>, OpenGraph und Canonical vor JS-Ausführung.
3. JSON-LD pro Seitentyp
Jede Seite bekommt das passende Schema: Organization für die Startseite, Article für Blog-Posts, Event für Event-Seiten, Product für Tool-Pages. Mehr dazu in unserer SEO-Master-Strategy.
4. Sitemap & robots.txt
Aus der Route-Liste generieren wir parallel sitemap.xml mit lastmod aus Frontmatter. Crawler kennen jede Seite, jede Änderung wird angezeigt.
5. Edge-Deploy
Vercel verteilt das statische Output-Verzeichnis auf 100+ Regionen. TTFB unter 50 ms weltweit – ohne Caching-Plugin, ohne CDN-Konfiguration, ohne Sysadmin.
Was du vermeiden musst
useEffectfür SEO-relevante Daten: läuft erst nach Hydration, Crawler sieht es nicht. Lade Daten zur Build-Zeit oder direkt im JSX.- Client-only Routing-Tricks: Hash-Routes (
#/about) werden nicht prerendert. Immer echtes History-API-Routing nutzen. - Race Conditions in Helmet: Wenn mehrere
<Helmet>-Instanzen kämpfen, schreibt Playwright den letzten Sieger. Ein zentrales<SEOHead>-Component vermeidet das.
Was du gewinnst
- Lighthouse 95+ out of the box – ohne Performance-Plugin
- Crawler-Vollzugriff – Google, Bing, ChatGPT, Perplexity sehen alles
- Social Previews funktionieren – OG-Image, Title, Description vor JS
- Keine Server-Wartung – nur statische Files auf Edge
- Volle Vibe-Coding-Geschwindigkeit – der Agent baut Standard-React, die Pipeline kümmert sich um den Rest
Fazit: Prerendering ist die fehlende Brücke
WordPress liefert HTML, weil PHP serverseitig rendert – mit allen Wartungs- und Plugin-Problemen. Eine SPA liefert kein HTML, weil sie clientseitig rendert. Prerendering kombiniert das Beste aus beiden Welten: HTML-First für Crawler, SPA-DX für das Team.
Genau diese Pipeline läuft hinter dieser Seite. Genau diese Pipeline zeigen wir live bei TokenMade in Hamburg – ohne Slides, in 5 Minuten.







