Skip to content
Now accepting Q2 projects — limited slots available. Get started →
Frameworks · Updated Apr 30, 2026

What is React Server Components?

React Server Components are a React architecture that renders components on the server, sending only their output to the client.

What are React Server Components?

React Server Components (RSC) are a React rendering architecture where specific components execute exclusively on the server, sending a serialized UI description—not their source code—to the client. First proposed by the React team in December 2020 and shipped as stable in Next.js 13.4 (May 2023), RSC fundamentally changes the component model by splitting the tree into server and client subtrees.

Server Components can directly access databases, file systems, and private APIs without exposing secrets or shipping dependency code to the browser. In practice, this means a component that imports a 200 KB Markdown parser adds zero bytes to the client bundle.

RSC is the default in Next.js App Router: every component is a Server Component unless you add the 'use client' directive. We've shipped this on 50+ projects and consistently see 30–50% reductions in client-side JavaScript.

How it works

When a request hits the server, React renders the Server Component tree into a special wire format called the RSC payload—a streaming, JSON-like protocol that describes the component output (elements, props, references to Client Components) without including the component functions themselves.

Here's the mental model:

  1. Server phase: React calls your Server Components, resolves any async data fetching (yes, Server Components can be async functions), and produces the RSC payload.
  2. Streaming: The payload streams to the client over HTTP, chunk by chunk, which pairs naturally with <Suspense> boundaries.
  3. Client reconciliation: React on the client deserializes the payload, stitches in Client Component subtrees (marked with 'use client'), and hydrates only those interactive parts.
// app/dashboard/page.tsx — Server Component by default
import { db } from '@/lib/db';
import { Chart } from '@/components/Chart'; // 'use client' inside

export default async function DashboardPage() {
  const metrics = await db.query('SELECT * FROM metrics WHERE org_id = $1', [orgId]);
  return (
    <section>
      <h1>Dashboard</h1>
      {/* Chart is a Client Component; it receives serializable props */}
      <Chart data={metrics} />
    </section>
  );
}

Key constraints: Server Components can't use useState, useEffect, or any browser API. Props passed from Server to Client Components must be serializable (no functions, no classes). Violating either produces a build-time or runtime error in Next.js.

Server Actions (the 'use server' directive) complement RSC by letting Client Components call server-side mutations without writing API routes—these shipped stable in Next.js 14 (October 2023).

When to use it

RSC shines when you need data-heavy pages with minimal interactivity, or when you're trying to shrink bundle size.

Use RSC when:

  • Fetching data at the component level (co-located queries instead of centralized loaders)
  • Rendering Markdown, syntax highlighting, or content that depends on large libraries the client doesn't need
  • Building dashboards, documentation sites, or e-commerce product pages
  • You want to keep API keys and database credentials off the client entirely

Skip RSC (or think twice) when:

  • Your app is almost entirely interactive (real-time editors, games)—you'll end up marking everything 'use client' anyway
  • You're locked into a non-RSC framework like Remix (as of April 2026, Remix hasn't adopted RSC)
  • Your team isn't on Next.js 13.4+ or a framework with RSC support
  • You need to share component logic between server and client in ways that fight the serialization boundary

Our preferred stack is Next.js App Router with RSC defaults. For purely interactive SPAs, we still reach for Vite + React.

React Server Components vs alternatives

Approach JS shipped to client Data fetching Interactivity Framework support
React Server Components Only Client Components In-component, server-side Client Components only Next.js, Waku
SSR (traditional) Full component tree getServerSideProps / loaders Full hydration Next.js Pages, Remix
Static Site Generation Full component tree Build-time only Full hydration Next.js, Astro
Astro Islands Only island components Astro frontmatter / loaders Opt-in islands Astro

The closest analog to RSC outside React is Astro's zero-JS-by-default model with islands. The difference: RSC preserves React's component model and state tree across navigations, while Astro islands are framework-agnostic but don't share a unified component tree. If you're already in the React ecosystem, RSC is the natural path. If you're framework-flexible and content-heavy, Astro is worth evaluating.

Real-world example

We rebuilt a client's marketing site (120+ pages, heavy on long-form content with embedded code samples) from Next.js Pages Router to App Router with RSC. The content pages used rehype and shiki for Markdown and syntax highlighting—together about 180 KB of dependencies.

With RSC, those libraries run only on the server. The result: client JS per page dropped from 310 KB to 140 KB (gzipped), Largest Contentful Paint improved from 2.8s to 1.6s on mobile 4G (measured in Chrome UX Report data), and Time to Interactive dropped by over a second. The only Client Components on those pages were a table-of-contents sidebar with scroll tracking and a feedback widget—about 12 KB total.

Frequently asked questions about React Server Components

Are React Server Components the same as server-side rendering (SSR)?
No. Traditional SSR renders your entire component tree to HTML on the server, then ships all the component JavaScript to the client for hydration. Every component—interactive or not—ends up in the client bundle. React Server Components only send serialized output for server-rendered parts; the actual component code never reaches the browser. Client Components still hydrate normally. Think of RSC as a layer on top of SSR: the server renders both Server and Client Components, but only Client Components require hydration JavaScript. Next.js App Router uses both RSC and SSR together by default.
When did React Server Components become stable?
The React team first demoed RSC in December 2020 via an experimental RFC and a demo app. They remained experimental for over two years. Next.js 13.4, released in May 2023, was the first production-stable implementation of RSC, shipping them as the default in the App Router. React 18 provided the underlying streaming and concurrent features that RSC depends on (released March 2022). As of April 2026, the canonical RSC implementation is still Next.js, though the Waku framework also supports them. The React core team has continued refining the RSC protocol, and React 19 (released December 2024) formalized several RSC primitives including `'use server'` for Server Actions.
What's the alternative to React Server Components?
If you want similar zero-JS-by-default behavior without RSC, Astro is the strongest alternative—it ships no JavaScript unless you opt into interactive islands. For React-specific alternatives, you can stick with Next.js Pages Router or Remix, both of which use traditional SSR with full hydration. Remix uses loaders for server-side data fetching, which gives you co-located data logic without RSC's component-level split. Another option is static generation with client-side fetching (SWR or TanStack Query), though this trades server-side data access for simpler architecture. The right choice depends on your interactivity needs and whether you're committed to React.
Can you use React Server Components without Next.js?
Technically yes, but practically it's hard. The RSC protocol is part of React itself, not Next.js, but building a custom RSC bundler and server integration from scratch is a significant undertaking—you'd need to handle the RSC wire format, module resolution for client references, streaming, and routing. Waku is a lighter-weight framework that supports RSC and is worth evaluating for smaller projects. The React team has published bundler integration docs, and projects like Parcel have experimented with RSC support. But as of April 2026, Next.js remains the most complete and battle-tested RSC implementation. We recommend it unless you have a strong reason to avoid it.
Get in touch

Let's build
something together.

Whether it's a migration, a new build, or an SEO challenge — the Social Animal team would love to hear from you.

Get in touch →