Почитайте любую тематическую статью на эту тему.
1. В самом простом случае у вас две точки входа server(с ReactDOMServer.renderToString) и client(c ReactDOM.hydrate).
2. State можно получать на сервере и передавать на клиент, примерно, так:
<script>window.__INITIAL_STATE__ = json.stringify(initialState);</ script>
В configureStore:
export = function (initialState: {} = {}) {
if (__CLIENT__) {
initialState = JSON.parse(JSON.stringify(window.__INITIAL_STATE__));
}
return createStore(combineReducers({ ...rootReducer }), initialState, enhancer);
}
3. Никаких глобальных переменных для состояний изменяющихся от клиента к клиенту(локали, темы и прочее). Node обрабатывает множество запросов одновременно и информация клиентов при передаче конфигураций в глобальные модули или при использовании глобальных состояний может перемешаться.
4. Получение данных на сервере и клиенте тот еще головняк. Посмотрите как реализована библиотека react-frontload.