I'm just starting on server side rendering a react 16 app using code splitting and dynamic import thanks to webpack 4 and react-loadable.
My question might sound stupid but there's something I don't quite get.
On the server side, I'm waiting that webpack has loaded all modules before spitting out the html to the client.
On the client side I have a kind of loading component rendered, before rendering the loaded component.
So basically the server renders the loaded component:
<div>loaded component</div>
And the client hydrates the loading component:
<div>loading...</div>
Obviously, The problem is that React complains after hydrate() because there is a miss match between server and client.
During a few seconds the client first renders
<div>loading...</div>
whereas server has rendered and sent to the client, the html of the loaded component.
Can someone enlighten me ? how does it work exactly ? How can I prevent a mismatch at first render when the component is being loaded ?
Looks like you're not preloading the assents in you client.
This is also a required step to
avoid
thehydration mismatch
.Reason:
This issue is caused on your client because the initial request, your
chunks
were not loaded, so thehtml output
for those components would beloading...
instead of thecomponent content
itself. Only after the chunks are fetched and loaded that this initial stateloading...
will be replaced by the desired content.So,
Loadable.preloadReady
method creates aPromise
that will beresolved
once the application chunks were preloaded, in that way, having all assets needed for the initial stage,ReactDOM.hydrate
will generate the same output as your server did.TIP
Also I recommend you to take a look at
React Loadable SSR Add-on
, it is a very handyadd-on
that will enhance your server side assets management, giving you the same benefits as it was CSR (Client Side Render).See https://github.com/themgoncalves/react-loadable-ssr-addon