SEO, GEO en AEO Onderzoeksartikel

Voeren AI-crawlers JavaScript uit? Controleer de HTML die ze ontvangen

Je browser bouwt de pagina pas op nadat de scripts hebben gedraaid. Een crawler leest misschien alleen de HTML die je server als eerste stuurt. Controleer die respons voordat je aanneemt dat een bot je antwoord kan lezen.

Twee vergelijkbare clusters van overlappende vierkanten en rechthoeken op crèmekleurig papier, gescheiden door een zachte baan perzikkleurig licht: links alleen getekend in dunne blauwe lijnen met kleine kruisjes, rechts opgebouwd uit diepblauw karton, crèmekleurige vlakken en een doorschijnende amberkleurige strook
Links de contouren die een gewoon HTTP-verzoek binnenkrijgt als de tekst op scripts wacht. Rechts de pagina die een browser opbouwt zodra die scripts draaien.

Direct antwoord

Sommige wel. Google documenteert dat Googlebot pagina's met Chromium rendert en de gerenderde HTML indexeert. De hier aangehaalde crawlerpagina's van OpenAI en Perplexity vermelden niet of hun bots JavaScript uitvoeren. In een onderzoek uit december 2024 op specifieke sites zagen Vercel en MERJ dat OAI-SearchBot, ChatGPT-User, GPTBot en PerplexityBot pagina's ophaalden zonder JavaScript uit te voeren. Dat is een gedateerde waarneming van derden, geen beleid van de aanbieders. Zet het kernantwoord in de HTML die je server verstuurt en controleer dat met Paginabron bekijken of met curl.

Reken er niet op dat een AI-crawler de scripts op je pagina uitvoert: het antwoord dat je geciteerd wilt zien, hoort in de HTML die je server verstuurt. Google documenteert dat Googlebot JavaScript uitvoert. De crawlerpagina’s van OpenAI en Perplexity vermelden niet of hun bots dat ook doen. In een onderzoek uit december 2024 op specifieke sites zagen Vercel en MERJ bepaalde bots van OpenAI en Perplexity pagina’s ophalen zonder JavaScript te renderen. Dat is een gedateerde waarneming van derden op die sites, geen beleid van de aanbieders, en het toont niet aan hoe die bots zich nu gedragen. Of ze renderen, hoef je niet eens te weten: een pagina die haar antwoord al in de eerste respons meestuurt, is hoe dan ook leesbaar.

Waar het om draait, is het verschil tussen de ruwe HTML die je server verstuurt en de afgewerkte pagina die je browser op het scherm zet. Een browser voert scripts uit, stuurt opgeslagen cookies mee en haalt extra tekst op als een bezoeker ergens op klikt. Een eenvoudige crawler leest misschien alleen de eerste respons en stopt daar. Beoordeel een pagina dus op wat je server teruggeeft, niet op hoe die er op je scherm uitziet.

Wat betekent JavaScript-rendering?

Paginatekst bereikt een bezoeker langs twee wegen. Bij server-side rendering schrijft de server het artikel en de antwoorden bij elk verzoek in de HTML-respons. Een statische site doet hetzelfde werk één keer, tijdens de build, zodat ook die HTML-bestanden met de tekst erin aankomen. In beide gevallen staan de woorden in de eerste respons.

Bij client-side rendering bevat de eerste respons vaak weinig meer dan navigatie, een lege container voor de inhoud en <script>-tags. De browser downloadt die scripts en voert ze uit; zij halen het artikel of de onderliggende data op en zetten de tekst in de live DOM. Die lege schil in de browser omzetten in een leesbare pagina: dat is client-side JavaScript-rendering. Een menselijke bezoeker ziet een complete pagina, ook als de eerste respons vrijwel geen lopende tekst bevatte.

Veel productiepagina’s combineren beide vormen. Het hoofdartikel kan in de eerste respons meekomen, terwijl een FAQ-antwoord, een specificatietabel of een prijs pas laadt nadat een script draait of een bezoeker op een tabblad klikt. De vraag gaat dus nooit over de pagina als geheel, maar over de exacte zin die je geciteerd wilt zien: staat die in de HTML die de server voor de URL teruggeeft, of verschijnt die pas na een script of een klik?

Welke crawlers voeren JavaScript uit?

Twee soorten bewijs beantwoorden twee verschillende vragen. Documentatie van aanbieders, voor dit artikel herlezen op 25 september 2026, vertelt wat een bedrijf over zijn crawler zegt. De meting van Vercel en MERJ, gepubliceerd in december 2024, vertelt wat bepaalde bots deden op de onderzochte sites. Dat een aanbieder in zijn documentatie over JavaScript zwijgt, betekent niet dat zijn crawler het nooit uitvoert.

