react_on_rails 0.1.4 → 0.1.5
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 +6 -0
- data/app/helpers/react_on_rails_helper.rb +25 -8
- data/lib/react_on_rails/configuration.rb +6 -3
- data/lib/react_on_rails/react_renderer.rb +15 -2
- data/lib/react_on_rails/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4a68c1b72267dce9d0864c0e21429df7e89011e8
|
4
|
+
data.tar.gz: 1bbf750bdf7b128fba4c393a7716b2eef962674e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 82077ea1833158fb45c76c6ab5de0235e42f753257ff7f9a254938db05b2fe9a4262a126f729224a1be1f838139866111e0cefd6a4068f075c96b32dbb3ee616
|
7
|
+
data.tar.gz: b0f8347d48219798ceffede4bd9d83c5eeb9b8f0509913fac16a6ab22a5b5dc2eb6d9bff094ce1ce7a23f2bcbf6555245dcbc43c388cb335dc91edc3c8536321
|
data/README.md
CHANGED
@@ -102,6 +102,7 @@ Params are:
|
|
102
102
|
* **prerender**: <true/false> set to false when debugging!
|
103
103
|
* **trace**: <true/false> set to true to print additional debugging information in the browser default is true for development, off otherwise
|
104
104
|
* **replay_console**: <true/false> Default is true. False will disable echoing server rendering logs, which can make troubleshooting server rendering difficult.
|
105
|
+
* Any other options are passed to the content tag, including the id.
|
105
106
|
|
106
107
|
## JavaScript
|
107
108
|
|
@@ -157,6 +158,7 @@ ReactOnRails.configure do |config|
|
|
157
158
|
|
158
159
|
# For server rendering. This can be set to false so that server side messages are discarded.
|
159
160
|
config.replay_console = true # Default is true. Be cautious about turning this off.
|
161
|
+
config.logging_on_server = true # Default is true. Logs server rendering messags to Rails.logger.info
|
160
162
|
end
|
161
163
|
```
|
162
164
|
|
@@ -284,6 +286,10 @@ The gem is available as open source under the terms of the [MIT License](http://
|
|
284
286
|
|
285
287
|
See https://github.com/svenfuchs/gem-release
|
286
288
|
|
289
|
+
```bash
|
290
|
+
gem bump --tag --release
|
291
|
+
```
|
292
|
+
|
287
293
|
# Authors
|
288
294
|
The Shaka Code team!
|
289
295
|
|
@@ -30,7 +30,10 @@ module ReactOnRailsHelper
|
|
30
30
|
# trace: <true/false> set to true to print additional debugging information in the browser
|
31
31
|
# default is true for development, off otherwise
|
32
32
|
# replay_console: <true/false> Default is true. False will disable echoing server rendering
|
33
|
-
# logs
|
33
|
+
# logs to browser. While this can make troubleshooting server rendering difficult,
|
34
|
+
# so long as you have the default configuration of logging_on_server set to
|
35
|
+
# true, you'll still see the errors on the server.
|
36
|
+
# Any other options are passed to the content tag, including the id.
|
34
37
|
def react_component(component_name, props = {}, options = {})
|
35
38
|
# Create the JavaScript and HTML to allow either client or server rendering of the
|
36
39
|
# react_component.
|
@@ -41,16 +44,21 @@ module ReactOnRailsHelper
|
|
41
44
|
# We use this react_component_index in case we have the same component multiple times on the page.
|
42
45
|
react_component_index = next_react_component_index
|
43
46
|
react_component_name = component_name.camelize # Not sure if we should be doing this (JG)
|
44
|
-
|
47
|
+
if options[:id].nil?
|
48
|
+
dom_id = "#{component_name}-react-component-#{react_component_index}"
|
49
|
+
else
|
50
|
+
dom_id = options[:id]
|
51
|
+
end
|
45
52
|
|
46
53
|
# Setup the page_loaded_js, which is the same regardless of prerendering or not!
|
47
54
|
# The reason is that React is smart about not doing extra work if the server rendering did its job.
|
48
55
|
data_variable_name = "__#{component_name.camelize(:lower)}Data#{react_component_index}__"
|
49
56
|
turbolinks_loaded = Object.const_defined?(:Turbolinks)
|
50
57
|
install_render_events = turbolinks_loaded ? turbolinks_bootstrap(dom_id) : non_turbolinks_bootstrap
|
58
|
+
props_string = props.is_a?(String) ? props : props.to_json
|
51
59
|
page_loaded_js = <<-JS
|
52
60
|
(function() {
|
53
|
-
window.#{data_variable_name} = #{
|
61
|
+
window.#{data_variable_name} = #{props_string};
|
54
62
|
#{define_render_if_dom_node_present(react_component_name, data_variable_name, dom_id,
|
55
63
|
trace(options), generator_function(options))}
|
56
64
|
#{install_render_events}
|
@@ -61,18 +69,23 @@ module ReactOnRailsHelper
|
|
61
69
|
|
62
70
|
# Create the HTML rendering part
|
63
71
|
server_rendered_html, console_script =
|
64
|
-
server_rendered_react_component_html(options,
|
72
|
+
server_rendered_react_component_html(options, props_string, react_component_name,
|
65
73
|
data_variable_name, dom_id)
|
66
74
|
|
75
|
+
content_tag_options = options.except(:generator_function, :prerender, :trace,
|
76
|
+
:replay_console, :id, :react_component_name,
|
77
|
+
:server_side)
|
78
|
+
content_tag_options[:id] = dom_id
|
79
|
+
|
67
80
|
rendered_output = content_tag(:div,
|
68
81
|
server_rendered_html,
|
69
|
-
|
82
|
+
content_tag_options)
|
70
83
|
|
71
84
|
# IMPORTANT: Ensure that we mark string as html_safe to avoid escaping.
|
72
85
|
<<-HTML.html_safe
|
73
86
|
#{data_from_server_script_tag}
|
74
87
|
#{rendered_output}
|
75
|
-
#{console_script}
|
88
|
+
#{replay_console(options) ? console_script : ""}
|
76
89
|
HTML
|
77
90
|
end
|
78
91
|
|
@@ -82,12 +95,12 @@ module ReactOnRailsHelper
|
|
82
95
|
end
|
83
96
|
|
84
97
|
# Returns Array [0]: html, [1]: script to console log
|
85
|
-
def server_rendered_react_component_html(options,
|
98
|
+
def server_rendered_react_component_html(options, props_string, react_component_name, data_variable, dom_id)
|
86
99
|
if prerender(options)
|
87
100
|
render_js_expression = <<-JS
|
88
101
|
(function(React) {
|
89
102
|
#{debug_js(react_component_name, data_variable, dom_id, trace(options))}
|
90
|
-
var reactElement = #{render_js_react_element(react_component_name,
|
103
|
+
var reactElement = #{render_js_react_element(react_component_name, props_string, generator_function(options))}
|
91
104
|
return React.renderToString(reactElement);
|
92
105
|
})(this.React);
|
93
106
|
JS
|
@@ -135,6 +148,10 @@ module ReactOnRailsHelper
|
|
135
148
|
options.fetch(:prerender) { ReactOnRails.configuration.prerender }
|
136
149
|
end
|
137
150
|
|
151
|
+
def replay_console(options)
|
152
|
+
options.fetch(:replay_console) { ReactOnRails.configuration.replay_console }
|
153
|
+
end
|
154
|
+
|
138
155
|
def debug_js(react_component_name, data_variable, dom_id, trace)
|
139
156
|
if trace
|
140
157
|
"console.log(\"RENDERED #{react_component_name} with data_variable"\
|
@@ -8,16 +8,18 @@ module ReactOnRails
|
|
8
8
|
server_bundle_js_file: "app/assets/javascripts/generated/server.js",
|
9
9
|
prerender: false,
|
10
10
|
replay_console: true,
|
11
|
+
logging_on_server: true,
|
11
12
|
generator_function: false,
|
12
|
-
trace: Rails.env.development
|
13
|
+
trace: Rails.env.development?,
|
13
14
|
)
|
14
15
|
end
|
15
16
|
|
16
17
|
class Configuration
|
17
|
-
attr_accessor :server_bundle_js_file, :prerender, :replay_console, :generator_function, :trace
|
18
|
+
attr_accessor :server_bundle_js_file, :prerender, :replay_console, :generator_function, :trace,
|
19
|
+
:logging_on_server
|
18
20
|
|
19
21
|
def initialize(server_bundle_js_file: nil, prerender: nil, replay_console: nil,
|
20
|
-
generator_function: nil, trace: nil)
|
22
|
+
generator_function: nil, trace: nil, logging_on_server: nil)
|
21
23
|
if File.exist?(server_bundle_js_file)
|
22
24
|
self.server_bundle_js_file = server_bundle_js_file
|
23
25
|
else
|
@@ -26,6 +28,7 @@ module ReactOnRails
|
|
26
28
|
|
27
29
|
self.prerender = prerender
|
28
30
|
self.replay_console = replay_console
|
31
|
+
self.logging_on_server = logging_on_server
|
29
32
|
self.generator_function = generator_function
|
30
33
|
self.trace = trace.nil? ? Rails.env.development? : trace
|
31
34
|
end
|
@@ -76,7 +76,20 @@ var console = { history: [] };
|
|
76
76
|
json_string = ExecJS.eval(js_code_wrapper)
|
77
77
|
end
|
78
78
|
# element 0 is the html, element 1 is the script tag for the server console output
|
79
|
-
JSON.parse(json_string)
|
79
|
+
result = JSON.parse(json_string)
|
80
|
+
if ReactOnRails.configuration.logging_on_server
|
81
|
+
console_script = result[1]
|
82
|
+
console_script_lines = console_script.split("\n")
|
83
|
+
console_script_lines = console_script_lines[2..-2]
|
84
|
+
re = /console\.log\.apply\(console, \["\[SERVER\] (?<msg>.*)"\]\);/
|
85
|
+
console_script_lines.each do |line|
|
86
|
+
match = re.match(line)
|
87
|
+
if match
|
88
|
+
Rails.logger.info { "[react_on_rails] #{match[:msg]}"}
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
return result
|
80
93
|
end
|
81
94
|
|
82
95
|
def self.wrap_code_with_exception_handler(js_code, component_name)
|
@@ -134,7 +147,7 @@ var console = { history: [] };
|
|
134
147
|
end
|
135
148
|
|
136
149
|
def console_replay_js_code
|
137
|
-
@replay_console ? CONSOLE_REPLAY : ""
|
150
|
+
(@replay_console || ReactOnRails.configuration.logging_on_server) ? CONSOLE_REPLAY : ""
|
138
151
|
end
|
139
152
|
|
140
153
|
def base_js_code(bundle_js_code)
|