Why prerender
A client-only app ships an empty shell and fills it in with JavaScript. A prerendered app ships the finished HTML and then attaches behaviour to it.
| what a crawler receives | |
|---|---|
| client-only SPA | an empty <div id="app"> |
| prerendered | the whole page, as text |
This is mostly a distribution question
Nobody browses documentation from the homepage. They search, or they follow a link. If the served HTML is empty, the page competes on nothing.
Google does eventually execute JavaScript, but indexing is delayed and unreliable. Most other crawlers do not run it at all — and that now includes the ones feeding AI assistants, which is increasingly how people ask about a library before they ever visit its site.
And a load-time one
Prerendered content paints as soon as the HTML arrives. There is no "download the bundle, parse it, run it, then see something" step in front of the first render — that work still happens, but it happens behind content the reader can already use.
What Ramonda gives you
renderToString |
an app → HTML, with state blobs for hydration |
renderPage |
the same, plus the <head> its components produced |
renderDocument |
wraps that in a complete document |
hydrateRoot |
adopts the server's DOM instead of rebuilding it |
routePaths |
the paths a static build should render |
There is no separate server renderer to learn. The same components, the same lifecycle, the same
diff — the env option decides what runs where.
SSR or SSG?
Both use the same functions. The difference is when you call them.
- Static (SSG) — call them at build time, write files, serve them from a CDN. No server, no runtime cost, and it is what this site does.
- Server (SSR) — call them per request, when the page depends on who is asking.
Start static. Move a route to per-request rendering when it genuinely cannot be built ahead of time.
Next
- renderToString and hydrateRoot — the pair.