React Server Components are real, and they're huge. They're also not in this quest. This lesson explains the boundary so you know exactly when to leave for next-js-quest.
What RSC actually is
A React Server Component is a component whose render runs on a server (during build, or per-request), and whose output is shipped to the client as a serialized component tree — not as HTML, and not as JavaScript. The client React runtime then mounts it alongside any Client Components, hydrating only the interactive parts.
The big wins: zero JS shipped for the static parts, direct data access from inside components (no API layer needed for read-only fetches), and a clean split between 'this runs on the server' and 'this needs to be interactive on the client.'
Why RSC needs a meta-framework
RSC requires:
- A server that runs React. (Vite's dev server doesn't.)
- A build pipeline that understands the
'use server'and'use client'directives and splits modules accordingly. - A routing layer that knows which RSCs to render for a given URL.
- A serialization protocol for streaming the component tree to the client.
- A client runtime that knows how to consume that protocol.
Together, that's a meta-framework. Next.js implements all five. Remix-style frameworks implement all five. Vite alone implements none of them — Vite is a client-side bundler with a dev server, not a React runtime host.
What about vite-plugin-rsc?
There are experimental plugins exploring RSC in Vite. They're worth watching. They are not production-ready in mid-2026. If you need RSC today, reach for Next.js or Remix, not an experimental Vite plugin.
The Client Component side still lives here
Everything React 19 introduced for client-side concurrency — useTransition, useDeferredValue, the use() hook for client-side promises, the React Compiler — works in this Vite SPA. You'll learn all of those in this quest. You just won't write a Server Component, because the runtime needed to render one doesn't exist in your stack.
Server Actions in particular
Server Actions are React-19 primitives in the type system, but in practice they're inseparable from the meta-framework's request handling. You'll see them in next-js-quest. In this quest, when we cover Actions (Track 6), we'll use the same useActionState / useFormStatus / useOptimistic hooks but bound to client-side async functions (fetch to your backend, save to local storage) — not server functions.