Skip to content
Back to blog

I Finally Used React Server Components for Real

After months of reading about RSC, I built something with them. Some thoughts.

React frontend Next.js

Background

I’ve been reading about React Server Components since they were announced. For a long time it felt theoretical. I understood the concept (render on the server, send less JavaScript to the client) but I didn’t have a project where it mattered enough to try.

Then I rebuilt one of my apps in Next.js and used RSC properly. Not just the default behavior where everything is a server component until you add “use client.” Actually thinking about what needs to be on the client and what doesn’t.

What worked

Data fetching got simpler. Instead of useEffect-fetch-setState-loading-error, I just await the data in the component. The component runs on the server, so it can talk to the database directly. No API route, no loading state, no useEffect. The code is shorter and easier to read.

Page loads got faster. I had one page that shipped 180KB of JavaScript because of a charting library. Made the chart a client component, kept everything else on the server. The page shell loads instantly now, chart pops in after.

What was confusing

The mental model takes time. You have to think about which components need interactivity (client) and which just display data (server). I kept hitting the “you can’t use useState in a server component” error until the boundary became intuitive.

Passing data between server and client components is weird at first. You can pass props down from server to client, but not the other way. Server components can import client components, but client components can’t import server components (they can accept them as children though). There are rules, and they make sense once you internalize them, but the first few hours are frustrating.

Would I use them again

Yes. For content heavy pages or anything with a lot of data fetching, server components are clearly better. For highly interactive apps (like a drawing tool or a real time dashboard), you’ll still end up with mostly client components, and that’s fine.

The ecosystem is catching up. Most component libraries work with RSC now. A year ago that wasn’t true.