Join our community of websites already using SEOJuice to automate the boring SEO work.
See what our customers say and learn about sustainable SEO that drives long-term growth.
Explore the blog →TL;DR: Single-page-applicaties kunnen ranken, maar alleen als URL’s, statuscodes, metadata en primaire content al in de eerste HTML-response aanwezig zijn. Google kan JavaScript pas later renderen; de meeste AI-crawlers renderen het helemaal niet. Kies per route een rendermodel, verstuur eerst het document en pas daarna de app-state, en laat JavaScript daarna hydrateren. Hieronder: een field-guide voor 2026 voor teams die met Next.js, Nuxt, SvelteKit en Astro werken.
De openingsvraag voor SPA-SEO is niet langer “kan Googlebot JavaScript renderen”. Ja, dat kan. Martin Splitt roept dat al jaren. Toch debuggen mensen nog steeds single-page-apps door naar view-source: te staren alsof dát de pagina is die Google indexeert.
“Veel mensen kijken nog steeds naar view source. Dat is niet wat wij gebruiken voor indexatie. Wij gebruiken de gerenderde HTML.”
Martin Splitt, Developer Advocate bij Google
Dat rekent af met één slechte gewoonte. Als je alleen de initiële bron van een React-, Vue-, Angular-, SvelteKit-, Nuxt-, Remix- of Next.js-app bekijkt, mis je wat Google uiteindelijk ziet. De gerenderde DOM telt.
Maar de vraag voor 2026 is niet of Google kan renderen. Het is of het document snel genoeg arriveert om nuttig te zijn voor Googlebot, social parsers en de AI-crawlers die steeds vaker het citaatnetwerk domineren.
Jarenlang zag ik dit als een Google-probleem (ik had het jarenlang mis). Toen kwamen AI-crawlers met een andere houding.
“De resultaten laten consequent zien dat geen van de grote AI-crawlers momenteel JavaScript rendert.”
Vercel Engineering
GPTBot, ClaudeBot, PerplexityBot, de Gemini-trainingfetch — ze halen allemaal ruwe HTML op. Als je belangrijkste content pas na hydratatie verschijnt, zien die crawlers een lege app-shell waar jouw prijstabel, productcopy, FAQ of vergelijkingscontent hoort te staan. Draai onze AI Crawler Inspector op een paar SPA-pagina’s en je ziet wat zij zien.
De meeste teams slaan deze stap over en vragen of de hele SPA SSR nodig heeft. Die vraagstelling verspilt engineeringtijd.
Een echte SPA mixt twee dingen: crawlbare pagina’s en private app-states. Pricing-pagina’s, blogposts, documentatie, templates, integraties, vergelijking-pagina’s en product-landingspagina’s zijn pagina’s. Dashboards, onboardingflows, modals, filters, accountschermen en opgeslagen rapporten zijn app-states.
Begin met classificeren. Vraag engineers niet om “SEO voor de app te fixen”. Vraag ze aan te geven welke routes zoekverkeer verdienen, en kies daarna per route rendering, indexatie, canonicals en statuscodes.
| Routetype | Moet ranken? | Renderkeuze | Indexregel |
|---|---|---|---|
| Blogpost | Ja | SSG of SSR | Index, self-canonical |
| Product-landingspagina | Ja | SSG of SSR | Index, self-canonical |
| Interne zoekresultaten | Meestal niet | CSR of SSR | Vaak noindex |
| Dashboard-route | Nee | CSR is prima | Achter auth of noindex |
| Gefacetteerde filter-URL | Soms | SSR alleen als gecureerd | Canonical of noindex |
Een SPA met 40 publieke URL’s en 4.000 dashboard-states heeft geen 4.040 SEO-pagina’s. Ze heeft 40 pagina’s en een productinterface. Publieke routes hebben stabiele URL’s, self-canonicals, server-delivered metadata, crawlbare links, bruikbare first-byte HTML en correcte statuscodes nodig. Dashboard-routes hebben snelle interactie, auth en state-management nodig. Beide in één rendermodel persen maakt meestal allebei slechter.
Renderstrategie is een architectuurkeuze, geen plug-in-instelling. Kies je het verkeerde model, dan wordt elk later ticket een workaround.
Client-side rendering is perfect voor geauthenticeerde softwareschermen. Moet een gebruiker inloggen, dan hoeft een crawler de route toch niet te indexeren. CSR wordt riskant wanneer dezelfde app-shell pricing-pagina’s, docs, artikelen en productpagina’s bedient waar content pas verschijnt nadat JavaScript draait en API’s reageren.
Static site generation bouwt pagina’s vooraf om naar HTML. Voor blogs, docs, changelogs, glossary-pagina’s, templates en de meeste marketingcontent is SSG nauwelijks te verslaan: snel, cachebaar, goedkoop, crawler-vriendelijk. Astro 5 gaat hierin het verst met het islands-model en zero-JS-by-default.
Server-side rendering past als publieke content per request varieert op basis van locatie, voorraad, permissies of versheid. Lee Robinson vatte het Next.js-model simpel samen:
“Next.js prerendert de pagina op de server naar HTML bij elke request.”
Lee Robinson, VP Developer Experience bij Vercel
SSR levert crawlers HTML zonder te wachten op de client-bundle en laat de pagina toch verse data tonen.
Incremental static regeneration ververst statische pagina’s na publicatie. Voor programmatische SEO, docs en grote template-bibliotheken voorkomt ISR rebuild-pijn zonder terug te vallen op volledige CSR. Next.js 15 maakte Partial Prerendering (PPR) stabiel: een statische shell met gestreamde dynamische “gaten” binnen dezelfde route. Dat mengt twee houdingen binnen één URL, dichter bij hoe echte productpagina’s zich gedragen.
Dynamic rendering serveert één versie aan crawlers en een andere aan gebruikers. Het kan een legacy SPA redden als een migratie nog niet klaar is, maar ik zou er geen nieuwe zoekstrategie omheen bouwen.
“Ik zou dit zien als een tijdelijke workaround – waar ‘tijdelijk’ een paar jaar kan betekenen – maar wel tijdgebonden.”
John Mueller, Search Advocate bij Google
Gebruik dynamic rendering als brug. Vervang de brug later door server-rendered of static-first publieke routes.
Het juiste render-model is ook een framework-gesprek. Defaults zijn het afgelopen jaar verschoven en sommige van die verschuivingen veranderen SPA-SEO-beslissingen.
app/. Gescheiden TypeScript-projecten voor app, server, shared en builder reduceren type-bleed die vroeger server-only secrets in client-bundles lekte. Nuxt 4.4 (maart 2026) voegde vue-router v5 en typed layout props toe; kleine wins om route-specifieke metadata schoon te shippen.Het framework is minder belangrijk dan de per-routediscipline. Elk van deze vier kan een crawlbare SPA shippen. Alle vier kunnen een onzichtbare shippen als je publieke content achter hydratatie verstopt.
De harde SPA-SEO-fouten zijn meestal saai. Geen mysterieuze ranking-penalties, maar delivery-bugs.
De eerste val is de universele shell. Elke URL geeft dezelfde 200-response, dezelfde lege root, dezelfde bundle. De router beslist later of /pricing, /docs/api of /totally-fake-url bestaat. Dat laat crawlers te hard werken en creëert de tweede val: soft 404’s.
“In plaats van met 404 te antwoorden, geeft hij altijd 200 … steeds een pagina gebaseerd op JavaScript-executie.”
Martin Splitt, Developer Advocate bij Google
Ongeldige routes moeten echte 404- of 410-statuscodes teruggeven. Een leuke client-side “pagina niet gevonden”-component met 200 verspilt nog steeds crawlbudget en verwart indexatiesignalen.
De derde val is navigatie die crawlers niet kunnen volgen. Buttons, click-handlers en router-events zijn prima voor interactie, maar interne ontdekking heeft anchors met echte href-waarden nodig. Als je belangrijkste pagina’s alleen bereikbaar zijn na een JavaScript-handler, is je crawlability zwakker dan het lijkt.
Metadata is een andere veelvoorkomende fout. Veel SPA’s updaten titels, descriptions, canonicals, robots-tags, Open Graph en schema pas na route-wisseling. Dat werkt visueel in een browsertab, maar faalt nog steeds voor crawlers, social parsers en AI-bots. Route-specifieke metadata hoort in de teruggegeven HTML.
Canonicals verdienen een eigen waarschuwing. Ik heb gehydrateerde apps een juiste canonical zien overschrijven met een staging-domein, een root-URL of de vorige route. De bug blijft stil tot duplicate URL’s slecht clusteren of de verkeerde pagina rankt.
Infinite scroll verbergt content achter client-state. Als pagina twee, drie en ouder geen crawlbare URL’s hebben, ontdekken zoekmachines ze mogelijk nooit. Gebruik gepagineerde fallback-URL’s voor belangrijke archieven en categorie-pagina’s.
API-geladen hoofdcontent is fragiel. Als de H1, bodycopy, productdetails, reviews of interne links API-calls na hydratatie vereisen, heb je meer fail-points. Bottraffic raakt rate-limits. API’s blokkeren onbekende user-agents. Time-outs laten de gerenderde DOM dun.
Dit is de 2026-wending. Google’s AI Overviews geven antwoorden boven de organische lijst en citeren de bronnen die voor die samenvatting zijn gebruikt. Die citaties zijn de nieuwe top-of-funnel en belonen een specifieke HTML-vorm.
Het citaatsysteem pakt heldere, statische signalen: zichtbare tekst, headings, lijsten, tabellen, semantische HTML die in de eerste response beschikbaar is. Het wacht niet geduldig op hydratatie. Staat je meest quote-bare alinea pas na een useEffect-call, dan ziet een AI Overview die niet.
Drie dingen tellen voor SPA-pagina’s die geciteerd willen worden:
Hetzelfde geldt voor Perplexity-citaten, ChatGPT-browse-antwoorden en Claude’s web-reads. Hun crawlers halen ruwe HTML op; staat het antwoord daar niet, dan wordt de pagina niet geciteerd. Optimizing for AI Overview citations gaat dieper, en onze AIO-impactanalyse verklaart waarom het impression-verlies erger voelt dan de klikafdracht.
De regel waar ik steeds op terugkom: als de route zoekverkeer verdient, moet de eerste response eruitzien als een pagina.
Dat betekent dat elke publieke URL bruikbare HTML teruggeeft met de kernsinalen al aanwezig:
<title>.
JavaScript kan daarna componenten hydrateren, elementen personaliseren, events tracken en de ervaring verrijken. Het mag niet nodig zijn om de crawler te laten begrijpen waar de pagina over gaat.
Sitearchitectuur telt ook. Een publieke route zonder crawlbare links ernaartoe blijft zwak — zelfs als hij server-gerenderd is. Een perfect gerenderd document dat vijf kliks diep ligt achter client-only navigatie presteert niet zoals eentje binnen een helder intern linksysteem.
Test je alleen de browserervaring, dan test je het happy path. SPA-SEO vraagt lelijkere tests.
curl -I https://example.com/missing-route.De ongemakkelijke test is de H1-test. Als Googlebot vijf stappen en twee API-calls nodig heeft om de H1 te vinden, is de pagina fragiel, ook al wordt hij uiteindelijk geïndexeerd. Pas dezelfde test toe op GPTBot, ClaudeBot en PerplexityBot: zien zij de H1 niet in ruwe HTML, dan verschijnt de route niet als AI-citaat.
Gebruik deze op routeniveau. Een site-brede “pass” verbergt te veel SPA-fouten.
404 of 410, niet 200.href-attributen.Search, AI-antwoorden, link-previews en discovery-systemen hangen allemaal af van toegang. Rankings komen pas daarna.
Als ik nu een moderne SPA met zoekverkeer voor ogen startte, zou ik niet het hele product server-renderen. Ik zou het splitsen.
| Site-onderdeel | Aanbevolen aanpak |
|---|---|
| Marketingsite | Static generation |
| Blog en docs | Static generation of ISR |
| Productpagina’s | SSR, ISR of Next.js PPR |
| Programmatische SEO-pagina’s | Static generation met sterke pruning |
| Dashboard | CSR achter auth |
| Zoek- en filterpagina’s | Noindex tenzij handmatig gecureerd |
| Ongeldige routes | Echte 404 of 410 |
| Gedeelde layout | Server-gerenderde metadata en navigatie |
Marketingpagina’s en artikelen moeten HTML-first zijn. Productoppervlakken die versheid nodig hebben gebruiken SSR, ISR of PPR. Het dashboard blijft app-achtig omdat ranken onzinnig zou zijn. Programmatische SEO-pagina’s vragen beheersing: static generation maakt duizenden pagina’s makkelijk, inclusief duizenden die niemand moet indexeren. Genereer alleen pagina’s met echte zoekvraag, bruikbare content en interne links. Snoei de rest voordat Google de beslissing voor je neemt.
De winnende SPA is niet degene die bewijst dat crawlers JavaScript kunnen draaien. De winnende SPA is degene die crawlers geen onnodig werk laat doen.
Ja. Een SPA kan ranken als indexeerbare routes crawlbare content, correcte metadata, interne links en geldige statuscodes in de eerste HTML-response teruggeven. Google kan JavaScript renderen, maar alles daarop laten leunen maakt de site fragiel en onzichtbaar voor AI-crawlers die helemaal niet renderen.
Niet voor elke route. SSR past bij publieke pagina’s met veranderende content. SSG of ISR is vaak beter voor stabiele content. Next.js 15’s Partial Prerendering mengt beide binnen één route. CSR is prima voor private dashboards en app-states die niet geïndexeerd hoeven worden.
Hash-routes zijn een zwakke keuze voor indexeerbare pagina’s. Ze kunnen werken voor on-page fragmenten, maar publieke content hoort schone URL’s, route-specifieke metadata en statuscodes op serverniveau te hebben.
Meestal niet. Interne zoekpagina’s en gefacetteerde filters creëren vaak dunne of dubbele URL’s. Gecureerde filterpagina’s kunnen worden geïndexeerd als ze unieke vraag, stabiele content en een duidelijke canonical-strategie hebben.
Vraag een nep-URL op en check de statuscode. Als /this-page-should-not-exist 200 teruggeeft met een client-side not-found-bericht, heb je een soft-404-risico dat crawlbudget verspilt.
Alleen als de geciteerde content in ruwe HTML staat. De meeste AI-crawlers voeren geen JavaScript uit. Server-render of prerender de alinea’s, lijsten en tabellen die je geciteerd wilt hebben.
SEOJuice helpt teams om crawlbare interne links en HTML-first signalen te versterken op publieke pagina’s die zoekverkeer verdienen. Heeft jouw SPA verweesde routes, begraven templates of pagina’s die Google nooit lijkt te bereiken, dan kan geautomatiseerde interne linking de documentlaag toegankelijker maken voor crawlers en AI-bots.
<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [ { "@type": "Question", "name": "Kan een single-page-applicatie in 2026 ranken in Google?", "acceptedAnswer": { "@type": "Answer", "text": "Ja. Een SPA kan ranken als indexeerbare routes crawlbare content, correcte metadata, interne links en geldige statuscodes in de eerste HTML-response leveren. Google kan JavaScript renderen, maar alles daarop laten leunen maakt de site fragiel en onzichtbaar voor AI-crawlers die helemaal niet renderen." } }, { "@type": "Question", "name": "Is server-side rendering verplicht voor SPA-SEO?", "acceptedAnswer": { "@type": "Answer", "text": "Niet voor elke route. SSR is geschikt voor publieke pagina's met veranderende content. SSG of ISR is vaak beter voor stabiele content. Next.js 15's Partial Prerendering mengt beide binnen één route. CSR is prima voor private dashboards en app-states die niet geïndexeerd hoeven te worden." } }, { "@type": "Question", "name": "Zijn hash-routes slecht voor SEO?", "acceptedAnswer": { "@type": "Answer", "text": "Hash-routes zijn geen goede keuze voor indexeerbare pagina's. Ze kunnen werken voor on-page fragmenten, maar publieke content hoort schone URL's, route-specifieke metadata en server-side statuscodes te hebben." } }, { "@type": "Question", "name": "Moeten SPA zoekresultaatpagina's worden geïndexeerd?", "acceptedAnswer": { "@type": "Answer", "text": "Meestal niet. Interne zoekpagina's en gefacetteerde filters creëren vaak dunne of dubbele URL's. Gecureerde filterpagina's kunnen worden geïndexeerd als ze unieke vraag, stabiele content en een duidelijke canonical-strategie hebben." } }, { "@type": "Question", "name": "Hoe weet ik of mijn SPA een soft 404-probleem heeft?", "acceptedAnswer": { "@type": "Answer", "text": "Vraag een niet-bestaande URL op en controleer de statuscode. Als /this-page-should-not-exist een 200 retourneert met een client-side not-found-bericht, heb je een soft 404-risico dat crawlbudget verspilt." } }, { "@type": "Question", "name": "Zal AI Overviews een JavaScript-gerenderde SPA citeren?", "acceptedAnswer": { "@type": "Answer", "text": "Alleen als de geciteerde content in ruwe HTML staat. De meeste AI-crawlers voeren geen JavaScript uit. Server-render of prerender dus de alinea's, lijsten en tabellen die je geciteerd wilt zien." } } ] } </script>no credit card required
No related articles found.