How adopting a server-first mindset with React Server Components led to faster, simpler applications — and why most of your UI probably does not need to run in the browser.
For the past two years, I have been building production applications with React Server Components and the shift in mental model has been profound. Instead of thinking about client-side state management, data fetching libraries, and hydration waterfalls, I now start every feature by asking a simpler question: does this need to run in the browser?
The answer is "no" more often than you would expect. Navigation menus, product listings, blog posts, dashboards with static data — all of these can render entirely on the server and send zero JavaScript to the client. The performance gains are not marginal. On a recent e-commerce project, switching the product catalog to server components dropped the JavaScript bundle by 40% and improved Largest Contentful Paint by over a second on mobile devices.
But the real benefit is not performance alone. It is simplicity. When a component runs on the server, you can query the database directly, read from the filesystem, call internal APIs without CORS headers, and stream the result to the browser as HTML. No loading spinners, no skeleton screens, no retry logic for failed fetches.
Of course, interactivity still requires client components. Forms, dropdowns, modals, real-time features — these need JavaScript. The key insight is that most pages are a composition of both. A product page might be 90% server-rendered content with a small interactive "Add to Cart" button. Treating interactivity as the exception rather than the default leads to faster, simpler applications.
If you are still building entire applications as client-side SPAs, I encourage you to try the server-first approach on your next project. Start with everything on the server, then move components to the client only when you need browser APIs or user interaction. You might be surprised how little client-side code you actually need.