Skip to content

JavaScript sites (Next.js, Vue and others): making sure AI crawlers can read your content

Short answer

Googlebot renders JavaScript, but a 2024 study found the major AI crawlers did not. Put the main content, links and metadata in the server HTML using SSR, static generation or pre-rendering. Then verify with a no-JavaScript fetch and server logs.

This guide is for developers and technical leads whose sites are built with React, Next.js, Vue, Nuxt or similar frameworks. It explains why an AI crawler may receive an empty page, which rendering choices fix that, and how to check the result. Auditing a few templates takes an hour. Switching rendering mode on an existing app can take days to weeks.

  1. Assume AI crawlers read only the HTML your server returns.
  2. Find out what that HTML contains for each template.
  3. Render the main content on the server: SSR, static generation or pre-rendering.
  4. Put links, metadata and structured data in that HTML too.
  5. Keep what bots receive the same as what users see.
  6. Verify with no-JavaScript fetches and crawler logs, and re-check after each release.

1. Assume crawlers read only the server HTML

Section titled “1. Assume crawlers read only the server HTML”

Google renders JavaScript. Most AI crawlers, on the best available evidence, don’t.

The study is one observation, now almost two years old, and none of the AI companies document their rendering. The safe design doesn’t depend on who renders: put the content in the HTML. Background: JavaScript rendering and AI crawlers.

What Googlebot and most AI crawlers receive from a JavaScript site Browsers and Googlebot Request page Raw HTML Run JavaScript Full page Most AI crawlers (2024 test) Request page Raw HTML No JavaScript run Client-rendered: an empty <div id="root"> Server-rendered: the full text
Based on the Vercel and MERJ test of December 2024; AI companies do not document whether their crawlers render JavaScript.

Don’t audit the whole site. Pick one URL per template: home, article, product, category, docs page.

Terminal window
curl -s -A "OAI-SearchBot" https://example.com/page/ > raw.html
grep -c "a sentence from the middle of the main text" raw.html
grep -iE '<title>|rel="canonical"|name="description"|application/ld\+json' raw.html

For each template, record whether the raw HTML has:

ItemIn raw HTML?
Main text and headings
Internal links as <a href>
Title, description, canonical
Structured data
Content behind tabs, accordions, “load more”

Then compare with Google’s view in URL Inspection: URL Inspection tool. A gap between the two is what AI crawlers miss.

Modern frameworks already support server rendering. Often the fix is to stop opting out of it.

Choosing a mode:

ContentMode
Marketing pages, docs, blogStatic generation at build time
Catalogue or content that changes oftenSSR, or static with revalidation
Logged-in app screensClient rendering is fine. Crawlers don’t need them

In Next.js, watch for data fetched in useEffect and for "use client" placed high in the tree. In Vue or Nuxt, check that content-critical pages aren’t client-only routes.

So serving a pre-rendered snapshot only to bots is a stopgap for legacy apps. Plan to replace it.

Crawlers find pages through links and understand them through metadata. Both fail silently when injected late.

Server rendering serves the same HTML to everyone, so this comes for free. Bot-only snapshots and user-agent switches are where facts drift: a price, a stock state, a date. If you must keep a snapshot service, compare its output with the live page on a schedule.

  • Check key templates in URL Inspection and confirm they’re indexed.
  • Add the curl checks from step 2 to CI, so a release that moves content client-side fails the build.
  • Re-run the template audit after framework upgrades and redesigns.
  • Don’t trust a browser test. Your browser runs JavaScript. A crawler may not (step 1).
  • Don’t build new sites on dynamic rendering. Google calls it a workaround (step 3).
  • Don’t hide key content behind interactions that fetch it on click (step 2).
  • Don’t rely on llms.txt or Markdown copies instead of fixing rendering. They aren’t a documented substitute: Claim: llms.txt improves AI search visibility.
  • Don’t block crawlers from the JS and CSS that Googlebot needs to render. Google renders with them: robots.txt.
RecommendationEvidence
Googlebot renders JS, in a queueOfficial (Google)
Major AI crawlers don’t render JSObserved (Vercel and MERJ, 2024-12)
Server-render or pre-render main contentOfficial (Google, Vue, Next.js)
Avoid dynamic rendering for new buildsOfficial (Google)
Same facts for bots and usersOfficial (Microsoft, for Copilot shopping)
Verify with raw fetches and logsOfficial (Google)

Sources

  1. Understand JavaScript SEO basicsGoogle Search Central · official · ✓ 2026-10-25
  2. The rise of the AI crawler (17 Dec 2024)Vercel & MERJ · industry · ✓ 2026-10-25
  3. AI features and your websiteGoogle Search Central · official · ✓ 2026-10-24
  4. Server and Client ComponentsNext.js (Vercel) · official · ✓ 2026-10-28
  5. Server-Side Rendering (SSR)Vue.js · official · ✓ 2026-10-28
  6. Dynamic Rendering as a workaroundGoogle Search Central · official · ✓ 2026-10-28
  7. From discovery to influence: A guide to GEOMicrosoft Advertising · official · ✓ 2026-10-26
  8. Verify requests from Google crawlers and fetchersGoogle · official · ✓ 2026-10-25