Skip to content

Commit a55bcb8

Browse files
committed
Lesson 13 Final
1 parent 9bca0e5 commit a55bcb8

File tree

5 files changed

+94
-23
lines changed

5 files changed

+94
-23
lines changed

index.js

+6-17
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,10 @@
11
import React from 'react'
22
import { render } from 'react-dom'
3-
import { Router, Route, browserHistory, IndexRoute } from 'react-router'
4-
import App from './modules/App'
5-
import About from './modules/About'
6-
import Repos from './modules/Repos'
7-
import Repo from './modules/Repo'
8-
import Home from './modules/Home'
3+
import { Router, browserHistory } from 'react-router'
4+
import routes from './modules/routes'
95

10-
render((
11-
<Router history={browserHistory}>
12-
<Route path="/" component={App}>
13-
<IndexRoute component={Home}/>
14-
<Route path="/repos" component={Repos}>
15-
<Route path="/repos/:userName/:repoName" component={Repo}/>
16-
</Route>
17-
<Route path="/about" component={About}/>
18-
</Route>
19-
</Router>
20-
), document.getElementById('app'))
6+
render(
7+
<Router routes={routes} history={browserHistory}/>,
8+
document.getElementById('app')
9+
)
2110

modules/routes.js

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import React from 'react'
2+
import { Router, Route, browserHistory, IndexRoute } from 'react-router'
3+
import App from './App'
4+
import About from './About'
5+
import Repos from './Repos'
6+
import Repo from './Repo'
7+
import Home from './Home'
8+
9+
module.exports = (
10+
<Route path="/" component={App}>
11+
<IndexRoute component={Home}/>
12+
<Route path="/repos" component={Repos}>
13+
<Route path="/repos/:userName/:repoName" component={Repo}/>
14+
</Route>
15+
<Route path="/about" component={About}/>
16+
</Route>
17+
)

package.json

+4-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@
66
"scripts": {
77
"start": "if-env NODE_ENV=production && npm run start:prod || npm run start:dev",
88
"start:dev": "webpack-dev-server --inline --content-base public/ --history-api-fallback",
9-
"start:prod": "webpack && node server.js"
9+
"start:prod": "npm run build && node server.bundle.js",
10+
"build:client": "webpack",
11+
"build:server": "webpack --config webpack.server.config.js",
12+
"build": "npm run build:client && npm run build:server"
1013
},
1114
"author": "",
1215
"license": "ISC",

server.js

+33-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
1-
var express = require('express')
2-
var path = require('path')
3-
var compression = require('compression')
1+
import express from 'express'
2+
import path from 'path'
3+
import compression from 'compression'
4+
import React from 'react'
5+
import { renderToString } from 'react-dom/server'
6+
import { match, RouterContext } from 'react-router'
7+
import routes from './modules/routes'
48

59
var app = express()
610

@@ -10,10 +14,34 @@ app.use(compression())
1014
app.use(express.static(path.join(__dirname, 'public')))
1115

1216
// send all requests to index.html so browserHistory works
13-
app.get('*', function (req, res) {
14-
res.sendFile(path.join(__dirname, 'public', 'index.html'))
17+
app.get('*', (req, res) => {
18+
match({ routes, location: req.url }, (err, redirect, props) => {
19+
if (err) {
20+
res.status(500).send(err.message)
21+
} else if (redirect) {
22+
res.redirect(redirect.pathname + redirect.search)
23+
} else if (props) {
24+
// hey we made it!
25+
const appHtml = renderToString(<RouterContext {...props}/>)
26+
res.send(renderPage(appHtml))
27+
} else {
28+
res.status(404).send('Not Found')
29+
}
30+
})
1531
})
1632

33+
function renderPage(appHtml) {
34+
return `
35+
<!doctype html public="storage">
36+
<html>
37+
<meta charset=utf-8/>
38+
<title>My First React Router App</title>
39+
<link rel=stylesheet href=/index.css>
40+
<div id=app>${appHtml}</div>
41+
<script src="/bundle.js"></script>
42+
`
43+
}
44+
1745
var PORT = process.env.PORT || 8080
1846
app.listen(PORT, function() {
1947
console.log('Production Express server running at localhost:' + PORT)

webpack.server.config.js

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
var fs = require('fs')
2+
var path = require('path')
3+
4+
module.exports = {
5+
6+
entry: path.resolve(__dirname, 'server.js'),
7+
8+
output: {
9+
filename: 'server.bundle.js'
10+
},
11+
12+
target: 'node',
13+
14+
// keep node_module paths out of the bundle
15+
externals: fs.readdirSync(path.resolve(__dirname, 'node_modules')).concat([
16+
'react-dom/server'
17+
]).reduce(function (ext, mod) {
18+
ext[mod] = 'commonjs ' + mod
19+
return ext
20+
}, {}),
21+
22+
node: {
23+
__filename: true,
24+
__dirname: true
25+
},
26+
27+
module: {
28+
loaders: [
29+
{ test: /\.js$/, exclude: /node_modules/, loader: 'babel-loader?presets[]=es2015&presets[]=react' }
30+
]
31+
}
32+
33+
}
34+

0 commit comments

Comments
 (0)