Technical SEO / JavaScript 2026-04-25 12 min read

JavaScript SEO 2026 — Complete Guide (CSR vs SSR vs SSG)

JavaScript SEO is technical SEO subdiscipline focused on optimizing JS-powered sites (React, Vue, Angular, Svelte) so search engines AND AI crawlers can correctly crawl, render and index them. In 2026 Googlebot renders JavaScript (Web Rendering Service Chromium 131+) but with 9 sec median delay. AI crawlers (GPTBot, ClaudeBot, PerplexityBot) do NOT render JS — see only HTML response. Consequence: SSR/SSG mandatory for SEO + AI SEO 2026. CSR (Create React App) = invisible for AI = zero citation in ChatGPT/Claude.

GMWEB stack: Next.js 16 + React Server Components (RSC) + force-static + Cloudflare Workers (OpenNext) = 100% SSR/SSG, AI-ready, 100/100 Lighthouse. See Headless CMS architecture.

JS rendering types — SEO comparison

TypeWhatSEOAI crawlersUse case
CSREmpty HTML + JS bundleWeakZERO citationInternal apps only
SSRServer renders per requestVery goodFullPer-user personalization
SSGBuild time, static HTMLBESTFullBlog, marketing, docs
ISRSSG + on-demand revalidateBESTFull95% of sites 2026

Related guides

Frequently Asked Questions

What is JavaScript SEO?

JavaScript SEO is technical SEO subdiscipline focused on optimizing JavaScript-powered sites (React, Vue, Angular, Svelte) so search engines (Google, Bing, Yandex) AND AI crawlers (GPTBot, ClaudeBot, PerplexityBot) can correctly crawl, render and index them. Emerged ~2015 with mass adoption of SPA frameworks. CRITICAL problem: traditional crawlers saw only HTML in server response — CSR (Client-Side Rendering) sites returned only "<div id=root></div>" + JS bundle. Crawler didn't know what to render. Solution: SSR/SSG/Hybrid rendering. In 2026 Googlebot renders JavaScript (Web Rendering Service based on Chromium 131+), but: (a) with delay (median 9 sec vs <1s for HTML), (b) rendering budget limit, (c) AI crawlers do NOT render JS in 2026 (GPTBot, ClaudeBot, PerplexityBot see only HTML response). Consequence: SSR/SSG = MANDATORY for SEO + AI SEO 2026.

CSR vs SSR vs SSG vs ISR — comparison for SEO

CSR (Client-Side Rendering) — server returns empty HTML + JS bundle. Browser fetches JS, executes, generates DOM. Examples: Create React App (deprecated), old Angular SPA, manual SPA. SEO: WEAK — Googlebot renders with 9-30 sec delay, AI crawlers see empty HTML = ZERO citability. NOT recommended since 2020. SSR (Server-Side Rendering) — server executes React/Vue per request, returns full HTML. Hydration on browser. Examples: Next.js getServerSideProps (legacy), Remix, Nuxt SSR. SEO: VERY GOOD — full HTML in response, low TTFB. Cost: server CPU per request. SSG (Static Site Generation) — pages built once at build time, served as static HTML. Examples: Next.js generateStaticParams + force-static, Astro, Gatsby, Hugo, Jekyll. SEO: BEST — instant TTFB <100ms, perfect for CDN, zero server cost. Drawback: rebuild on changes. ISR (Incremental Static Regeneration) — combination SSG + on-demand revalidation. Pages pre-rendered, but revalidate every N sec or on webhook. Examples: Next.js 13+ App Router default. SEO: BEST — combines SSG benefits + freshness SSR. RECOMMENDATION: 95% of sites 2026 = SSG/ISR. SSR only when requires per-user personalization.

How does Googlebot render JavaScript?

Googlebot Rendering Process (Two-Wave Indexing, since 2018): WAVE 1 (FAST INDEX) — crawler fetches HTML (initial response). Indexes what it sees WITHOUT JS. Time: instant. WAVE 2 (RENDER QUEUE) — page lands in "render queue". Web Rendering Service (WRS, based on Chromium 131+ since 2025) renders JS. Median delay 9 sec (from few seconds to 1-2 weeks for old domains with low crawl budget). After rendering re-index with full DOM. PRACTICAL CONSEQUENCES: (1) if critical content (H1, primary keyword, CTA) is in initial HTML = INDEXED FAST, good for SEO. (2) if content only after JS execution (e.g. async fetch from API + render) = INDEXED LATE, worse. (3) for new domains + low authority Wave 2 may NEVER occur = pages NOT indexed. (4) AI crawlers do NOT do Wave 2 — see only Wave 1 HTML. CRITICAL: important content MUST be in initial HTML (SSR/SSG) or renderable by Googlebot Chromium. DEBUG: GSC URL Inspection → "Test Live URL" → "View tested page" → "More info" → "JavaScript console messages" + "Page resources". Shows what Googlebot sees after render.

Hydration — what it is and impact on SEO/Performance

Hydration is the process of "reviving" static HTML through JavaScript on client side. After SSR/SSG, browser receives full HTML (instant render = good for LCP), THEN JS bundle fetches, parses, "hydrates" interactive elements (event handlers, state). HYDRATION PROBLEM: CPU-heavy operation, blocks main thread = high INP (Interaction to Next Paint), poor Core Web Vitals = lower Google ranking. SOLUTIONS 2026: (1) PARTIAL HYDRATION (Astro, Qwik) — hydrate only interactive components ("islands architecture"). Static parts = no JS. Astro 4+ default. (2) PROGRESSIVE HYDRATION (Vue 3.5+, React 18 Suspense) — hydrate priority components first (above-the-fold), rest lazy. (3) RESUMABILITY (Qwik) — zero hydration, JS lazy-loaded only on user interaction. Best for performance but niche. (4) REACT SERVER COMPONENTS (RSC, Next.js 13+ App Router) — components rendered on server, ZERO JS shipped to client for static parts. Hydration only Client Components ("use client"). Best of both worlds. NEXT.JS 16 (GMWEB stack): RSC + ISR + Edge runtime = LCP <1s, INP <100ms, full SEO + AI SEO ready. Hydration cost for typical landing page <50ms.

