LLumen
← All articles

Server Components changed how I structure a frontend

Cover — server-components-changed-structure

The App Router made me renegotiate an old habit: reaching for client state by default. On this site exactly one component ships interactivity for content — the tag filter. Everything else renders on the server and arrives as HTML.

The split that emerged

  • Pages are Server Components. They fetch, map, and pass plain props down.

  • Client islands are leaves: the tag filter, the theme toggle. No fetching inside.

  • The data layer is one file. Components never see a raw CMS entry — only typed view models.

That last rule does the most work. When Contentful's response shape changes, one mapper changes. The components can't even tell.

What it bought

First Load JS for a content page sits around 110 kB, most of it framework. The content itself costs nothing on the client — no hydration of article bodies, no fetch waterfalls, no loading spinners for text that was known at build time.

A loading spinner on static content is an apology for an architectural decision.

The mental model is calmer too: data flows in one direction, and 'where does this state live' has a boring answer — on the server, unless a user interaction owns it.