From 7b682c745c05734c79e23b28a41703feac1770ae Mon Sep 17 00:00:00 2001 From: Jerko Steiner Date: Sat, 16 Mar 2019 12:31:14 +0500 Subject: [PATCH] Fix react-router-dom for server-side rendering --- packages/client/src/renderer/ClientRenderer.tsx | 15 +++++++++++++-- packages/client/src/renderer/IRenderer.ts | 2 +- packages/client/src/renderer/ServerRenderer.tsx | 8 ++++++-- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/packages/client/src/renderer/ClientRenderer.tsx b/packages/client/src/renderer/ClientRenderer.tsx index 74ba835..886fb8a 100644 --- a/packages/client/src/renderer/ClientRenderer.tsx +++ b/packages/client/src/renderer/ClientRenderer.tsx @@ -5,6 +5,8 @@ import {IClientConfig} from './IClientConfig' import {IRenderer} from './IRenderer' import {IStoreFactory} from './IStoreFactory' import {Provider} from 'react-redux' +import {Router} from 'react-router-dom' +import {createBrowserHistory} from 'history' export interface IClientRendererParams { readonly createStore: IStoreFactory, @@ -16,6 +18,7 @@ export class ClientRenderer implements IRenderer { constructor(readonly params: IClientRendererParams) {} render( + url: string, config = (window as any).__APP_CONFIG__ as IClientConfig, state = (window as any).__PRELOADED_STATE__, ) { @@ -25,11 +28,17 @@ export class ClientRenderer implements IRenderer { target = document.getElementById('container'), } = this.params + const history = createBrowserHistory({ + basename: config.baseUrl, + }) + if (state) { const store = createStore(state) ReactDOM.hydrate( - + + + , target, ) @@ -37,7 +46,9 @@ export class ClientRenderer implements IRenderer { const store = createStore() ReactDOM.render( - + + + , target, ) diff --git a/packages/client/src/renderer/IRenderer.ts b/packages/client/src/renderer/IRenderer.ts index c73529c..e82c5f9 100644 --- a/packages/client/src/renderer/IRenderer.ts +++ b/packages/client/src/renderer/IRenderer.ts @@ -1,5 +1,5 @@ import {IClientConfig} from './IClientConfig' export interface IRenderer { - render(config: IClientConfig, state?: any): any + render(url: string, config: IClientConfig, state?: any): any } diff --git a/packages/client/src/renderer/ServerRenderer.tsx b/packages/client/src/renderer/ServerRenderer.tsx index 6a9370f..5ed514f 100644 --- a/packages/client/src/renderer/ServerRenderer.tsx +++ b/packages/client/src/renderer/ServerRenderer.tsx @@ -4,6 +4,7 @@ import {IClientConfig} from './IClientConfig' import {IRenderer} from './IRenderer' import {IStoreFactory} from './IStoreFactory' import {Provider} from 'react-redux' +import {StaticRouter} from 'react-router-dom' import {renderToNodeStream} from 'react-dom/server' export class ServerRenderer implements IRenderer { @@ -11,13 +12,16 @@ export class ServerRenderer implements IRenderer { readonly createStore: IStoreFactory, readonly RootComponent: React.ComponentType<{config: IClientConfig}>, ) {} - render(config: IClientConfig, state?: any) { + render(url: string, config: IClientConfig, state?: any) { const {RootComponent} = this const store = this.createStore(state) + const context = {} const stream = renderToNodeStream( - + + + , ) return stream