Add Server and Client renderer

This commit is contained in:
Jerko Steiner 2019-01-18 20:56:41 +01:00
parent 953b8f4abb
commit b8961a0308
7 changed files with 96 additions and 24 deletions

View File

@ -1,25 +1,27 @@
import ReactDOM from 'react-dom'
import React from 'react'
import {CComponent} from './components/Component'
import {Provider} from 'react-redux'
import {createStore} from './store'
export * from './renderer'
const state = (window as any).__PRELOADED_STATE__
// import ReactDOM from 'react-dom'
// import React from 'react'
// import {CComponent} from './components/Component'
// import {Provider} from 'react-redux'
// import {createStore} from './store'
if (state) {
const store = createStore(state)
ReactDOM.hydrate(
<Provider store={store}>
<CComponent />
</Provider>,
document.body,
)
} else {
const store = createStore()
ReactDOM.render(
<Provider store={store}>
<CComponent />
</Provider>,
document.body,
)
}
// const state = (window as any).__PRELOADED_STATE__
// if (state) {
// const store = createStore(state)
// ReactDOM.hydrate(
// <Provider store={store}>
// <CComponent />
// </Provider>,
// document.body,
// )
// } else {
// const store = createStore()
// ReactDOM.render(
// <Provider store={store}>
// <Component />
// </Provider>,
// document.body,
// )
// }

View File

@ -0,0 +1,37 @@
import ReactDOM from 'react-dom'
import React, {Component} from 'react'
import {Provider} from 'react-redux'
import {IStoreFactory} from './IStoreFactory'
import {IRenderer} from './IRenderer'
export class ClientRenderer implements IRenderer {
constructor(
readonly createStore: IStoreFactory,
readonly Component: Component,
readonly target = document.body,
) {}
render() {
const state = (window as any).__PRELOADED_STATE__
const {Component} = this
if (state) {
const store = this.createStore(state)
ReactDOM.hydrate(
<Provider store={store}>
<Component />
</Provider>,
this.target,
)
} else {
const store = this.createStore()
ReactDOM.render(
<Provider store={store}>
<Component />
</Provider>,
this.target,
)
}
}
}

View File

@ -0,0 +1,3 @@
export interface IRenderer {
render(): any
}

View File

@ -0,0 +1,4 @@
import {Store} from 'redux'
// TODO maybe Store should also be typed
export type IStoreFactory<T> = (state?: T) => Store

View File

@ -0,0 +1,20 @@
import {IRenderer} from './IRenderer'
import {renderToNodeStream} from 'react-dom/server'
export class ServerRenderer implements IRenderer {
constructor(
readonly createStore: IStoreFactory,
readonly Component: Component,
) {}
render() {
const {Component} = this
const store = this.createStore(state)
const stream = renderToNodeStream(
<Provider store={store}>
<Component />
</Provider>,
)
return stream
}
}

View File

@ -0,0 +1,4 @@
export * from './ClientRenderer'
export * from './IRenderer'
export * from './IStoreFactory'
export * from './ServerRenderer'

View File

@ -33,5 +33,7 @@
"typeorm": "^0.2.11",
"uuid": "^3.3.2",
"winston": "^3.1.0"
}
},
"main": "src/index.js",
"types": "src/index.d.ts"
}