BotDocumentatie van de aanbiederWaarneming van Vercel en MERJ (december 2024)
Googlebot (Google Search)Google documenteert rendering met een altijd actuele Chromium-renderer en indexering op basis van de gerenderde HTMLVercel merkte op dat Gemini de crawlinfrastructuur van Google gebruikt
OAI-SearchBot, ChatGPT-User, GPTBot (OpenAI)Het crawleroverzicht en de publishers-FAQ vermelden niet of ze JavaScript uitvoerenDeze bots haalden op de geteste sites pagina’s op zonder JavaScript te renderen
PerplexityBot (Perplexity)De crawlerpagina vermeldt niet of de bot JavaScript uitvoertDeze bot haalde op de geteste sites pagina’s op zonder JavaScript te renderen

De JavaScript-SEO-gids van Google verdeelt de verwerking in drie fasen: crawlen, renderen en indexeren. Een pagina kan volgens de gids in de wachtrij voor rendering blijven staan “for a few seconds, but it can take longer than that” (een paar seconden, maar het kan ook langer duren), en Google gebruikt de gerenderde HTML om de pagina te indexeren. Op de afzonderlijke pagina over AI-functies schrijft Google dat een pagina geïndexeerd moet zijn en met een snippet in Google Search getoond moet kunnen worden om als ondersteunende link in AI-overzichten of de AI-modus te dienen. Een pagina die aan die voorwaarden voldoet, komt in aanmerking; een link is daarmee niet gegarandeerd.

Dezelfde JavaScript-gids raadt nog altijd server-side rendering of pre-rendering aan en merkt op dat “not all bots can run JavaScript” (niet alle bots kunnen JavaScript uitvoeren). Het crawleroverzicht van OpenAI en de crawlerpagina van Perplexity noemen hun user-agents en verwijzen naar gepubliceerde IP-reeksen. Geen van beide zegt iets over het uitvoeren van JavaScript, en de publishers-FAQ van OpenAI evenmin.

Het onderzoek van Vercel, in december 2024 samen met MERJ gepubliceerd, analyseerde crawlerverkeer op nextjs.org, het netwerk van Vercel en twee vacaturesites. Op die sites zagen de onderzoekers OAI-SearchBot, ChatGPT-User, GPTBot en PerplexityBot pagina’s ophalen zonder JavaScript te renderen. Ook merkten ze op dat crawlers van ChatGPT en Claude JavaScript-bestanden wel downloadden, maar niet uitvoerden. Behandel die bevindingen als een gedateerde meting van derden op specifieke sites, niet als beleid van de aanbieders.

Beide soorten bewijs leiden tot dezelfde ontwerpregel: zet openbare, belangrijke antwoorden in de HTML die voor hun URL wordt teruggegeven, zodat een gewoon HTTP-verzoek ze binnenkrijgt zonder renderstap.

Controleer wat je server verstuurt

Kies een pagina die ertoe doet, en daarop de ene zin die een vraag van een koper of lezer beantwoordt. Vergelijk dan op drie manieren de eerste serverrespons met wat je browser uiteindelijk laat zien:

  1. Bekijk de paginabron. Klik in Chrome, Edge of Firefox met de rechtermuisknop op de pagina, kies Paginabron bekijken (Ctrl+U op Windows en Linux) en zoek naar de zin. De paginabron toont de ruwe HTML die voor dat browserverzoek is teruggestuurd. Wat je via Inspecteren ziet, is de live DOM, mogelijk al aangepast door scripts; dat vertelt je dus niet wat er in de eerste respons zat.
  2. Zet JavaScript uit. Open de pagina in een privévenster, zodat opgeslagen cookies de respons niet beïnvloeden. Open in Chrome DevTools het opdrachtmenu met Ctrl+Shift+P (Cmd+Shift+P op macOS), typ javascript, voer Disable JavaScript uit en herlaad de pagina. Zo benader je een bezoek zonder scripts; het netwerk of de user-agent van een crawler boots je er niet mee na.
  3. Haal de URL op met curl, een opdrachtregelprogramma dat de serverrespons opslaat zonder de scripts van de pagina uit te voeren:
curl -sSL --compressed -D headers.txt -o page.html 'https://example.com/jouw-pagina/'
grep -c -F 'de exacte zin die je geciteerd wilt zien' page.html

De eerste opdracht volgt doorverwijzingen (-L), vraagt om een gecomprimeerde respons en pakt die uit (--compressed), schrijft de headers van elke respons, doorverwijzingen inbegrepen, naar headers.txt en slaat de uiteindelijke body op in page.html. De tweede telt de regels in page.html waarin jouw exacte tekenreeks voorkomt. De curl-handleiding legt elke optie uit.

