Development Tips

React Server Components in 2026: What They Are and When to Actually Use Them

By Ken Key Feb 24, 2026 5 min read Updated Oct 16, 2026

React Server Components in 2026: What They Are and When to Actually Use Them
The short answer

A Server Component runs on the server only, ships no JavaScript, and can query your database directly. A Client Component handles anything interactive. In the App Router, Server Components are the default. Use a Client Component only where you need state, effects, or browser events, and keep those boundaries small.

Part of the complete web development guide.

On this page

React Server Components stopped being an experiment a while ago. If you’re still treating them like a novelty, or worse, if you’re sprinkling "use client" on everything because it’s the only way you know how to make the build pass, you’re leaving real performance on the table. Here’s how I think about them after shipping production apps with them.

The one-line version

A Server Component runs on the server, never ships its code to the browser, and can talk to your database directly. A Client Component runs in the browser (and on the server for the initial render) and exists for anything interactive. That’s it. The complexity people complain about comes from not understanding which one they actually need at any given point in the tree.

The default in the App Router is a Server Component. You opt into client behavior with the directive at the top of the file:

// app/posts/[slug]/page.tsx
// Server Component by default. No directive needed.
import { db } from "@/lib/db";

export default async function PostPage({ params }: { params: { slug: string } }) {
 const post = await db.post.findUnique({ where: { slug: params.slug } });

 if (!post) return notFound();

 return (
 <article>
 <h1>{post.title}</h1>
 <PostBody content={post.content} />
 <LikeButton postId={post.id} />
 </article>
 );
}

That component hits the database, renders HTML, and ships zero JavaScript for itself. The LikeButton is the only thing that needs to be a Client Component, and it’s the only thing that crosses the boundary.

What actually gets sent to the browser

This is the part that trips people up. Server Components aren’t rendered to HTML and thrown away. React serializes their output into a special payload (the RSC payload) that the client uses to reconcile the tree. That payload includes the rendered element tree and any props passed to Client Components. It does not include your server-only imports, your database credentials, or your ORM.

So when someone tells you Server Components “reduce bundle size,” they’re right, but the mechanism matters. You’re not minifying your way to a smaller bundle. You’re never including that code in the bundle in the first place.

Where people go wrong

1. Marking a whole page as a Client Component

If your page component has "use client" at the top, every component it imports becomes a Client Component too. That single line can undo the entire benefit. Push the directive down to the smallest interactive leaf you can.

2. Passing functions across the boundary

You can’t pass a function from a Server Component to a Client Component unless it’s a Server Action. This throws people constantly.

// This breaks. Functions aren't serializable across the boundary.
<SearchBox onSearch={(q) => filter(q)} />

// This works. Server Action, marked in its own file.
// app/actions.ts
"use server";
export async function search(query: string) {
 return db.post.findMany({ where: { title: { contains: query } } });
}

3. Using Server Components for things that need state

No useState, no useEffect, no event handlers in a Server Component. If you need a dropdown that opens, a form that validates as you type, or anything driven by the user, that’s a Client Component. Don’t fight it.

4. Assuming they replace your API layer

Server Components can query your data directly, and for a lot of read-heavy pages that means you can delete API routes you don’t need. But if you have a mobile app, a public API, or third-party consumers, you still need those endpoints. Server Components are a rendering strategy, not an API replacement.

A pattern that works well

I keep the page as a Server Component, fetch there, and pass plain serializable data down to a single Client Component that handles interaction. Streaming with Suspense lets the slow parts fill in without blocking the shell:

// app/dashboard/page.tsx
import { Suspense } from "react";

export default function Dashboard() {
 return (
 <main>
 <h1>Dashboard</h1>
 <Suspense fallback={<p>Loading stats...</p>}>
 <Stats />
 </Suspense>
 <Suspense fallback={<p>Loading activity...</p>}>
 <Activity />
 </Suspense>
 </main>
 );
}

async function Stats() {
 const stats = await getStats(); // slow query
 return <StatGrid data={stats} />;
}

The shell renders immediately. Each Suspense boundary streams in when its data resolves. On a slow connection this is the difference between a page that feels broken and one that feels fast.

Do you need them on every project?

No. If you’re building a small marketing site with a contact form, Server Components add ceremony you don’t need. Where they earn their keep is data-heavy apps, dashboards, content sites with a lot of server-side rendering, and anything where shipping less JavaScript to the client is a real win. I do custom web development for clients around Long Island and New York, and the decision usually comes down to how much of the page is actually interactive. A brochure site? Ship it static. A dashboard with live data? Server Components are worth the learning curve.

The honest summary: they’re not magic, they’re not mandatory, and the people who get the most out of them are the ones who stop trying to make every component a Client Component and let the server do the work it’s good at.

FAQ

Can I use Server Components with Next.js 14 or do I need 15+?

Server Components work in Next.js 13.4 and later with the App Router. Next.js 15 and 16 (current in 2026) have better streaming, improved caching defaults, and fewer rough edges, so if you’re starting fresh, use the latest stable release. If you’re on 13.x, upgrading is worth it before you build anything large.

Do Server Components hurt SEO?

No, the opposite. They render on the server, so crawlers get full HTML on the first response. That’s better for SEO than a client-rendered app where the content depends on JavaScript executing. Just make sure your metadata is set correctly for each route.

What’s the fastest way to tell if a component should be a Server Component?

Ask whether it needs state, effects, or event handlers. If the answer is no, it can be a Server Component. If the answer is yes, make it a Client Component and keep it as small as possible.

Have a project like this?

I do custom web development for Long Island businesses. If you need this done right, let’s talk.