"Server Component" says where code runs, not when. That second question is answered per route, and next build prints its answer:
Route (app) ┌ ○ / ├ ○ /_not-found ├ ○ /notes ├ ○ /notes-client ├ ƒ /now ├ ○ /panel └ ƒ /slow ○ (Static) prerendered as static content ƒ (Dynamic) server-rendered on demand
A route is static until it asks for something only a request can supply. /now awaits headers(), so it is ƒ; everything else rendered once at build time and is served as a file. The split is about inputs, not components.
The third mode sits between them. Wrap a slow subtree in <Suspense>: React 7,897 sends the fallback in the first bytes of the response, then streams the real markup on the same connection when it resolves.
import { Suspense } from "react";
import { connection } from "next/server";
async function Revenue() {
await connection();
await new Promise((r) => setTimeout(r, 1500));
return <p>Revenue: $41,208</p>;
}
export default function Slow() {
return <main><h1>Dashboard</h1>
<Suspense fallback={<p>Loading revenue...</p>}><Revenue /></Suspense>
</main>;
}Reading the raw socket shows the shape of the response:
0.00s headers 200 0.10s + 943 bytes (total 943) <- fallback 0.10s + 4166 bytes (total 5109) <- fallback 1.57s + 101 bytes (total 5210) <- Revenue resolved 1.58s + 912 bytes (total 6122)
The heading and the fallback are on the wire at 100 ms; the revenue figure arrives 1.5 seconds later as extra payload rows on the same response, so the reader sees a page instead of a blank tab.
await connection() is what made this route dynamic. Without it the setTimeout counted as predictable work, the route was prerendered ○, and the 1.5-second wait was paid once at build time — a reminder that <Suspense> does not by itself opt anything into per-request rendering.
Aim for the narrowest dynamic boundary you can: pushing a cookies() read down into a small component keeps the rest of the page in the prerendered shell. With Cache Components enabled, Next.js 16 10,514 prerenders everything it can, serves that shell instantly and streams the rest — the model Caching and Revalidation covers in full.