Skip to content

Commit 7508602

Browse files
author
ryanwest91
committed
finished
1 parent 4a3f96d commit 7508602

File tree

9 files changed

+156
-24
lines changed

9 files changed

+156
-24
lines changed

index.js

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,11 @@
22

33
import React from 'react'
44
import { render } from 'react-dom'
5-
import { Router, Route, browserHistory, IndexRoute } from 'react-router'
5+
import { Router, browserHistory } from 'react-router'
66

7-
import App from './modules/App'
8-
import About from './modules/About'
9-
import Repos from './modules/Repos'
10-
import Repo from './modules/Repo.js'
11-
import Home from './modules/Home.js'
7+
import routes from './modules/routes'
128

139
render((
14-
<Router history={browserHistory}>
15-
<Route path="/" component={App}>
16-
17-
<IndexRoute component={Home}/>
18-
19-
<Route path="/about" component={About}/>
20-
21-
<Route path="/repos" component={Repos}>
22-
<Route path="/repos/:userName/:repoName" component={Repo}/>
23-
</Route>
24-
25-
</Route>
26-
</Router>),
27-
document.getElementById('app')
10+
<Router routes={routes} history={browserHistory}/>,
11+
document.getElementById('app')
2812
)

modules/Repos.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,21 @@ import { Link } from 'react-router'
55
import NavLink from './NavLink.js'
66

77
export default React.createClass({
8+
9+
contextTypes: {
10+
router: React.PropTypes.object
11+
},
12+
13+
handleSubmit(event){
14+
event.preventDefault()
15+
const userName = event.target.elements[0].value
16+
const repo = event.target.elements[1].value
17+
const path = `/repos/${userName}/${repo}`
18+
// console.log(path)
19+
this.context.router.push(path)
20+
},
21+
22+
823
render(){
924
return(
1025

@@ -17,6 +32,14 @@ export default React.createClass({
1732
<li>
1833
<NavLink to="/repos/facebook/react">React</NavLink>
1934
</li>
35+
36+
<li>
37+
<form onSubmit={this.handleSubmit}>
38+
<input type="text" placeholder="userName"/> / {' '}
39+
<input type="text" placeholder="repo"/>{' '}
40+
<button type="submit">Go</button>
41+
</form>
42+
</li>
2043
</ul>
2144

2245
{this.props.children}

modules/routes.js

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

package_exchange.json

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,20 @@
44
"description": "",
55
"main": "index.js",
66
"scripts": {
7-
"start": "webpack-dev-server --inline --content-base ."
7+
"start": "if-env NODE_ENV=production && npm run start:prod || npm run start:dev",
8+
"start:dev": "webpack-dev-server --inline --content-base . --history-api-fallback",
9+
"start:prod": "webpack && node server.js"
810
},
911
"author": "",
1012
"license": "ISC",
1113
"dependencies": {
1214
"react": "0.14.7",
1315
"react-dom": "0.14.7",
1416
"babel-runtime": "~6.2.4",
15-
"lodash": "~3.4.0"
17+
"lodash": "~3.4.0",
18+
"compression": "~1.6.1",
19+
"if-env": "~1.0.0",
20+
"express": "~4.13.4"
1621
},
1722
"devDependencies": {
1823
"webpack": "^1.14.1",
File renamed without changes.
File renamed without changes.

server.js

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import React from 'react'
2+
// we'll use this to render our app to an html string
3+
import { renderToString } from 'react-dom/server'
4+
// and these to match the url to routes and then render
5+
import { match, RouterContext } from 'react-router'
6+
import routes from './modules/routes'
7+
8+
var express = require('express')
9+
var path = require('path')
10+
var compression = require('compression')
11+
12+
var app = express()
13+
14+
app.use(compression())
15+
// serve static stuff
16+
app.use(express.static(path.join(__dirname, 'public')))
17+
18+
//send all requests to index.html
19+
app.get('*', (req, res) => {
20+
21+
match({routes: routes, location: req.url }, (err, redirect, props) => {
22+
match({ routes: routes, location: req.url }, (err, redirect, props) => {
23+
// in here we can make some decisions all at once
24+
if (err) {
25+
// there was an error somewhere during route matching
26+
res.status(500).send(err.message)
27+
} else if (redirect) {
28+
// we haven't talked about `onEnter` hooks on routes, but before a
29+
// route is entered, it can redirect. Here we handle on the server.
30+
res.redirect(redirect.pathname + redirect.search)
31+
} else if (props) {
32+
// if we got props then we matched a route and can render
33+
const appHtml = renderToString(<RouterContext {...props}/>)
34+
res.send(renderPage(appHtml))
35+
} else {
36+
// no errors, no redirect, we just didn't match anything
37+
res.status(404).send('Not Found')
38+
}
39+
})
40+
})
41+
42+
})
43+
44+
function renderPage(appHtml) {
45+
return `
46+
<!doctype html public="storage">
47+
<html>
48+
<meta charset=utf-8/>
49+
<title>My First React Router App</title>
50+
<link rel=stylesheet href=/index.css>
51+
<div id=app>${appHtml}</div>
52+
<script src="/bundle.js"></script>
53+
`
54+
}
55+
56+
var PORT = process.env.PORT || 8080
57+
app.listen(PORT, function(){
58+
59+
console.log('Production Express server running at localhost:' + PORT)
60+
})

webpack.config.js

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,24 @@
1+
var webpack = require('webpack')
2+
3+
14
module.exports = {
25
entry: './index.js',
36

47
output: {
58
filename: 'bundle.js',
6-
publicPath: ''
9+
path: 'public'
710
},
811

912
module: {
1013
loaders: [
1114
{ test: /\.js$/, exclude: /node_modules/, loader: 'babel-loader?presets[]=es2015&presets[]=react' }
1215
]
13-
}
16+
},
17+
18+
plugins: process.env.NODE_ENV === 'production' ? [
19+
new webpack.optimize.DedupePlugin(),
20+
new webpack.optimize.OccurenceOrderPlugin(),
21+
new webpack.optimize.UglifyJsPlugin()
22+
] : []
1423
}
1524

webpack.server.config.js

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
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+
}

0 commit comments

Comments
 (0)