wouter + Deno + Ultra demo
In order to render your app on the server, you'll need to wrap your app with top-levelRouter
and specify ssrPath
prop (usually, derived from current request).
import { renderToString } from "react-dom/server"; import { Router } from "wouter"; const handleRequest = (req, res) => { // top-level Router is mandatory in SSR mode const prerendered = renderToString( <Router ssrPath={req.path}> <App /> </Router> ); // respond with prerendered html };
On the client, the static markup must be hydrated in order for your app to become interactive.
import { hydrateRoot } from "react-dom/server"; const root = hydrateRoot( domNode, // during hydration `ssrPath` is set to `location.pathname` <Router> <App /> </Router> );
❕ Note that to avoid having hydration warnings, the JSX rendered on the client must match the one used by the server, so the Router
component must be present.