Een 0 is een aanwijzing, geen eindoordeel. Het betekent dat die exacte reeks op geen enkele regel van page.html in zijn geheel voorkomt; het bewijst niet dat de woorden ontbreken. Een HTML-entiteit zoals &amp;, een gekruld aanhalingsteken, een regeleinde of een inline-tag (<strong>, <a>) midden in de zin laat een zoekopdracht op de volledige zin mislukken. Zoek in page.html naar een korte, kenmerkende woordgroep van twee of drie woorden en lees de markup eromheen voordat je het antwoord als afwezig noteert. Open daarna headers.txt: een foutstatus, of een doorverwijzing naar een inlogscherm of de homepage, verandert wat de test heeft gemeten.

Hoe lees je de uitkomst?

Wat je vindtWat dat vaststeltWat je doet
De zin staat in een gewone alinea in page.htmlEen gewoon HTTP-verzoek voor deze URL krijgt het antwoord als paginatekst binnenNoteer de uitkomst en test de volgende pagina
De zin staat alleen in een <script>-blok of JSON-payloadDe woorden komen binnen, maar als scriptdata en niet als paginatekstZet het kernantwoord in gewone body-HTML; vertrouw niet op een scriptpayload
De zin verschijnt pas na een klik op een tabblad of ‘lees meer’, en het paneel Netwerk toont een nieuw verzoek dat de tekst ophaaltDe klik haalt het antwoord pas op als de pagina al geladen isZet het antwoord in de eerste HTML en laat het tabblad het alleen tonen of verbergen
De zin verschijnt kort na het laden in de browser, maar ontbreekt in page.htmlEen client-side script heeft de tekst na de eerste respons opgehaald of opgebouwdVerplaats de kerntekst naar server-side rendering of naar generatie tijdens de build
page.html bevat alleen een cookiemuur of toestemmingsschermDit verzoek kreeg de cookiemuur, niet het artikelHoort de pagina openbaar te zijn, stuur de artikeltekst dan mee in de eerste HTML en leg de toestemmingslaag eroverheen
page.html is een inlogscherm, een foutpagina of de homepageJe test heeft de bedoelde pagina nooit bereiktControleer de URL, de doorverwijsregels en de toegangsinstellingen voordat je rendering gaat debuggen

Een tabblad kan tekst verbergen of ophalen

Twee tabbladen of accordeons kunnen er in de browser hetzelfde uitzien en zich op netwerkniveau toch anders gedragen. Bij het eerste patroon staat alle paneeltekst al in de eerste HTML; een klik schakelt alleen de CSS-zichtbaarheid of een hidden-attribuut om. Bij het tweede blijft het paneel leeg tot een klik een netwerkverzoek verstuurt dat het antwoord ophaalt en in de DOM zet. Een crawler die de eerste HTML leest en nooit klikt, krijgt de tekst van het eerste tabblad wel binnen en die van het tweede niet.

Schrijf het ticket dus over het netwerkgedrag, niet over het onderdeel op het scherm: “Het antwoord op X ontbreekt in de eerste HTML voor deze URL; een klik op het FAQ-tabblad start verzoek Y, dat het antwoord laadt.” In het paneel Netwerk van DevTools zie je verzoek Y. Dat een pagina tabbladen of accordeons gebruikt, zegt niets zolang je niet hebt gezien wat de server verstuurde.

Een uitgewerkt voorbeeld (hypothetisch)

Stel dat een softwarebedrijf in Utrecht een prijspagina heeft met een FAQ die een veelgestelde kopersvraag beantwoordt: “Worden onze gegevens in de EU opgeslagen?” Het antwoord zit achter een tabblad. In een gewoon browservenster oogt de pagina compleet.

In deze hypothetische controle voert het team de curl- en grep-opdrachten uit op de URL van de prijspagina, en grep -c geeft 0. Het paneel Netwerk in DevTools laat zien waarom: een klik op het FAQ-tabblad stuurt een verzoek naar /api/faq?page=pricing, dat het antwoord als JSON teruggeeft. De eerste HTML in page.html bevat alleen de knop van het tabblad en een lege container.

Een developer past de pagina zo aan dat de server de FAQ-antwoorden in de HTML-respons rendert en het tabbladscript alleen tekst verbergt of toont die al in de DOM staat. Als het team curl opnieuw uitvoert, geeft grep -c een 1 en staat de zin in een gewone <p>-tag. Het team bevestigt dat door de pagina in een privévenster met JavaScript uitgeschakeld opnieuw te laden.

