Skip to content

Commit 295e6ca

Browse files
committed
fix(ServerRendering) improve webpacker + V8 server rendering
1 parent 51ec36c commit 295e6ca

File tree

5 files changed

+66
-25
lines changed

5 files changed

+66
-25
lines changed

react_ujs/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,6 @@ if (typeof window !== "undefined") {
113113
// but we really need it!
114114
// We need access to this object for server rendering, and
115115
// we can't do a dynamic `require`, so we'll grab it from here:
116-
this.ReactRailsUJS = ReactRailsUJS
116+
self.ReactRailsUJS = ReactRailsUJS
117117

118118
module.exports = ReactRailsUJS
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
var React = require("react")
2+
3+
module.exports = React.createClass({
4+
getInitialState: function() {
5+
var initialGreeting = 'Hello';
6+
if (typeof global !== "undefined" && global.ctx && global.ctx.greeting) {
7+
initialGreeting = global.ctx.greeting
8+
}
9+
10+
return {
11+
greeting: initialGreeting
12+
}
13+
},
14+
goodbye: function() {
15+
this.setState({greeting: 'Goodbye'});
16+
},
17+
render: function() {
18+
return React.DOM.div({},
19+
React.DOM.div({}, this.state.greeting, ' ', this.props.name),
20+
React.DOM.button({onClick: this.goodbye}, 'Goodbye')
21+
);
22+
}
23+
});
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
var React = require("react")
2+
module.exports = React.createClass({
3+
render: function() {
4+
return React.createElement("li", null, this.props.todo)
5+
}
6+
})
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// By default, this pack is loaded for server-side rendering.
22
// It must expose react_ujs as `ReactRailsUJS` and prepare a require context.
33
var componentRequireContext = require.context("components", true)
4-
var ReactRailsUJS = require("react_ujs")
4+
var ReactRailsUJS = require("../../../../../react_ujs/index")
55
ReactRailsUJS.loadContext(componentRequireContext)

test/react/server_rendering/sprockets_renderer_test.rb

Lines changed: 35 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,12 @@
44
class SprocketsRendererTest < ActiveSupport::TestCase
55
CALLBACKS = [:before_render, :after_render]
66

7+
webpacker_compiled = false
78
setup do
9+
if WebpackerHelpers.available? && !webpacker_compiled
10+
WebpackerHelpers.compile
11+
webpacker_compiled = true
12+
end
813
@renderer = React::ServerRendering::SprocketsRenderer.new({})
914
end
1015

@@ -62,8 +67,14 @@ class SprocketsRendererTest < ActiveSupport::TestCase
6267
err = assert_raises React::ServerRendering::PrerenderError do
6368
@renderer.render("NonExistentComponent", {}, nil)
6469
end
65-
assert_match(/ReferenceError/, err.to_s)
66-
assert_match(/NonExistentComponent/, err.to_s, "it names the component")
70+
71+
if WebpackerHelpers.available?
72+
assert_includes err.message, "Cannot find module './NonExistentComponent'"
73+
else
74+
assert_match(/ReferenceError/, err.to_s)
75+
assert_match(/NonExistentComponent/, err.to_s, "it names the component")
76+
end
77+
6778
assert_match(/\n/, err.to_s, "it includes the multi-line backtrace")
6879
end
6980

@@ -86,35 +97,36 @@ class SprocketsRendererTest < ActiveSupport::TestCase
8697

8798
assert_match(/drink more caffeine<\/span>/, additional_renderer.render("WithoutSprockets", {label: "drink more caffeine"}, nil))
8899
end
89-
end
90100

91-
test '.new accepts any filenames' do
92-
limited_renderer = React::ServerRendering::SprocketsRenderer.new(files: ["react-server.js", "react_ujs.js", "components/Todo.js"])
93-
assert_match(/get a real job<\/li>/, limited_renderer.render("Todo", {todo: "get a real job"}, nil))
94-
err = assert_raises React::ServerRendering::PrerenderError do
95-
limited_renderer.render("TodoList", {todos: []}, nil)
101+
# These use cases don't apply to Webpacker since the require.context comes from a pack:
102+
test '.new accepts any filenames' do
103+
limited_renderer = React::ServerRendering::SprocketsRenderer.new(files: ["react-server.js", "react_ujs.js", "components/Todo.js"])
104+
assert_match(/get a real job<\/li>/, limited_renderer.render("Todo", {todo: "get a real job"}, nil))
105+
err = assert_raises React::ServerRendering::PrerenderError do
106+
limited_renderer.render("TodoList", {todos: []}, nil)
107+
end
108+
assert_match(/ReferenceError/, err.to_s, "it doesnt load other files")
96109
end
97-
assert_match(/ReferenceError/, err.to_s, "it doesnt load other files")
98-
end
99110

100-
test '#render returns html when config.assets.compile is false' do
101-
begin
102-
legacy_rendering_files = ["react-server.js", "react_ujs.js", "components.js"]
103-
Rails.application.config.assets.precompile += legacy_rendering_files
111+
test '#render returns html when config.assets.compile is false' do
112+
begin
113+
legacy_rendering_files = ["react-server.js", "react_ujs.js", "components.js"]
114+
Rails.application.config.assets.precompile += legacy_rendering_files
104115

105-
precompile_assets
116+
precompile_assets
106117

107-
Rails.application.config.assets.compile = false
118+
Rails.application.config.assets.compile = false
108119

109-
@renderer = React::ServerRendering::SprocketsRenderer.new(files: legacy_rendering_files)
120+
@renderer = React::ServerRendering::SprocketsRenderer.new(files: legacy_rendering_files)
110121

111-
result = @renderer.render("Todo", {todo: "write tests"}, nil)
112-
assert_match(/<li.*write tests<\/li>/, result)
113-
assert_match(/data-react-checksum/, result)
114-
ensure
115-
Rails.application.config.assets.compile = true
122+
result = @renderer.render("Todo", {todo: "write tests"}, nil)
123+
assert_match(/<li.*write tests<\/li>/, result)
124+
assert_match(/data-react-checksum/, result)
125+
ensure
126+
Rails.application.config.assets.compile = true
116127

117-
clear_precompiled_assets
128+
clear_precompiled_assets
129+
end
118130
end
119131
end
120132
end

0 commit comments

Comments
 (0)