redux-persist icon indicating copy to clipboard operation
redux-persist copied to clipboard

PersistGate in SSR applications rendering app twice when using React v18

Open semajtwin opened this issue 2 years ago • 3 comments

I am currently working on updating a Next.js SSR application from v12 to v13. Next.js v13 requires a minimum React version of 18.2.0. Upon running the application the page rendered the application twice.

From my investigation I found that rendering the application twice is happening when using PersistGate with React v18. Whilst I found the issue in a Next.js application, I managed to replicate the same issue using React with SSR as seen below:


Here are two examples which replicate the issue using plain React with SSR:

Both examples have the following implementation:

server/server.js: renders App component wrapped with react-redux's Provider

${ReactDOMServer.renderToString(
   <Provider store={store}>
      <p>Server</p>
      <App />
   </Provider>
)}

src/index.js: renders App component wrapped with react-redux's Provider and redux-persist's PersistGate

ReactDOM.hydrate(
  <Provider store={store}>
    <PersistGate loading={null} persistor={persistor}>
      <p>Client</p>
      <App />
    </PersistGate>
  </Provider>,
  document.getElementById('root')
);

Workarounds found

Two workarounds I found on this GitHub issue:

Both solved the rendering issue however the persist/REHYDRATE action is not triggered straight after persist/PERSIST action, I fear this would lead to other issues upon initialising the application.

Normal Behaviour:

- persist/PERSIST
- persist/REHYDRATE
- [APP ACTIONS] ...
- ...

Delayed Rehydration:

- persist/PERSIST
- [APP ACTIONS] 
- ...
- persist/REHYDRATE
- [APP ACTIONS] ...
- ...

It may be that the setup is incorrect. However, I think that the fact that using React v17 works as expected, does point to an issue when using PersistGate with React v18.

Is this a known issue with React v18? Any possible solutions for SSR applications please?

semajtwin avatar Sep 16 '23 12:09 semajtwin

I don't think this library is very maintained, and it doesn't work great with Next.

I'm finding it's forcing me into CSR rendering, which may be related to this

haveamission avatar Oct 19 '23 22:10 haveamission

@semajtwin did you ever end up figuring out a solution to this?

NRoos avatar Nov 20 '23 16:11 NRoos

Hi @NRoos, unfortunately not yet :/

semajtwin avatar Nov 20 '23 16:11 semajtwin