PerformanceArchitecture
RSCFeb 23, 2026, 05:43:40 PM

RSC Architecture & Waterfalls

React Server Components (RSC) redefine how data travels from your server to the screen. By moving fetching to the server, we eliminate the costly 'Request-Response' cycles that cause slow page loads.

Rendering EnvServer Runtime

Strategy Details

Server-First rendering introduced in React 18 (2022). Fixes the 'Waterfall' problem by consolidating data fetching on the server before client execution.

Hydration Logic

Pre-rendered HTML is sent to the client, then React 'hydrates' it to enable full interactivity.

RSC Pipeline

Order of operations

Server Execution

The component executes ONLY on the server. Zero JS is sent to the client for this logic.

Direct DB Access

RSCs can query databases or call internal APIs without needing a REST/GraphQL endpoint.

Consolidated Payload

Multiple fetches are combined into a single serialized stream.

Zero-Hydration UI

Static parts are rendered as HTML; only Interactive islands are hydrated.

Implementation Blueprint
app/page.tsx
// Standard Server Component (Default in Next.js 13+)
export default async function Page() {
  // Direct Server-Side logic (No useEffect/useState needed)
  const data = await db.query('SELECT * FROM products');
  
  return (
    <main>
      <h1>Server-Side Data</h1>
      <ProductGrid items={data} />
      
      {/* Client Component Island */}
      <InteractiveFilter /> 
    </main>
  );
}

React Server Components are not just SSR. They allow you to define parts of your UI that stay on the server forever, reducing bundle size and eliminating client-side data fetching waterfalls.

The Code Transformation

See how the transition from Client-Side to Server-Side components simplifies your pipeline and improves developer experience.

Pipeline Code Comparison

dashboard-client.tsx
// ❌ BEFORE: The Waterfall (Client-Side)
export default function Dashboard() {
const [user, setUser] = useState(null);
useEffect(() => {
// 1st Round-trip: Fetch User
fetch('/api/user')
.then(res => res.json())
.then(data => setUser(data));
}, []);
if (!user) return <Loading />;
// ⚠️ CHILD starts fetching only after PARENT renders
return <PostList userId={user.id} />;
}
Client Payload

Includes heavy useEffect logic, state management, and fetch overhead.

Execution

Requests travel over the public internet (High Latency).

Visualization of the Waterfall

Conceptualizing the network requests: CSR requires chaining, while RSC allows consolidation.

client Architecture

Total Time: ~4500ms
Root HTML
React Bundle
Fetch Layout
Fetch Profile
Fetch Posts

The 'Fetch-on-Render' pattern causes children to wait for parent fetches. This is the 'Waterfall' problem.

rsc Architecture

Total Time: ~1200ms
Server Render
Parallel Fetch
Stream Body

RSCs fetch data on the server with zero client latency between requests, delivering a consolidated result.

The RSC Evolution

From Client-Heavy to Server-First (2020 - 2025)

2020: The RFC

Conceptual Birth

Facebook introduces RSC to solve the "huge JS bundles" problem. The idea: some components should never hydrate on the client.

2022: Next.js 13

App Router Launch

The first production implementation. Data fetching becomes as simple as await fetch() inside your components.

2024: Next.js 15

Full Maturity

Streaming, Partial Prerendering (PPR), and Server Actions complete the ecosystem, making waterfalls a thing of the past.

Technical Documentation

Read the full architecture breakdown in ABOUT.md