Need the #1 SEO strategist and optimiser in Brisbane?Click here →

JavaScript SEO

12 min readLast reviewed: March 2025

Google can render JavaScript, but there's a delay. Content rendered client-side takes longer to index than HTML served from the server. For maximum crawlability and speed, server-side rendering is ideal.

How Googlebot Handles JavaScript

Googlebot can execute JavaScript. When it crawls a page, it follows this process:

  1. Fetches the HTML from your server.
  2. Parses the HTML and extracts links, text, and metadata.
  3. Queues the page for a second-wave rendering in the Chrome browser engine.
  4. Later (hours or days), the page is rendered with JavaScript executed.
  5. The rendered DOM is indexed.

The critical point: there's a delay between initial fetch and JavaScript rendering. For new sites or sites with limited crawl budget, this delay can be problematic. Content not present in the initial HTML might not be crawled or indexed quickly.

Other Crawlers Are Less Capable
Google renders JavaScript well. Bing has some JS capabilities but less comprehensive. Other search engines, mobile app indexing, and social media crawlers often don't execute JS at all. For maximum compatibility, don't rely on JavaScript for critical content.

CSR vs SSR vs SSG

Client-Side Rendering (CSR)

The browser downloads minimal HTML, then JavaScript runs to build the page. The server sends a skeleton HTML file with no content, and JavaScript populates it. This is how single-page applications (SPAs) work.

Problem for SEO: Content isn't in the initial HTML, so crawlers see a blank page. Googlebot eventually renders it, but there's a delay. For mobile app indexing or Bing, content might not be indexed at all.

CSR is worst for SEO among the three options. Use it only if necessary.

Server-Side Rendering (SSR)

The server renders the page (executes JavaScript) and sends fully-rendered HTML to the browser. The user gets the complete page immediately. Google crawls the full page in the initial fetch.

SSR is best for SEO. Content is in the HTML, crawlers see it immediately, and there's no rendering delay.

Downside: SSR is computationally expensive. Every request requires rendering. For high-traffic sites, SSR can be slow and resource-intensive. It's worth the cost for SEO, but infrastructure requirements increase.

Static Site Generation (SSG)

Pages are pre-built at build time into static HTML files. No rendering happens at request time. When a user requests a page, the server serves the pre-built HTML instantly.

SSG is excellent for SEO. Pages are fully-rendered static files. Google crawls them instantly. They're incredibly fast. Downside: you can't generate millions of pages (build times become prohibitive). SSG works best for sites with hundreds or thousands of pages, not millions. E-commerce with dynamic pricing, real-time inventory, or frequent updates is harder with SSG.

Common JavaScript SEO Problems

Content Only in JavaScript

The page HTML is minimal; content is rendered via JavaScript. Googlebot crawls the initial HTML, sees nothing, and has to wait for rendering. If the content matters for ranking, this delay is bad. Solution: move critical content into the initial HTML.

Links in JavaScript

Links created dynamically by JavaScript might not be crawled. Googlebot sees the initial HTML links, then executes JS and might discover new links. But not all dynamically-created links are reliably discovered. Solution: include links in the HTML whenever possible, not just JavaScript.

Infinite Scroll

Infinite scroll pages load more content dynamically as you scroll. Googlebot doesn't "scroll" — it fetches the initial page. It might execute JS and load some additional content, but not all of it. Pagination is more SEO-friendly than infinite scroll. If you use infinite scroll, provide pagination links or a sitemap to expose all content.

Hash-Based Routing

Single-page apps sometimes use hash-based URLs: example.com/#/page1, example.com/#/page2. The # indicates everything after is a hash fragment, treated as client-side navigation. Googlebot can crawl these if they're properly set up with escaped fragments, but it's fragile. Use proper URL paths instead: example.com/page1, example.com/page2.

Testing JavaScript Rendering

Google Search Console URL Inspection Tool

In GSC, go to URL Inspection. Enter a page URL. Click "Test live URL" and you'll see how Google renders it. Compare the "HTML" tab (initial fetch) to the rendered view. If content is missing in the HTML but present when rendered, you have a CSR issue.

View Rendered Source

In Chrome DevTools, fetch a page and view the initial HTML in the Sources tab. This is what Googlebot initially sees. Compare to the Elements tab, which shows the rendered DOM after JavaScript execution. If they differ significantly, content is JavaScript-dependent.

Best Practices for JavaScript Sites

  • Use SSR when possible. Render on the server and send HTML to the browser.
  • Use SSG for static content. Pre-build pages at build time.
  • If you must use CSR: Include critical content in the initial HTML (even if duplicate). Use structured data. Create an XML sitemap. Test rendering in GSC.
  • Avoid hash-based routing. Use proper URL paths.
  • Avoid infinite scroll. Use pagination or provide pagination links.
  • Make links in HTML. Don't create all navigation in JavaScript.
Framework Choice Matters
Modern frameworks (Next.js, Nuxt, Remix) support SSR and SSG out of the box. If you're building a new JavaScript site, choose a framework with SSR/SSG support. Legacy frameworks or custom implementations often require retrofitting for SSR.

The Trade-Off

JavaScript provides interactivity and modern UX. But it comes with SEO costs. Best practice: use JavaScript for interactivity, but serve critical content in HTML. This gives you modern features without sacrificing crawlability.