JavaScript SEO rendering: the complete guide for 2026
JavaScript frameworks like React, Vue, and Angular power most modern websites, but they create a fundamental challenge for search engines. This guide explains how Google, Bing, and AI crawlers handle JavaScript rendering, what breaks, and how to fix it.
Search engines process JavaScript in a two-phase crawl: they fetch the raw HTML first, then queue a separate rendering step to execute JavaScript. Google renders most JS but with delays of hours to days. Other bots - including ChatGPT, Claude, and social media scrapers - do not render JavaScript at all. Dynamic rendering or prerendering solves the problem without changing your frontend code.
How Google renders JavaScript
Google uses a two-phase indexing system. The first wave crawls the raw HTML. The second wave renders JavaScript in a headless Chromium instance, but this happens on a delayed schedule - sometimes days after the initial crawl.
When Googlebot visits a JavaScript-heavy page, it does not execute your code immediately. The initial crawl captures the raw HTML response - which for a typical React SPA is a near-empty shell with a <div id="root"></div> and script tags.
The actual JavaScript rendering happens in Google's Web Rendering Service (WRS), which runs a headless Chromium browser. This second phase can be delayed by hours or days depending on the page's crawl priority and Google's rendering budget.
Google has confirmed that WRS runs a recent version of Chromium and supports modern JavaScript features including ES modules, async/await, and Web Components. However, rendering capacity is finite - Google must render billions of pages and prioritises based on page importance.
What other crawlers see
Most non-Google crawlers do not render JavaScript at all. AI bots like GPTBot and ClaudeBot, social media scrapers from Facebook and LinkedIn, and even Bing's crawler have limited or no JavaScript execution capability.
While Google invests heavily in JavaScript rendering, other crawlers take a simpler approach. They fetch the raw HTML and parse whatever content is in the response. If your content is generated client-side, these bots see nothing.
This matters for several reasons:
- AI citation - ChatGPT, Claude, and Perplexity use their own crawlers (GPTBot, ClaudeBot, PerplexityBot) to index content. If they cannot see your content, your site will not appear in AI-generated answers.
- Social sharing - When someone shares your URL on LinkedIn, Twitter/X, or Facebook, the platform's scraper fetches the page to generate a preview card. No rendered content means a blank or broken preview.
- Bing - Microsoft's crawler has limited JavaScript rendering capability. Pages that rely on client-side rendering may be poorly indexed or missing from Bing results entirely.
Rendering strategies compared
There are four main approaches to making JavaScript content accessible to search engines: client-side rendering (CSR), server-side rendering (SSR), static site generation (SSG), and dynamic rendering. Each has different trade-offs for performance, complexity, and SEO effectiveness.
Choosing the right rendering strategy depends on your content type, update frequency, and technical constraints.
Client-Side Rendering (CSR) is the default for React, Vue, and Angular SPAs. Content is rendered entirely in the browser. SEO-hostile without additional measures - bots see an empty shell.
Server-Side Rendering (SSR) generates HTML on each request. Frameworks like Next.js and Nuxt make this straightforward. Good for SEO but adds server complexity and can increase Time to First Byte (TTFB).
Static Site Generation (SSG) pre-builds HTML at deploy time. Excellent for content that does not change frequently. Fastest possible performance but impractical for highly dynamic content.
Dynamic Rendering / Prerendering serves pre-rendered HTML to bots while humans get the normal SPA experience. No changes to your frontend code required. Services like PageGlass implement this at the DNS level - a single CNAME change and bot traffic is automatically served rendered HTML from a cache.
How to diagnose JavaScript rendering issues
Use Google Search Console's URL Inspection tool to see how Google renders your page, and compare the raw HTML source against the rendered output to identify content that depends on JavaScript execution.
Start with the simplest test: view your page source (Ctrl+U in Chrome) and compare it to the rendered page. If the source shows an empty <div id="root"> but the page is full of content, you have a JavaScript rendering dependency.
For a more thorough analysis:
- Use PageGlass's What Bots See tool to see the raw HTML that crawlers receive
- Use the Crawler Simulator to test specific bot user agents
- Check Google Search Console's URL Inspection for rendering errors
- Run a technical SEO audit to identify site-wide rendering issues
Frequently asked questions
Does Google render JavaScript?▾
Yes, Google renders JavaScript using a headless Chromium browser in its Web Rendering Service. However, rendering is delayed - sometimes by hours or days - and is not guaranteed for every page. Pages with lower crawl priority may wait longer or be skipped entirely.
Do AI crawlers render JavaScript?▾
No. GPTBot (ChatGPT), ClaudeBot (Anthropic), and PerplexityBot do not execute JavaScript. They read the raw HTML response. If your content is rendered client-side, these bots cannot see it.
What is the difference between SSR and dynamic rendering?▾
SSR (Server-Side Rendering) generates HTML on every request for all visitors - both humans and bots. Dynamic rendering serves pre-rendered HTML only to bots while humans get the normal SPA experience. SSR requires framework changes (e.g. migrating to Next.js). Dynamic rendering works with any existing SPA with no code changes.
Related articles
Fix JavaScript rendering in 5 minutes - no rewrite required
PageGlass renders your existing site for bots at the DNS layer. Search engines, ChatGPT, Claude, Perplexity, and every social platform see fully rendered HTML; humans get the unchanged SPA. 7-day free trial, no card required.