Skip to content

Commit 72e741c

Browse files
Merge pull request #73 from kiki-le-singe/implement_react_router_4
Implement react router 4
2 parents 3ed7c1d + 8f741cf commit 72e741c

File tree

20 files changed

+205
-195
lines changed

20 files changed

+205
-195
lines changed

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -137,14 +137,14 @@ You should just install an extension [Redux DevTools Extension](https://github.c
137137
Personally I use [Redux DevTools for Chrome](https://chrome.google.com/webstore/detail/redux-devtools/lmhkpmbekcpmknklioeibfkpmmfibljd)
138138

139139
> Are there any other alternatives? Sure!
140-
> You can also use [Redux DevTools](https://github.com/gaearon/redux-devtools). And there is also a small logger middleware `(~/src/common/redux/middleware/logger)` to log all actions and states after they are dispatched.
140+
> You can also use [Redux DevTools](https://github.com/gaearon/redux-devtools). And there is also a small logger middleware [`redux-logger`](https://github.com/evgenyrodionov/redux-logger) to log all actions and states after they are dispatched.
141141
142142

143143
## Features
144144
* [react](https://github.com/facebook/react)
145145
* [redux](https://github.com/reactjs/redux)
146146
* [redux-devtools-extension](https://github.com/zalmoxisus/redux-devtools-extension)
147-
* [react-router](https://github.com/reactjs/react-router)
147+
* [react-router 4](https://github.com/reactjs/react-router)
148148
* [react-router-redux](https://github.com/reactjs/react-router-redux)
149149
* [react-helmet](https://github.com/nfl/react-helmet)
150150
* [React Hot Loader 3](https://github.com/gaearon/react-hot-loader)
@@ -176,7 +176,7 @@ Personally I use [Redux DevTools for Chrome](https://chrome.google.com/webstore/
176176
* [why-did-you-update](https://github.com/garbles/why-did-you-update)
177177
* [babel-preset-latest](https://babeljs.io/docs/plugins/preset-latest/)
178178
* Backend bundle with webpack
179-
* Code Splitting
179+
* Code Splitting ( ** for now doesn't work with React Router 4. You can use an old version of this starter [`2.0.5`](https://github.com/kiki-le-singe/react-redux-universal-boilerplate/releases/tag/2.0.5) **)
180180

181181

182182
## Styles

package.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
"extract-text-webpack-plugin": "^2.1.0",
5757
"fs-extra": "^3.0.0",
5858
"globby": "^6.1.0",
59+
"history": "^4.6.1",
5960
"inquirer": "^3.0.6",
6061
"ip": "^1.1.5",
6162
"koa": "^2.2.0",
@@ -76,9 +77,10 @@
7677
"react-helmet": "^5.0.3",
7778
"react-hot-loader": "^3.0.0-beta.6",
7879
"react-redux": "^5.0.4",
79-
"react-router": "^3.0.2",
80-
"react-router-redux": "^4.0.8",
80+
"react-router-dom": "^4.1.1",
81+
"react-router-redux": "next",
8182
"redux": "^3.6.0",
83+
"redux-logger": "^3.0.1",
8284
"serialize-javascript": "^1.3.0",
8385
"source-map-support": "^0.4.15",
8486
"webpack": "^2.4.1",

readyToDeploy/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@
2222
"react-dom": "^15.5.4",
2323
"react-helmet": "^5.0.3",
2424
"react-redux": "^5.0.4",
25-
"react-router": "^3.0.2",
26-
"react-router-redux": "^4.0.8",
25+
"react-router-dom": "^4.1.1",
26+
"react-router-redux": "next",
2727
"redux": "^3.6.0",
2828
"serialize-javascript": "^1.3.0",
2929
"source-map-support": "^0.4.15"

readyToDeploy/yarn.lock

Lines changed: 53 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -145,24 +145,18 @@ dashify@^0.2.0:
145145
version "0.2.2"
146146
resolved "https://registry.yarnpkg.com/dashify/-/dashify-0.2.2.tgz#6a07415a01c91faf4a32e38d9dfba71f61cb20fe"
147147

148-
debug@*, debug@^2.6.0:
149-
version "2.6.3"
150-
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.3.tgz#0f7eb8c30965ec08c72accfa0130c8b79984141d"
148+
debug@*, debug@^2.6.0, debug@^2.6.6:
149+
version "2.6.6"
150+
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.6.tgz#a9fa6fbe9ca43cf1e79f73b75c0189cbb7d6db5a"
151151
dependencies:
152-
ms "0.7.2"
152+
ms "0.7.3"
153153

154154
debug@2.6.1:
155155
version "2.6.1"
156156
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.1.tgz#79855090ba2c4e3115cc7d8769491d58f0491351"
157157
dependencies:
158158
ms "0.7.2"
159159

160-
debug@^2.6.6:
161-
version "2.6.6"
162-
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.6.tgz#a9fa6fbe9ca43cf1e79f73b75c0189cbb7d6db5a"
163-
dependencies:
164-
ms "0.7.3"
165-
166160
decamelize@^1.0.0:
167161
version "1.2.0"
168162
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
@@ -292,13 +286,14 @@ hide-powered-by@1.0.0:
292286
version "1.0.0"
293287
resolved "https://registry.yarnpkg.com/hide-powered-by/-/hide-powered-by-1.0.0.tgz#4a85ad65881f62857fc70af7174a1184dccce32b"
294288

295-
history@^3.0.0:
296-
version "3.3.0"
297-
resolved "https://registry.yarnpkg.com/history/-/history-3.3.0.tgz#fcedcce8f12975371545d735461033579a6dae9c"
289+
history@^4.5.1, history@^4.6.0:
290+
version "4.6.1"
291+
resolved "https://registry.yarnpkg.com/history/-/history-4.6.1.tgz#911cf8eb65728555a94f2b12780a0c531a14d2fd"
298292
dependencies:
299293
invariant "^2.2.1"
300294
loose-envify "^1.2.0"
301-
query-string "^4.2.2"
295+
resolve-pathname "^2.0.0"
296+
value-equal "^0.2.0"
302297
warning "^3.0.0"
303298

304299
hoist-non-react-statics@^1.0.3, hoist-non-react-statics@^1.2.0:
@@ -375,7 +370,7 @@ inherits@2.0.3:
375370
version "2.0.3"
376371
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
377372

378-
invariant@^2.0.0, invariant@^2.2.1:
373+
invariant@^2.0.0, invariant@^2.2.1, invariant@^2.2.2:
379374
version "2.2.2"
380375
resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360"
381376
dependencies:
@@ -397,6 +392,10 @@ is-stream@^1.0.1:
397392
version "1.1.0"
398393
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
399394

395+
isarray@0.0.1:
396+
version "0.0.1"
397+
resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
398+
400399
isomorphic-fetch@^2.1.1:
401400
version "2.2.1"
402401
resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9"
@@ -551,7 +550,7 @@ longest@^1.0.1:
551550
version "1.0.1"
552551
resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
553552

554-
loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0:
553+
loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1:
555554
version "1.3.1"
556555
resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848"
557556
dependencies:
@@ -646,6 +645,12 @@ path-is-absolute@1.0.1:
646645
version "1.0.1"
647646
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
648647

648+
path-to-regexp@^1.5.3:
649+
version "1.7.0"
650+
resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d"
651+
dependencies:
652+
isarray "0.0.1"
653+
649654
platform@1.3.3:
650655
version "1.3.3"
651656
resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.3.tgz#646c77011899870b6a0903e75e997e8e51da7461"
@@ -662,13 +667,6 @@ prop-types@^15.0.0, prop-types@^15.5.4, prop-types@^15.5.7, prop-types@~15.5.7:
662667
dependencies:
663668
fbjs "^0.8.9"
664669

665-
query-string@^4.2.2:
666-
version "4.3.2"
667-
resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.2.tgz#ec0fd765f58a50031a3968c2431386f8947a5cdd"
668-
dependencies:
669-
object-assign "^4.1.0"
670-
strict-uri-encode "^1.0.0"
671-
672670
react-dom@^15.5.4:
673671
version "15.5.4"
674672
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-15.5.4.tgz#ba0c28786fd52ed7e4f2135fe0288d462aef93da"
@@ -699,18 +697,33 @@ react-redux@^5.0.4:
699697
loose-envify "^1.1.0"
700698
prop-types "^15.0.0"
701699

702-
react-router-redux@^4.0.8:
703-
version "4.0.8"
704-
resolved "https://registry.yarnpkg.com/react-router-redux/-/react-router-redux-4.0.8.tgz#227403596b5151e182377dab835b5d45f0f8054e"
700+
react-router-dom@^4.1.1:
701+
version "4.1.1"
702+
resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-4.1.1.tgz#3021ade1f2c160af97cf94e25594c5f294583025"
703+
dependencies:
704+
history "^4.5.1"
705+
loose-envify "^1.3.1"
706+
prop-types "^15.5.4"
707+
react-router "^4.1.1"
705708

706-
react-router@^3.0.2:
707-
version "3.0.2"
708-
resolved "https://registry.yarnpkg.com/react-router/-/react-router-3.0.2.tgz#5a19156678810e01d81901f9c0fef63284b8a514"
709+
react-router-redux@next:
710+
version "5.0.0-alpha.6"
711+
resolved "https://registry.yarnpkg.com/react-router-redux/-/react-router-redux-5.0.0-alpha.6.tgz#7418663c2ecd3c51be856fcf28f3d1deecc1a576"
712+
dependencies:
713+
history "^4.5.1"
714+
prop-types "^15.5.4"
715+
react-router "^4.1.1"
716+
717+
react-router@^4.1.1:
718+
version "4.1.1"
719+
resolved "https://registry.yarnpkg.com/react-router/-/react-router-4.1.1.tgz#d448f3b7c1b429a6fbb03395099949c606b1fe95"
709720
dependencies:
710-
history "^3.0.0"
721+
history "^4.6.0"
711722
hoist-non-react-statics "^1.2.0"
712-
invariant "^2.2.1"
713-
loose-envify "^1.2.0"
723+
invariant "^2.2.2"
724+
loose-envify "^1.3.1"
725+
path-to-regexp "^1.5.3"
726+
prop-types "^15.5.4"
714727
warning "^3.0.0"
715728

716729
react-side-effect@^1.1.0:
@@ -761,6 +774,10 @@ resolve-path@^1.3.1:
761774
http-errors "~1.5.0"
762775
path-is-absolute "1.0.1"
763776

777+
resolve-pathname@^2.0.0:
778+
version "2.1.0"
779+
resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-2.1.0.tgz#e8358801b86b83b17560d4e3c382d7aef2100944"
780+
764781
right-align@^0.1.1:
765782
version "0.1.3"
766783
resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
@@ -803,10 +820,6 @@ source-map@0.5.x, source-map@^0.5.6, source-map@~0.5.1:
803820
version "1.3.1"
804821
resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e"
805822

806-
strict-uri-encode@^1.0.0:
807-
version "1.1.0"
808-
resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
809-
810823
symbol-observable@^1.0.2:
811824
version "1.0.4"
812825
resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.4.tgz#29bf615d4aa7121bdd898b22d4b3f9bc4e2aa03d"
@@ -858,6 +871,10 @@ utils-merge@1.0.0:
858871
version "1.0.0"
859872
resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8"
860873

874+
value-equal@^0.2.0:
875+
version "0.2.1"
876+
resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-0.2.1.tgz#c220a304361fce6994dbbedaa3c7e1a1b895871d"
877+
861878
vary@^1.0.0:
862879
version "1.1.0"
863880
resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.0.tgz#e1e5affbbd16ae768dd2674394b9ad3022653140"

src/client/index.js

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,35 @@
11
import React from 'react'
22
import { render, unmountComponentAtNode } from 'react-dom'
3+
import createHistory from 'history/createBrowserHistory'
34
import { Provider } from 'react-redux'
4-
import { match, Router, browserHistory } from 'react-router'
5-
import { syncHistoryWithStore } from 'react-router-redux'
65
import { AppContainer } from 'react-hot-loader'
6+
import { ConnectedRouter } from 'react-router-redux'
7+
import AppLayout from 'common/layouts/AppLayout'
78
import configureStore from '../common/redux/store'
8-
import routes from '../common/routes'
99

1010
const preloadedState = window.__PRELOADED_STATE__
11-
const store = configureStore(preloadedState)
12-
const history = syncHistoryWithStore(browserHistory, store)
11+
// Create a history of your choosing (we're using a browser history in this case)
12+
const history = createHistory()
13+
const store = configureStore(history, preloadedState)
1314
const rootEl = document.getElementById('root')
1415

1516
const renderApp = () => {
16-
// Sync routes both on client and server
17-
match({ history, routes: routes(store) }, (error, redirectLocation, renderProps) => {
18-
render(
19-
<AppContainer>
20-
<Provider store={store}>
21-
<Router {...renderProps} />
22-
</Provider>
23-
</AppContainer>,
24-
rootEl,
25-
)
26-
})
17+
render(
18+
<AppContainer>
19+
<Provider store={store}>
20+
{ /* ConnectedRouter will use the store from Provider automatically */ }
21+
<ConnectedRouter history={history}>
22+
<AppLayout />
23+
</ConnectedRouter>
24+
</Provider>
25+
</AppContainer>,
26+
rootEl,
27+
)
2728
}
2829

2930
// Enable hot reload by react-hot-loader
3031
if (module.hot) {
31-
module.hot.accept('../common/routes', () => {
32+
module.hot.accept('common/layouts/AppLayout', () => {
3233
setImmediate(() => {
3334
// Preventing the hot reloading error from react-router
3435
unmountComponentAtNode(rootEl)

src/common/layouts/AppLayout/AppLayout.jsx

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
import React from 'react'
22
import PropTypes from 'prop-types'
3-
import { Link } from 'react-router'
3+
import { Link, Route, Switch } from 'react-router-dom'
44
import Helmet from 'react-helmet'
55

6+
import Home from 'common/views/HomeView'
7+
import HelloView from 'common/views/HelloView'
8+
import AboutView from 'common/views/AboutView'
9+
import CounterView from 'common/views/CounterView' // eslint-disable-line
10+
import NotFoundRouteView from 'common/views/NotFoundRouteView'
11+
612
import config from '../../config'
713

814
const propTypes = {
@@ -12,7 +18,7 @@ const defaultProps = {
1218
children: {}
1319
}
1420

15-
function AppLayout(props) {
21+
function AppLayout() {
1622
return (
1723
<div className="views">
1824
<Helmet {...config.app} />
@@ -26,7 +32,13 @@ function AppLayout(props) {
2632
<li><Link to="/counter">Counter</Link></li>
2733
</ul>
2834

29-
{props.children}
35+
<Switch>
36+
<Route exact path="/" component={Home} />
37+
<Route path="/hello" component={HelloView} />
38+
<Route path="/about" component={AboutView} />
39+
<Route path="/counter" component={CounterView} />
40+
<Route component={NotFoundRouteView} />
41+
</Switch>
3042
</div>
3143
)
3244
}

src/common/redux/middleware/logger.js

Lines changed: 0 additions & 22 deletions
This file was deleted.

src/common/redux/store/configureStoreDev.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
import { createStore, applyMiddleware, compose } from 'redux'
2+
import { routerMiddleware } from 'react-router-redux'
23

3-
import logger from '../middleware/logger'
4+
import logger from 'redux-logger'
45
import rootReducer from '../reducers'
56

6-
const configureStoreDev = (preloadedState = {}) => {
7+
const configureStoreDev = (history = {}, preloadedState = {}) => {
78
const store = createStore(
89
rootReducer,
910
preloadedState,
1011
compose(
11-
applyMiddleware(logger),
12+
applyMiddleware(logger, routerMiddleware(history)),
1213
(__CLIENT__ && window.devToolsExtension) ? window.devToolsExtension() : f => f
1314
))
1415

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,14 @@
1-
import { createStore } from 'redux'
1+
import { createStore, applyMiddleware, compose } from 'redux'
2+
import { routerMiddleware } from 'react-router-redux'
23

34
import rootReducer from '../reducers'
45

5-
const configureStoreProd = (preloadedState = {}) => createStore(rootReducer, preloadedState)
6+
const configureStoreProd = (history = {}, preloadedState = {}) => createStore(
7+
rootReducer,
8+
preloadedState,
9+
compose(
10+
applyMiddleware(routerMiddleware(history)),
11+
)
12+
)
613

714
export default configureStoreProd

src/common/routes/AboutRoute.js

Lines changed: 0 additions & 7 deletions
This file was deleted.

0 commit comments

Comments
 (0)