This repository has been archived by the owner on Aug 13, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathserver.js
83 lines (69 loc) · 2.25 KB
/
server.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import path from 'path'
import express from 'express'
import React from 'react'
import Helmet from 'react-helmet'
import { renderToString } from 'react-dom/server'
import { Provider } from 'react-redux'
import { match, RouterContext } from 'react-router'
import createLocation from 'history/lib/createLocation'
import getComponentData from './src/server/lib/getComponentData'
import routes from 'routes'
import configureStore from 'store'
const server = express()
const isDevelopment = (process.env.NODE_ENV !== 'production')
if (isDevelopment) {
require('./webpack.development').default(server)
}
server
.set('views', path.join(__dirname, 'src/server/views'))
.set('view engine', 'ejs')
.use(express.static(path.join(__dirname, '')))
server.use((request, response) => {
if (isDevelopment) {
global.webpackIsomorphicTools.refresh()
}
const location = createLocation(request.url)
match({ routes, location }, (error, redirectLocation, renderProps) => {
if (error) {
console.error(error)
return response.status(500).end('Internal server error')
} else if (redirectLocation) {
response.redirect(302, redirectLocation.pathname + redirectLocation.search)
} else if (!renderProps) {
return response.status(404).end('Not found')
}
const store = configureStore()
function renderView () {
const assets = global.webpackIsomorphicTools.assets()
const stylesheet = assets.styles.app
const javascripts = {
app: assets.javascript.app,
vendors: assets.javascript.vendors
}
const InitialView = (
<Provider store={store}>
<RouterContext {...renderProps} />
</Provider>
)
const componentHTML = renderToString(InitialView)
const head = Helmet.rewind()
const initialState = JSON.stringify(store.getState())
response.render('index', {
componentHTML,
head,
initialState,
stylesheet,
javascripts
}, (error, html) => {
if (error) {
response.end(error.message)
} else {
response.end(html)
}
})
}
getComponentData(store.dispatch, renderProps.components, renderProps.params)
.then((response) => renderView())
})
})
export default server