It seems mostly expected to have a framework or library in place that takes care of data fetching for the root component.
The new docs emphasize this, I guess mostly to make users think twice about building their own hook and to make it easy to move initial data fetching to the server.
Frameworks include next.js, remix or vite-plugin-ssr (the last one is maybe an outlier, as it deems itself a library).
Often fetching is tied to routing, which makes sense.
If routing is not needed, AFAIK the go-to solutions right now are react-query or SWR.
https://swr.vercel.app/
react-query has a nice comparison table for data fetching libraries:
https://tanstack.com/query/v4/docs/react/comparison
If routing only takes place on the client, react-router also includes data fetching features:
https://reactrouter.com/en/main/guides/data-libs
I don't know how well react-router fits with SSR.
If none of that fits and the requirements are either very simple or very custom, it should still be possible to manually pass props to the root component.
Looking this up in the docs, the big caveat of this unconventional approach is that props would not be reactive, the root component would have to be manually re-rendered:
https://react.dev/reference/react-dom/client/createRoot#upda...