Wat de aanpassing bewijst: deze URL levert het antwoord nu in de eerste HTML, zonder dat er JavaScript hoeft te draaien. Wat ze niet bewijst: dat ChatGPT de pagina gaat citeren. Daarvoor is een aparte test in ChatGPT Search nodig, met een log, zoals de citatiegereedheid-audit beschrijft.

Hoe pas je de pagina aan?

  • Render kernantwoorden op de server of tijdens de build. Ook Vercel maakt na zijn onderzoek uit december 2024 hetzelfde onderscheid: render cruciale inhoud op de server en bewaar client-side rendering voor extra’s zoals weergavetellers, chatwidgets en livefeeds.
  • Laat tabbladen tekst tonen die al in de HTML staat. Houd FAQ- en specificatietekst in de eerste serverrespons en gebruik een script of een standaard <details>-element alleen om die tekst te tonen en te verbergen.
  • Zet de naam naast de claim. Plaats de bron, het bedrijf of de auteur in dezelfde HTML als het antwoord, zodat een crawler ze samen binnenkrijgt. Hoe je geciteerd wordt door ChatGPT behandelt die stap: een naam die de machine kan koppelen.
  • Behandel llms.txt niet als vervanging voor HTML die de server rendert. Een apart tekstbestand zet geen ontbrekend antwoord in de HTML die je server voor je pagina-URL’s teruggeeft, en Google schrijft dat zijn AI-functies geen speciale AI-tekstbestanden vereisen. Wat is llms.txt? legt uit waar het bestand wel voor dient.

Wat deze test je niet vertelt

Een curl-verzoek vanaf je laptop is geen verzoek vanaf de infrastructuur van OpenAI, Perplexity of Google. Netwerklocatie, requestheaders, CDN-caches en firewallregels kunnen allemaal veranderen wat je server aan een echte bot teruggeeft. Wordt een crawler aan de rand van je netwerk geblokkeerd of in robots.txt uitgesloten, dan laat server-side rendering hem er ook niet in. De drie bots van OpenAI in de tabel hebben bovendien elk een eigen taak: OAI-SearchBot voor zoeken in ChatGPT, GPTBot voor modeltraining en ChatGPT-User voor pagina’s die ChatGPT op verzoek van een gebruiker ophaalt. GPTBot versus OAI-SearchBot versus ChatGPT-User legt uit hoe hun toegangsrechten verschillen.

Leesbaar is niet geciteerd. Slaagt de controle, dan bevat de respons die jij ophaalde het antwoord als gewone HTML. Dat betekent niet dat de pagina geïndexeerd is, in aanmerking komt voor een snippet of als bron wordt geciteerd. Zakt de controle vandaag, dan bewijst dat niet dat een antwoordmachine je claim nooit heeft gezien, bijvoorbeeld via een vermelding op een andere site of een eerdere crawl. Houd de uitkomsten van je HTML-controles gescheiden van je citatiemetingen.

Probeer dit vandaag

  1. Kies drie openbare pagina’s die je geciteerd wilt zien en kopieer van elke pagina de zin met het kernantwoord.
  2. Bekijk van elke pagina de paginabron of voer de curl- en grep-opdrachten hierboven uit. Geeft de exacte zoekopdracht 0, zoek dan in page.html naar een korte, kenmerkende woordgroep uit die zin.
  3. Noteer per URL een van deze vier uitkomsten: aanwezig in de body-HTML, alleen aanwezig in script- of JSON-data, opgeknipt door inline-markup, of afwezig. Zet de HTTP-status en eventuele doorverwijzingen uit headers.txt ernaast.
  4. Open bij elk afwezig antwoord het paneel Netwerk in DevTools, zoek het klik- of scriptverzoek dat de tekst laadt, en geef de developer de pagina-URL, de ontbrekende zin en de URL van dat verzoek.

Sluit het ticket zodra een nieuwe curl-aanroep van de openbare URL het antwoord in de body-HTML oplevert. Of antwoordmachines de pagina daarna ook citeren, hoort in een aparte audit.

Citeer deze pagina:Voeren AI-crawlers JavaScript uit? Controleer de HTML die ze ontvangen.Len P. van der Hof. https://lenvanderhof.com/nl/blog/javascript-rendering-kost-je-citaties/ ·

Bronnen

  1. Understand the JavaScript SEO basics · Google Search Central
  2. AI features and your website · Google Search Central
  3. Overview of OpenAI crawlers · OpenAI
  4. Publishers and Developers FAQ · OpenAI Help Center
  5. Perplexity Crawlers · Perplexity
  6. The rise of the AI crawler · Vercel
  7. Disable JavaScript · Chrome for Developers
  8. curl command-line manual · curl project
  9. Citatiegereedheid-audit: geschikt is niet geciteerd
  10. Hoe je geciteerd wordt door ChatGPT

Verder lezen

Markdown voor LLMs