Add Server and Client renderer
This commit is contained in:
parent
953b8f4abb
commit
b8961a0308
@ -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,
|
||||
// )
|
||||
// }
|
||||
|
||||
37
packages/client/src/renderer/ClientRenderer.tsx
Normal file
37
packages/client/src/renderer/ClientRenderer.tsx
Normal 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,
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
3
packages/client/src/renderer/IRenderer.ts
Normal file
3
packages/client/src/renderer/IRenderer.ts
Normal file
@ -0,0 +1,3 @@
|
||||
export interface IRenderer {
|
||||
render(): any
|
||||
}
|
||||
4
packages/client/src/renderer/IStoreFactory.ts
Normal file
4
packages/client/src/renderer/IStoreFactory.ts
Normal file
@ -0,0 +1,4 @@
|
||||
import {Store} from 'redux'
|
||||
|
||||
// TODO maybe Store should also be typed
|
||||
export type IStoreFactory<T> = (state?: T) => Store
|
||||
20
packages/client/src/renderer/ServerRenderer.tsx
Normal file
20
packages/client/src/renderer/ServerRenderer.tsx
Normal 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
|
||||
}
|
||||
}
|
||||
4
packages/client/src/renderer/index.ts
Normal file
4
packages/client/src/renderer/index.ts
Normal file
@ -0,0 +1,4 @@
|
||||
export * from './ClientRenderer'
|
||||
export * from './IRenderer'
|
||||
export * from './IStoreFactory'
|
||||
export * from './ServerRenderer'
|
||||
@ -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"
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user