DEV Community

Ahmed Mahmoud
Ahmed Mahmoud

Posted on • Originally published at eng-ahmed.com

React Server Components in Production: Lessons from 2026

Headline: RSC is a serious win for bundle size and TTFB, but only if your team commits to the new mental model. Half-adoption is worse than not adopting at all.

What Actually Changed

RSC moves rendering of components that don't need interactivity to the server. The browser receives a serialized tree, not a JavaScript bundle. The result on a real e-commerce surface we migrated at Devya Solutions:

  • −42% client JS on the product listing page
  • −180ms TTFB after enabling streaming
  • +0.08 INP regression on a poorly-split page (we'll come back to this)

The Three Component Types You Actually Use

  1. Server Components — fetch, render, never ship JS. Default for everything.
  2. Client Components ("use client") — for interactivity, hooks, browser APIs.
  3. Shared Components — pure presentation, work in both. Sweet spot for design systems.

The pitfall: every "use client" directive is a bundle entry point. One careless chart-library import pulls 80KB into every page.

Data Fetching Patterns That Survived

async function ProductList({ category }) {
  const products = await db.products.findMany({ where: { category } });
  return products.map(p => <ProductCard product={p} />);
}
Enter fullscreen mode Exit fullscreen mode

We deleted ~3,000 lines of React Query setup.

Server Actions for Mutations

'use server';
export async function addToCart(formData: FormData) {
  const productId = formData.get('productId');
  await db.cart.add({ productId });
  revalidatePath('/cart');
}
Enter fullscreen mode Exit fullscreen mode

What Still Hurts

  • Error boundaries — server-thrown errors surface as opaque digests in production
  • Third-party clients — anything that touches window needs a Client Component wrapper
  • Caching mental model — Next.js 15 made caching explicit, but the layers still confuse new hires

The INP Regression — And the Fix

Smaller JS doesn't automatically mean snappier interaction. Our regression: a deeply nested Client Component tree hydrated late. Fix: hoist the interactive island higher, pass server data as a prop.

Should You Adopt RSC?

Yes for new Next.js apps. For existing Pages Router apps, migrate route-by-route, not big-bang.


I write more production React patterns on eng-ahmed.com and ship them through Devya Solutions.

Top comments (0)