Streaming SSR (Server-Side Rendering) sends HTML to the browser progressively as it is generated on the server — rather than waiting for the entire page to render before sending anything — while React Server Components (RSC) execute component logic entirely on the server, sending only the rendered output to the client without shipping component JavaScript. Together, these technologies dramatically improve Time to First Byte (TTFB), Largest Contentful Paint (LCP), and total JavaScript bundle size, which is especially impactful for users on slower connections common in India’s Tier 2/3 cities. In 2026, streaming SSR and RSC are production-stable in Next.js 15, React Router 7, and other frameworks.
Last updated October 2026
How Does Traditional SSR Differ From Streaming SSR?
Traditional SSR (Blocking)
- Browser requests a page
- Server fetches ALL data for the entire page
- Server renders the COMPLETE HTML
- Server sends the full HTML response
- Browser displays the page
- JavaScript hydrates for interactivity
Problem: If one data source is slow (a CRM API taking 3 seconds, a product recommendation engine taking 2 seconds), the entire page is delayed. The user sees nothing until everything is ready.
Streaming SSR
- Browser requests a page
- Server immediately sends the HTML shell (header, navigation, layout) with placeholder loading states
- As each data source responds, the server streams the corresponding HTML chunk to the browser
- Browser progressively renders each chunk as it arrives
- Interactive components hydrate selectively
Result: The user sees content within milliseconds. Fast parts of the page appear instantly. Slow parts stream in as they become ready. TTFB improves dramatically because the server starts sending immediately.
What Are React Server Components (RSC)?
React Server Components are a fundamentally new component type that runs exclusively on the server:
- Server Components (default in Next.js App Router): Execute on the server. Can directly access databases, file systems, and APIs without creating API endpoints. Their JavaScript never ships to the browser. Zero impact on client bundle size
- Client Components (marked with “use client”): The traditional React components that run in the browser. Needed for interactivity: event handlers, useState, useEffect, browser APIs
What Does This Mean in Practice?
Consider a product page:
- Product details, description, specifications: Server Component — renders HTML on the server, sends zero JavaScript to the browser. Can directly query the database
- Image carousel with swipe: Client Component — needs browser event handlers for touch/swipe
- Add to cart button: Client Component — needs onClick handler and state management
- Reviews section: Server Component — renders review HTML on the server. The “helpful” vote button inside it is a Client Component
- Related products: Server Component — database query + HTML rendering, no client JavaScript
Previously, ALL of this shipped as JavaScript to the browser. With RSC, only the interactive parts (carousel, add-to-cart, vote button) ship JavaScript. Result: 40-70% reduction in client JavaScript for typical pages.
How Do Streaming SSR and RSC Work Together?
They are complementary:
- RSC reduces what ships to the browser: Server Components render to HTML with zero client JS
- Streaming delivers that HTML progressively: Instead of waiting for all Server Components to render, the server streams each as it completes
- Suspense boundaries define streaming chunks: Wrap slow-loading sections in React Suspense. The fallback (loading skeleton) ships immediately; the actual content streams when ready
Implementation in Next.js 15 (App Router)
Next.js 15 with App Router uses RSC and streaming by default:
- All components in the
app/directory are Server Components by default - Add
"use client"at the top of a file to make it a Client Component - Use
loading.tsxfiles for route-level streaming boundaries - Use
<Suspense fallback={...}>for component-level streaming boundaries - Async Server Components can directly
awaitdata fetching — no useEffect or getServerSideProps needed
Performance Impact for Indian Users
These technologies have an outsized impact for Indian web users:
- Network conditions: Average mobile connection in Tier 2/3 India: 10-25 Mbps with 50-150ms latency. Reducing JavaScript by 40-70% means faster parse and execute times on mid-range Android devices
- Device capabilities: The median Indian smartphone has 3-4GB RAM and a mid-range processor. Heavy JavaScript frameworks struggle. Server Components shift computation to the server, making the client experience smoother
- Core Web Vitals improvement: LCP improves by 20-40% with streaming (content appears faster). INP improves by 30-50% with reduced JavaScript (less main thread blocking). CLS stays stable (skeleton placeholders maintain layout)
- SEO benefit: Fully rendered HTML from Server Components is immediately crawlable by search engines without JavaScript execution. This is significant for Google’s crawl efficiency, especially for sites with thousands of pages
When to Use Each Rendering Pattern
| Pattern | Use When | Examples |
|---|---|---|
| Static (SSG) | Content rarely changes | Blog posts, docs, landing pages |
| Server Components | Dynamic content, no client interactivity | Product details, user profiles, dashboards |
| Streaming SSR | Page has multiple data sources with varying latency | E-commerce product pages, search results |
| Client Components | Interactivity required | Forms, carousels, real-time updates |
| ISR (Incremental Static) | Content changes periodically | Product catalogs, news aggregation |
Common Mistakes When Adopting RSC
- Making everything a Client Component: Adding “use client” to every file defeats the purpose. Start with Server Components (the default) and only add “use client” where you need interactivity
- Passing non-serializable props: Server Components cannot pass functions, class instances, or other non-serializable data to Client Components. Keep the boundary clean: pass primitive data and let Client Components handle their own logic
- Not using Suspense boundaries: Without Suspense, a slow database query blocks the entire page. Wrap each independent data-fetching section in Suspense with a meaningful loading fallback
- Over-fetching in Server Components: Just because you CAN query the database directly in a component does not mean you should do it inefficiently. Use database connection pooling and query optimization just as you would with traditional APIs
Frequently Asked Questions
Do React Server Components work with libraries like Redux or Zustand?
Client-side state management libraries (Redux, Zustand, Jotai) work in Client Components only. Server Components cannot use useState, useEffect, or any client-side state management. The mental model shift: Server Components fetch and display data; Client Components handle interactivity and local state. For global state that both need, pass data from Server Components down to Client Components as props, or use React context at a Client Component boundary.
Is streaming SSR compatible with CDN caching?
Partially. Static parts of the streamed response can be cached (the HTML shell, navigation, footer). Dynamic streamed chunks are generated per-request. CDN providers (Cloudflare, Vercel Edge) support streaming responses and can cache the initial bytes while streaming dynamic content. Vercel’s infrastructure is optimized for this pattern with Next.js. For self-hosted deployments, ensure your reverse proxy (Nginx) does not buffer the entire response before sending.
Can I use streaming SSR without React?
Yes. Streaming SSR is not React-specific. SvelteKit, Astro, Nuxt (Vue), and SolidStart all support streaming SSR. React popularized the pattern with its Suspense architecture, but the HTTP chunked transfer encoding that enables streaming works with any server-side framework. Even PHP (with output buffering disabled) can stream HTML progressively.
How much JavaScript reduction can I expect from React Server Components?
Depends on your application. Content-heavy sites (blogs, documentation, product catalogs) see 50-70% reduction because most content rendering moves to the server. Interactive applications (dashboards, editors, chat) see 20-30% reduction because more components need client-side interactivity. The biggest wins come from moving data-fetching libraries (React Query, SWR) and their associated code to the server.
Does The MAD build applications with streaming SSR and React Server Components?
Yes, our web development team builds Next.js applications using the latest rendering patterns. We have deployed production applications using App Router with Server Components and streaming for Indian clients across e-commerce, SaaS, and content platforms. Contact akshat@themad.in for project discussions.






