Примерно так:
import React from 'react';
import { StaticRouter } from 'react-router'
import { Provider } from 'react-redux'
import ReactDOMServer from 'react-dom/server';
import Store from './store';
export default (Url, Component, Props = {}, Context = {}) => {
return ReactDOMServer.renderToString(
<Provider store={Store}>
<StaticRouter
location={Url}
context={Context}>
<Component {...Props}/>
</StaticRouter>
</Provider>
);
}
import reactRenderToString from './reactRenderToString'
import Component from '../client/routes/Home.jsx';
console.log(reactRenderToString('/', Component))
На выходе Html строка размеченная реактом, вставляем её в #app средствами шаблонизатора или что у вас, загружается страничка, скрипты, реакт подхватывает размеченный html и навешивает обработчики. P.S стоит быть внимательным с различными библиотеками на клиенте, т.к многий говно код (в том числе и наш) не дает сборщику собрать мусор и каждый наш рендер может валяться в памяти пока не вывалится...