Skip to content
all journals
  • React
  • Next.js
  • Architecture

Server Components changed where I put my brain

Two years into React Server Components, the mental model finally clicked: it's not about performance, it's about deciding where data becomes UI. Notes from shipping a CMS on them.

I resisted React Server Components for a while. The pitch sounded like a performance hack — less JavaScript on the wire — and my apps were not slow enough to justify relearning data flow. Shipping a CMS on the App Router changed my mind, but not for the advertised reason.

The real question RSC asks

Every screen in a data-driven app answers the same question: where does data become UI? For a decade the answer was "in the browser" — fetch JSON, hold state, render. RSC makes that a per-component decision instead of an architecture-wide default.

  • React 19
  • Next.js App Router
  • Server Components
  • Suspense

The division of labor I've landed on:

ConcernWhere it lives now
Reading dataServer component, async, no state
Mutating dataServer action, validated at the boundary
InteractivitySmall client islands at the leaves
Secrets and queriesNever leave the server

The surprise was how much of a real product falls in the first row. In the CMS, entire admin screens turned out to be "read data, render tree" with two buttons of interactivity at the bottom. Under the old model, all of it would have been client state, loading spinners, and cache invalidation.

Where it hurts

Honesty section. Three things still cost me time:

  • The serialization boundary is invisible until it isn't. Passing a Date or a function across the client boundary fails at runtime, not in the editor. I now treat boundary props like an API contract.
  • Caching is powerful and opaque. When a page is stale, the answer lives in one of four caching layers. Read the framework docs for your exact version — the semantics genuinely change between majors.
  • The ecosystem lag is real. Any library that assumes useEffect on mount needs a client wrapper. Fewer every month, but budget for it.

The habit that transfers

The durable skill is drawing the boundary consciously: this part of the tree is data becoming HTML, that part is a stateful island. Even if RSC loses to some future model, thinking in boundaries — server/client, pure/stateful, cacheable/personal — is just good systems design wearing a React costume.