reactssr-rails 0.1.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +20 -40
- data/lib/reactssr/rails.rb +1 -0
- data/lib/reactssr/rails/engine.rb +11 -0
- data/lib/reactssr/rails/railtie.rb +1 -4
- data/lib/reactssr/rails/version.rb +1 -1
- data/lib/reactssr/rails/view_helper.rb +1 -4
- data/lib/reactssr/server_rendering/ssr_renderer.rb +77 -7
- data/reactssr-rails.gemspec +2 -1
- metadata +29 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b2e420b41a0ac2cbd7a80791eac20d8e54656917
|
4
|
+
data.tar.gz: 182e72687c06107c02c01322ee64a23277ba5564
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0239fd847a61cac5c7b901075b8946585ed4bd82fa637eab8ef7cb9da40ecfd4dadcdef33cc4607adf02ae2598a85d022904f78858f1b97cf58c10180d6ff496
|
7
|
+
data.tar.gz: 9f8f6a3980afa5e3c21e7fb043e2fc5deae38bc628f89843a7138e51dc3c4a619d3ab15e6a146b41c183b1ac1a71e69821859d1ae625a1e6256816bf0a0fafd5
|
data/README.md
CHANGED
@@ -4,8 +4,14 @@
|
|
4
4
|
|
5
5
|
# Reactssr::Rails
|
6
6
|
|
7
|
-
|
8
|
-
|
7
|
+
React SSR in Rails.
|
8
|
+
|
9
|
+
This gem is to solve one problem, that's `react-rails` will compile all React
|
10
|
+
components in one file.
|
11
|
+
|
12
|
+
This gem will works well with `webpackrails` to let you use commonjs feature,
|
13
|
+
and only evaluate js code as few as possible, and in production environment it
|
14
|
+
will use precompiled static file **instead of** compiling the files again and again.
|
9
15
|
|
10
16
|
## Installation
|
11
17
|
|
@@ -25,19 +31,9 @@ Or install it yourself as:
|
|
25
31
|
|
26
32
|
## Usage
|
27
33
|
|
28
|
-
The
|
29
|
-
|
30
|
-
|
31
|
-
```
|
32
|
-
javascripts -|
|
33
|
-
components -|
|
34
|
-
home -|
|
35
|
-
index -|
|
36
|
-
```
|
37
|
-
|
38
|
-
In the above folder structure, the home folder is the controller name, if your
|
39
|
-
controller is under `some_namespace`, then the home folder should under `some_namespace`
|
40
|
-
folder, just like `views` folder structure.
|
34
|
+
The SSR file is a js file whose name ends with `ssr.js` under base folder, and
|
35
|
+
base folder is the folder where you put all your SSR files at, the default base
|
36
|
+
folder name is `components`.
|
41
37
|
|
42
38
|
You can config the base folder, put this within your `config/application.rb` file,
|
43
39
|
`config.reactssr.assets_base = 'folder_name'`.
|
@@ -48,41 +44,25 @@ You can config the base folder, put this within your `config/application.rb` fil
|
|
48
44
|
an example how to use it:
|
49
45
|
|
50
46
|
```js
|
51
|
-
<%= react_ssr('IndexView', {props}
|
47
|
+
<%= react_ssr('IndexView', {props}) %>
|
52
48
|
```
|
53
|
-
If you specific `prerender: false` in the options, the `react_ssr` will use
|
54
|
-
`react_component` instead (will be changed in future). For now, please just use
|
55
|
-
`prerender: true`.
|
56
49
|
|
57
|
-
So,
|
58
|
-
|
59
|
-
and action name is `index`, then it will look up a file named `index.ssr.js` in
|
60
|
-
folder `components/home/index/`. You just put your components in that file and
|
61
|
-
expose those components on `Components` js global object. Here is an example of
|
62
|
-
`index.ssr.js`:
|
50
|
+
So, suppose the current `controller_path` is `home`, then reactssr-rails will look
|
51
|
+
up a ssr file in components named `home.ssr.js`, just like below:
|
63
52
|
|
64
53
|
```js
|
65
|
-
//
|
54
|
+
// home.ssr.js
|
66
55
|
|
67
56
|
Components.IndexView = require('./IndexView.jsx');
|
68
57
|
```
|
69
58
|
|
70
|
-
|
71
|
-
file would be like this:
|
72
|
-
|
73
|
-
```js
|
74
|
-
// IndexView.jsx
|
59
|
+
## Example
|
75
60
|
|
76
|
-
|
77
|
-
render: function () {
|
78
|
-
return <p>Hello world</p>
|
79
|
-
}
|
80
|
-
})
|
81
|
-
```
|
61
|
+
http://github.com/towry/reactssr-rails-example
|
82
62
|
|
83
|
-
##
|
63
|
+
## TODO
|
84
64
|
|
85
|
-
|
65
|
+
- [x] In production env, do not run `webpackrails`
|
86
66
|
|
87
67
|
## Development
|
88
68
|
|
@@ -92,7 +72,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
92
72
|
|
93
73
|
## Contributing
|
94
74
|
|
95
|
-
1. Fork it ( https://github.com/
|
75
|
+
1. Fork it ( https://github.com/towry/reactssr-rails/fork )
|
96
76
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
97
77
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
98
78
|
4. Push to the branch (`git push origin my-new-feature`)
|
data/lib/reactssr/rails.rb
CHANGED
@@ -0,0 +1,11 @@
|
|
1
|
+
module Reactssr
|
2
|
+
module Rails
|
3
|
+
class Engine < ::Rails::Engine
|
4
|
+
initializer 'reactssr.assets.precompile' do |app|
|
5
|
+
base = app.config.reactssr.assets_base
|
6
|
+
precompile = File.join(base, '*.ssr.js')
|
7
|
+
app.config.assets.precompile += [precompile]
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -6,10 +6,7 @@ module Reactssr
|
|
6
6
|
# The folder that contains all the stuff
|
7
7
|
config.reactssr.assets_base = 'components'
|
8
8
|
|
9
|
-
|
10
|
-
config.reactssr.entry = 'index.ssr.js'
|
11
|
-
|
12
|
-
initializer "react_rails_ssr.setup_view_helpers", group: :all do |app|
|
9
|
+
initializer "reactssr.setup_view_helpers", group: :all do |app|
|
13
10
|
ActiveSupport.on_load(:action_view) do
|
14
11
|
include ::Reactssr::Rails::ViewHelper
|
15
12
|
end
|
@@ -8,10 +8,7 @@ module Reactssr
|
|
8
8
|
def react_ssr(name, props = {}, options = {}, &block)
|
9
9
|
options = {:tag => options} if options.is_a?(Symbol)
|
10
10
|
|
11
|
-
prerender_options =
|
12
|
-
if !prerender_options and Rails.application.config.react.server_renderer != ::Reactssr::ServerRendering::SsrRenderer
|
13
|
-
return react_component(name, props, options, &block)
|
14
|
-
end
|
11
|
+
prerender_options = true
|
15
12
|
|
16
13
|
# All the below stuff is to send the `controller_name`
|
17
14
|
# and `action_name` to our ssr_renderer.
|
@@ -1,4 +1,5 @@
|
|
1
1
|
|
2
|
+
require 'multi_json'
|
2
3
|
require 'react-rails'
|
3
4
|
|
4
5
|
module Reactssr
|
@@ -15,6 +16,9 @@ module Reactssr
|
|
15
16
|
end
|
16
17
|
|
17
18
|
@before_render_code ||= File.read("#{File.dirname __FILE__}/../assets/before_render.js")
|
19
|
+
|
20
|
+
@manifest_base ||= File.join(::Rails.public_path, ::Rails.application.config.assets.prefix)
|
21
|
+
load_asset_on_init
|
18
22
|
|
19
23
|
super(options.merge(code: js_code))
|
20
24
|
end
|
@@ -23,9 +27,10 @@ module Reactssr
|
|
23
27
|
prerender_options = pre_options[:prerender_options]
|
24
28
|
|
25
29
|
@controller_path = pre_options.fetch(:controller_path, nil)
|
26
|
-
@action_name = pre_options.fetch(:action_name, nil)
|
30
|
+
# @action_name = pre_options.fetch(:action_name, nil)
|
27
31
|
|
28
|
-
if @controller_path.nil? or @action_name.nil?
|
32
|
+
# if @controller_path.nil? or @action_name.nil?
|
33
|
+
if @controller_path.nil?
|
29
34
|
raise Reactssr::ServerRendering::RuntimeCommonError.new("Could not found the controller path or action name in current context.")
|
30
35
|
end
|
31
36
|
|
@@ -50,8 +55,18 @@ module Reactssr
|
|
50
55
|
# So, we will gather all the code for that controller#action
|
51
56
|
# in here.
|
52
57
|
def before_render(component_name, props, prerender_options)
|
53
|
-
jscode = @before_render_code.dup
|
54
|
-
|
58
|
+
jscode = @before_render_code.dup
|
59
|
+
|
60
|
+
success = false
|
61
|
+
if ::Rails.env.production?
|
62
|
+
content, success = load_asset(entry)
|
63
|
+
end
|
64
|
+
|
65
|
+
if not success
|
66
|
+
jscode << ::Rails.application.assets[entry].to_s
|
67
|
+
else
|
68
|
+
jscode << content
|
69
|
+
end
|
55
70
|
|
56
71
|
# the result is jscode
|
57
72
|
jscode
|
@@ -88,9 +103,64 @@ module Reactssr
|
|
88
103
|
|
89
104
|
def entry
|
90
105
|
components = ::Rails.application.config.reactssr.assets_base || 'components'
|
91
|
-
|
92
|
-
|
93
|
-
|
106
|
+
entry = File.join(components, "#{@controller_path}.ssr.js")
|
107
|
+
end
|
108
|
+
|
109
|
+
private
|
110
|
+
|
111
|
+
# Return asset content
|
112
|
+
def load_asset(filename)
|
113
|
+
digest_path = assets[filename]
|
114
|
+
|
115
|
+
if digest_path.nil?
|
116
|
+
return '', false
|
117
|
+
end
|
118
|
+
|
119
|
+
file = File.join(@manifest_base, digest_path)
|
120
|
+
if not File.exist?(file)
|
121
|
+
return '', false
|
122
|
+
end
|
123
|
+
|
124
|
+
return File.read(file), true
|
125
|
+
end
|
126
|
+
|
127
|
+
def assets
|
128
|
+
@data['assets'] ||= {}
|
129
|
+
end
|
130
|
+
|
131
|
+
def files
|
132
|
+
@data['files'] ||= {}
|
133
|
+
end
|
134
|
+
|
135
|
+
# load assets from Rails.public_path
|
136
|
+
def load_asset_on_init
|
137
|
+
paths = Dir[File.join(@manifest_base, "manifest*.json")]
|
138
|
+
if paths.any?
|
139
|
+
path = paths.first
|
140
|
+
else
|
141
|
+
# No precompile
|
142
|
+
return {}
|
143
|
+
end
|
144
|
+
|
145
|
+
begin
|
146
|
+
if File.exist?(path)
|
147
|
+
data = json_decode(File.read(path))
|
148
|
+
end
|
149
|
+
rescue ::MultiJson::DecodeError => e
|
150
|
+
return {}
|
151
|
+
end
|
152
|
+
|
153
|
+
@data = data.is_a?(Hash) ? data : {}
|
154
|
+
end
|
155
|
+
|
156
|
+
if ::MultiJson.respond_to?(:dump)
|
157
|
+
def json_decode(obj)
|
158
|
+
::MultiJson.load(obj)
|
159
|
+
end
|
160
|
+
else
|
161
|
+
def json_decode(obj)
|
162
|
+
::MultiJson.decode(obj)
|
163
|
+
end
|
94
164
|
end
|
95
165
|
end
|
96
166
|
|
data/reactssr-rails.gemspec
CHANGED
@@ -9,7 +9,7 @@ Gem::Specification.new do |spec|
|
|
9
9
|
spec.authors = ["towry"]
|
10
10
|
spec.email = ["tovvry@gmail.com"]
|
11
11
|
|
12
|
-
spec.summary = %q{
|
12
|
+
spec.summary = %q{React SSR in Rails}
|
13
13
|
spec.description = %q{Works with `react-rails` and `webpackrails` to server render react components by
|
14
14
|
views.}
|
15
15
|
spec.homepage = "https://github.com/towry/reactssr-rails"
|
@@ -33,4 +33,5 @@ views.}
|
|
33
33
|
|
34
34
|
# This gem depend on `react-rails`
|
35
35
|
spec.add_dependency 'react-rails', '>= 1.1.0'
|
36
|
+
spec.add_dependency 'multi_json', '>= 1.0'
|
36
37
|
end
|
metadata
CHANGED
@@ -1,57 +1,71 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: reactssr-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- towry
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-08-
|
11
|
+
date: 2015-08-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ~>
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '1.9'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ~>
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.9'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ~>
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '10.0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ~>
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '10.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: react-rails
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - '>='
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: 1.1.0
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - '>='
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: 1.1.0
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: multi_json
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.0'
|
55
69
|
description: |-
|
56
70
|
Works with `react-rails` and `webpackrails` to server render react components by
|
57
71
|
views.
|
@@ -61,8 +75,8 @@ executables: []
|
|
61
75
|
extensions: []
|
62
76
|
extra_rdoc_files: []
|
63
77
|
files:
|
64
|
-
-
|
65
|
-
-
|
78
|
+
- .gitignore
|
79
|
+
- .travis.yml
|
66
80
|
- CODE_OF_CONDUCT.md
|
67
81
|
- Gemfile
|
68
82
|
- LICENSE.txt
|
@@ -72,6 +86,7 @@ files:
|
|
72
86
|
- bin/setup
|
73
87
|
- lib/reactssr/assets/before_render.js
|
74
88
|
- lib/reactssr/rails.rb
|
89
|
+
- lib/reactssr/rails/engine.rb
|
75
90
|
- lib/reactssr/rails/railtie.rb
|
76
91
|
- lib/reactssr/rails/version.rb
|
77
92
|
- lib/reactssr/rails/view_helper.rb
|
@@ -88,18 +103,18 @@ require_paths:
|
|
88
103
|
- lib
|
89
104
|
required_ruby_version: !ruby/object:Gem::Requirement
|
90
105
|
requirements:
|
91
|
-
- -
|
106
|
+
- - '>='
|
92
107
|
- !ruby/object:Gem::Version
|
93
108
|
version: '0'
|
94
109
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
95
110
|
requirements:
|
96
|
-
- -
|
111
|
+
- - '>='
|
97
112
|
- !ruby/object:Gem::Version
|
98
113
|
version: '0'
|
99
114
|
requirements: []
|
100
115
|
rubyforge_project:
|
101
|
-
rubygems_version: 2.4.
|
116
|
+
rubygems_version: 2.4.6
|
102
117
|
signing_key:
|
103
118
|
specification_version: 4
|
104
|
-
summary:
|
119
|
+
summary: React SSR in Rails
|
105
120
|
test_files: []
|