rwr-react_router 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +2 -0
- data/CHANGELOG.md +4 -0
- data/README.md +30 -0
- data/Rakefile +9 -1
- data/js/src/index.js +36 -3
- data/js/src/version.js +1 -1
- data/lib/react_webpack_rails/react_router_integration/version.rb +1 -1
- data/lib/react_webpack_rails/react_router_integration/view_helpers.rb +31 -2
- data/package.json +3 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a82a539d7fa4cc94968d47f181921640262c3e0b
|
4
|
+
data.tar.gz: 01711290a407177f24f836f001b5b356a0cde023
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1f2e3315b1944e2fa4f67672d72ba6c5af94e9680cc87f60ef53028edfe6ce8930db12f86ab1f3427057942f5e8627d701dc0d8e1697c87efeb6485b41b7e0b3
|
7
|
+
data.tar.gz: 125f5b0ac9cebb1f68031efa3d012827c553a0edfd1ce71a6f26a9cd6f797659d935325a024f2a49ac18f49fec9d0db08146220c5349398949441db38d5bb4ce
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -24,6 +24,13 @@ $ npm install --save rwr-react-router
|
|
24
24
|
import RWRReactRouter from 'rwr-react-router';
|
25
25
|
```
|
26
26
|
|
27
|
+
* Register integration in RWR using RWR's IntegrationsManager manager:
|
28
|
+
|
29
|
+
```js
|
30
|
+
import { integrationsManager } from 'react-webpack-rails';
|
31
|
+
integrationsManager.register('react-router', RWRReactRouter.integrationWrapper);
|
32
|
+
```
|
33
|
+
|
27
34
|
* Register one of your routers:
|
28
35
|
```js
|
29
36
|
RWRReactRouter.register('MyRouter', MyRouter);
|
@@ -52,6 +59,29 @@ function RouterWithProps(props) {
|
|
52
59
|
|
53
60
|
Props passed to route will be available under `props.route.yourName`.
|
54
61
|
|
62
|
+
### Server side rendering.
|
63
|
+
To make router work server-side it need to work on browserHistory. Otherwise, rails don't have access to current route in request. This can be achieved by adding wildcard route to rails routes:
|
64
|
+
```ruby
|
65
|
+
get '/server_side/' => 'pages#server_side'
|
66
|
+
get '/server_side/*path' => 'pages#server_side'
|
67
|
+
```
|
68
|
+
and setting browserHistory for router:
|
69
|
+
```js
|
70
|
+
<Router history={browserHistory}>
|
71
|
+
<Route path="/server_side" component={App}>
|
72
|
+
...
|
73
|
+
</Route>
|
74
|
+
</Router>
|
75
|
+
```
|
76
|
+
**note:** react router will analyze whole path so don't forget to add rails path part to it.
|
77
|
+
|
78
|
+
With valid setup simply enable server side by passing `server_side: true` flag in options:
|
79
|
+
```erb
|
80
|
+
<%= react_router('MyRouter', { foo: :bar }, server_side: true) %>
|
81
|
+
```
|
82
|
+
|
83
|
+
**note:** rwr-react_router automatically handles matching, redirects and routing errors. Redirects and 404's are passed to Rails and handled there so you will be redirect or get 404 page like in normal Rails app.
|
84
|
+
|
55
85
|
## Contributing
|
56
86
|
## Issues
|
57
87
|
|
data/Rakefile
CHANGED
@@ -16,10 +16,18 @@ namespace :test do
|
|
16
16
|
task :gem do
|
17
17
|
sh %Q(bundle exec rspec spec/rwr-react_router.rb)
|
18
18
|
end
|
19
|
+
|
19
20
|
desc 'Run rspec for rails4 application'
|
20
21
|
task :rails4 do
|
21
22
|
Bundler.with_clean_env do
|
22
|
-
sh %
|
23
|
+
sh %(
|
24
|
+
cd spec/rails4_dummy_app &&
|
25
|
+
npm run build &&
|
26
|
+
npm run rwr-background-node &&
|
27
|
+
sleep 3 &&
|
28
|
+
bundle exec rspec &&
|
29
|
+
npm run rwr-stop-background-node
|
30
|
+
)
|
23
31
|
end
|
24
32
|
end
|
25
33
|
end
|
data/js/src/index.js
CHANGED
@@ -1,4 +1,7 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import { match, RouterContext } from 'react-router';
|
1
3
|
import ReactDOM from 'react-dom';
|
4
|
+
import ReactDOMServer from 'react-dom/server';
|
2
5
|
import VERSION from './version';
|
3
6
|
|
4
7
|
class ReactRouterIntegration {
|
@@ -27,9 +30,7 @@ class ReactRouterIntegration {
|
|
27
30
|
);
|
28
31
|
}
|
29
32
|
this.enabled = true;
|
30
|
-
|
31
|
-
const router = typeof(constructor) === 'function' ? constructor(props) : constructor;
|
32
|
-
ReactDOM.render(router, node);
|
33
|
+
ReactDOM.render(this._initializeRouter(name, props), node);
|
33
34
|
}
|
34
35
|
|
35
36
|
unmount(node) {
|
@@ -37,6 +38,34 @@ class ReactRouterIntegration {
|
|
37
38
|
this.enabled = false;
|
38
39
|
}
|
39
40
|
|
41
|
+
_initializeRouter(name, props) {
|
42
|
+
const constructor = this.get(name);
|
43
|
+
return typeof(constructor) === 'function' ? constructor(props) : constructor;
|
44
|
+
}
|
45
|
+
|
46
|
+
renderRouterToString(routerName, props, href) {
|
47
|
+
const routes = this._initializeRouter(routerName, props);
|
48
|
+
const result = {
|
49
|
+
body: '',
|
50
|
+
code: 0,
|
51
|
+
};
|
52
|
+
|
53
|
+
match({ routes, location: href }, (error, redirectLocation, renderProps) => {
|
54
|
+
if (error) {
|
55
|
+
throw error;
|
56
|
+
} else if (redirectLocation) {
|
57
|
+
result.code = 302;
|
58
|
+
result.redirectUri = `${redirectLocation.pathname}${redirectLocation.search}`;
|
59
|
+
} else if (renderProps) {
|
60
|
+
result.body = ReactDOMServer.renderToString(<RouterContext {...renderProps} />);
|
61
|
+
result.code = 200;
|
62
|
+
} else {
|
63
|
+
result.code = 404;
|
64
|
+
}
|
65
|
+
});
|
66
|
+
return JSON.stringify(result);
|
67
|
+
}
|
68
|
+
|
40
69
|
get integrationWrapper() {
|
41
70
|
return {
|
42
71
|
mount: function _mount(node, payload) {
|
@@ -46,6 +75,10 @@ class ReactRouterIntegration {
|
|
46
75
|
unmount: function _unmount(node) {
|
47
76
|
this.unmount(node);
|
48
77
|
}.bind(this),
|
78
|
+
|
79
|
+
nodeRun: function _prerender(payload) {
|
80
|
+
return this.renderRouterToString(payload.name, payload.props, payload.path);
|
81
|
+
}.bind(this),
|
49
82
|
};
|
50
83
|
}
|
51
84
|
}
|
data/js/src/version.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
export default '0.
|
1
|
+
export default '0.3.0';
|
@@ -1,8 +1,37 @@
|
|
1
1
|
module ReactWebpackRails
|
2
2
|
module ReactRouterIntegration
|
3
3
|
module ViewHelpers
|
4
|
-
def react_router(name, props = {})
|
5
|
-
|
4
|
+
def react_router(name, props = {}, options = {})
|
5
|
+
payload = { name: name, props: props }
|
6
|
+
result = ''
|
7
|
+
if server_side?(options.delete(:server_side))
|
8
|
+
result = execute_router_server_side!(payload, request.path)
|
9
|
+
end
|
10
|
+
react_element('react-router', payload, options) { result }
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def routing_error(name, path)
|
16
|
+
"RactRouter: No route found in #{name} router for #{path}."
|
17
|
+
end
|
18
|
+
|
19
|
+
def server_side?(server_side)
|
20
|
+
server_side.nil? ? Rails.application.config.react.server_side : server_side
|
21
|
+
end
|
22
|
+
|
23
|
+
def execute_router_server_side!(payload, path)
|
24
|
+
runner = NodeIntegrationRunner.new('react-router', payload.merge(path: path))
|
25
|
+
result = JSON.parse(runner.run)
|
26
|
+
|
27
|
+
case result['code']
|
28
|
+
when 200
|
29
|
+
result['body'].html_safe
|
30
|
+
when 302
|
31
|
+
controller.redirect_to result['redirectUri']
|
32
|
+
else
|
33
|
+
fail ActionController::RoutingError, routing_error(payload[:name], path)
|
34
|
+
end
|
6
35
|
end
|
7
36
|
end
|
8
37
|
end
|
data/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "rwr-react-router",
|
3
|
-
"version": "0.
|
3
|
+
"version": "0.3.0",
|
4
4
|
"description": "",
|
5
5
|
"main": "js/lib/index.js",
|
6
6
|
"files": [
|
@@ -28,7 +28,8 @@
|
|
28
28
|
"react-dom": "^0.14.0"
|
29
29
|
},
|
30
30
|
"dependencies": {
|
31
|
-
"react-webpack-rails": "^0.1.0"
|
31
|
+
"react-webpack-rails": "^0.1.0",
|
32
|
+
"react-router": "^2.0.1"
|
32
33
|
},
|
33
34
|
"devDependencies": {
|
34
35
|
"babel-cli": "^6.4.0",
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rwr-react_router
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rafał Gawlik
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-03-
|
11
|
+
date: 2016-03-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|