Lazy loading + dynamic imports — SEO impact

LAZY LOADING + DYNAMIC IMPORTS = patterns saving bundle size by loading JS/components on demand. SEO IMPACT: VERY POSITIVE with proper implementation. (1) LAZY LOADING IMAGES (loading="lazy" attribute) — native support all browsers since 2020. Images below viewport load only when user scrolls. SEO: improves LCP (fewer initial requests), doesn't break crawling. Google indexes lazy images (since 2019). (2) DYNAMIC IMPORTS (import() or Next.js dynamic()) — components loaded on-demand. SEO: for critical content (above-the-fold) = BAD because Googlebot doesn't wait. For components below fold = OK. Rule: don't lazy load content in viewport. (3) ROUTE-BASED CODE SPLITTING — Next.js automatically code-splits per route. Each page = own JS bundle. SEO: positive (smaller bundles = faster). (4) THIRD-PARTY SCRIPTS (Google Analytics, GTM, chat widgets) — use Next.js Script with strategy="afterInteractive" or "lazyOnload" — don't block main thread = better INP. CRITICAL: do NOT lazy load any content Googlebot should index as primary content (H1, product description, FAQ).

JavaScript SEO for AI crawlers (GPTBot, ClaudeBot)

AI crawlers 2026 do NOT render JavaScript (with exception of Google-Extended which inherits WRS from Googlebot). Consequences: (1) GPTBot (OpenAI), ClaudeBot (Anthropic), PerplexityBot, FacebookBot, Bytespider — all see ONLY HTML in server response. (2) CSR pages = invisible for AI = ZERO citation in ChatGPT/Claude/Perplexity. (3) SSR/SSG pages = full visibility = high citation potential. REQUIREMENTS for AI SEO: (a) full content in initial HTML response, (b) Schema.org JSON-LD inline in HEAD or body, (c) clean semantic HTML (proper H1/H2/H3 hierarchy), (d) no "client-only" components for critical content. NEXT.JS 13+ APP ROUTER: default RSC = full SSR = AI-friendly. If "use client" component wraps critical content, change to Server Component or move content to parent SSR. ALTERNATIVE for legacy CSR (if migration impossible): prerender.io / Rendertron — service that renders JS bot-side and serves static HTML to crawlers (~$15/mo). Indicate via User-Agent detection in server. NOT recommended for new projects.

Most common JavaScript SEO mistakes

8 most common JS SEO mistakes (GMWEB audit 50+ sites): (1) CONTENT IN "useEffect" — primary content (H1, description) loaded in React useEffect after mount = Googlebot sees empty, AI crawlers see empty. Fix: SSR/SSG for critical content. (2) ASYNC FETCH WITHOUT SUSPENSE — component fetches data, shows "loading...", then renders. Googlebot indexes "loading..." as content. Fix: Server Components with await fetch. (3) ROUTING CLIENT-ONLY (react-router) — internal links not crawled (no href attribute). Fix: Next.js Link / native <a href>. (4) BLOCKED CDN/JS — robots.txt or server config blocks JS files (Googlebot Chromium can't load them = render fail). Fix: allow ALL static assets for Googlebot. (5) INFINITE LOOPS / TIMEOUT — page doesn't finish rendering in 30s = Googlebot abandons, indexes pre-render state. (6) CLOAKING (different content for bot vs user) — Google penalty. Fix: same HTML for everyone. (7) HASH ROUTING (#section) — Google doesn't index fragments. Fix: real URL paths. (8) JS-ONLY META TAGS — title/description set by useEffect = Googlebot Wave 1 sees default. Fix: Next.js Metadata API in Server Components.

Best practices JavaScript SEO 2026 — checklist

15-point JS SEO 2026 checklist: TECHNICAL: (1) SSR/SSG/ISR — NOT CSR (unless internal tools). (2) Next.js 13+ App Router with RSC default. (3) generateMetadata() per page (not client-side). (4) Schema.org JSON-LD inline in HEAD. (5) Internal links as Next.js <Link> (not router.push in onClick). (6) Hreflang per page through Metadata.alternates.languages. (7) sitemap.xml dynamic via app/sitemap.ts. PERFORMANCE: (8) LCP <2.5s (force-static + ISR + CDN edge). (9) INP <200ms (RSC = less JS hydration). (10) CLS <0.1 (reserve space for images, lazy load only below fold). (11) Bundle size <100KB initial (dynamic imports for heavy components). (12) Lazy load images with native loading="lazy". RENDERING: (13) Test in Googlebot User Agent (DevTools → Sensors → Custom UA "Googlebot Smartphone"). (14) GSC URL Inspection → "Test Live URL" → verify rendered HTML matches expected. (15) For AI SEO: curl page from User-Agent: "GPTBot" — verify HTML contains primary content. GMWEB STACK: Next.js 16 + RSC + force-static + Cloudflare Workers OpenNext = 100/100 Lighthouse default + AI-ready.

CSR → SSR/SSG migration for SEO

Your React/Angular/Vue site has poor rankings and zero AI citation? We plan migration to Next.js 16 + RSC + Cloudflare Workers. Audit + roadmap in 5 business days. From €450.

Request JS SEO audit