Server rendering and hydration
There is nothing to write: createHandler renders each page with the matched route chain, sends the loader data in <script id="__shadow_router">, and the generated…
There is nothing to write: createHandler renders each page with the matched route chain, sends the loader data in
<script id="__shadow_router">, and the generated client entry (hydrateDusk) hydrates onto the server's markup
without running the loaders again. The mode option chooses how the page is sent:
mode |
Behavior | Next.js analog |
|---|---|---|
"stream" (default) |
The shell is sent first; Suspense boundaries show their fallback and the content follows in the same response |
Streaming with loading.tsx / Suspense |
"async" |
The renderer waits for every useResource to settle and sends one document |
export const dynamic = "force-dynamic" without streaming |
"string" |
Renders once, no waiting | none |
A route's loader is awaited before any byte is sent, so the status code and redirects are always right. To stream
slow data, start a useResource below a Suspense boundary instead of loading it in the loader. See
SSR, hydration and streaming.