Skip to content

Commit 7317247

Browse files
committed
rebuild ujs, add some docs, simplify reloading
1 parent c2d6827 commit 7317247

File tree

10 files changed

+43
-28
lines changed

10 files changed

+43
-28
lines changed

lib/react/jsx.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ module JSX
1717
# - #transform(code) => new code
1818
self.transformer_class = DEFAULT_TRANSFORMER
1919

20+
# @param code [String] JSX code to transform into JavaScript
21+
# @return [String] plain, browser-ready JavaScript code
2022
def self.transform(code)
2123
self.transformer ||= transformer_class.new(transform_options)
2224
self.transformer.transform(code)

lib/react/rails/railtie.rb

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,25 +18,27 @@ class Railtie < ::Rails::Railtie
1818
config.react.server_renderer = nil # defaults to BundleRenderer
1919
config.react.server_renderer_options = {} # BundleRenderer provides defaults
2020
# Changing files with these extensions in these directories will cause the server renderer to reload:
21-
config.react.server_renderer_directories = ["/app/assets/javascripts/"]
22-
config.react.server_renderer_extensions = ["jsx"]
23-
if defined?(Webpacker)
24-
config.react.server_renderer_directories << "app/javascript"
25-
config.react.server_renderer_extensions << "js"
26-
end
21+
config.react.server_renderer_directories = ["/app/assets/javascripts/", "app/javascript"]
22+
config.react.server_renderer_extensions = ["jsx", "js"]
2723
# View helper implementation:
2824
config.react.view_helper_implementation = nil # Defaults to ComponentMount
2925

3026
# Watch .jsx files for changes in dev, so we can reload the JS VMs with the new JS code.
3127
initializer "react_rails.add_watchable_files", group: :all do |app|
28+
# Watch files ending in `server_renderer_extensions` in each of `server_renderer_directories`
3229
reload_paths = config.react.server_renderer_directories.reduce({}) do |memo, dir|
3330
app_dir = File.join(app.root, dir)
3431
memo[app_dir] = config.react.server_renderer_extensions
3532
memo
3633
end
3734

38-
app.reloaders << ActiveSupport::FileUpdateChecker.new([], reload_paths) do
39-
React::ServerRendering.reset_pool
35+
# Rails checks these objects for changes:
36+
app.reloaders << ActiveSupport::FileUpdateChecker.new([], reload_paths)
37+
# Reload renderers in dev when files change
38+
if Gem::Version.new(::Rails::VERSION::STRING) >= Gem::Version.new("5.x")
39+
ActiveSupport::Reloader.to_prepare { React::ServerRendering.reset_pool }
40+
else
41+
ActionDispatch::Reloader.to_prepare { React::ServerRendering.reset_pool }
4042
end
4143
end
4244

@@ -102,14 +104,7 @@ class Railtie < ::Rails::Railtie
102104
React::ServerRendering.pool_timeout = app.config.react.server_renderer_timeout
103105
React::ServerRendering.renderer_options = app.config.react.server_renderer_options
104106
React::ServerRendering.renderer = app.config.react.server_renderer
105-
106107
React::ServerRendering.reset_pool
107-
# Reload renderers in dev when files change
108-
if Gem::Version.new(::Rails::VERSION::STRING) >= Gem::Version.new("5.x")
109-
ActiveSupport::Reloader.to_prepare { React::ServerRendering.reset_pool }
110-
else
111-
ActionDispatch::Reloader.to_prepare { React::ServerRendering.reset_pool }
112-
end
113108
end
114109

115110
initializer "react_rails.setup_engine", :group => :all do |app|

lib/react/server_rendering.rb

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,18 @@ module ServerRendering
99

1010
self.renderer_options = {}
1111

12-
# Discard the old ConnectionPool & create a new one
12+
# Discard the old ConnectionPool & create a new one.
13+
# This will clear all state such as loaded code, JS VM state, or options.
14+
# @return [void]
1315
def self.reset_pool
1416
options = {size: pool_size, timeout: pool_timeout}
1517
@@pool = ConnectionPool.new(options) { self.renderer.new(self.renderer_options) }
1618
end
1719

1820
# Check a renderer out of the pool and use it to render the component.
21+
# @param component_name [String] Component identifier, looked up by UJS
22+
# @param props [String, Hash] Props for this component
23+
# @param prerender_options [Hash] Renderer-specific options
1924
# @return [String] Prerendered HTML from `component_name`
2025
def self.render(component_name, props, prerender_options)
2126
@@pool.with do |renderer|
@@ -28,6 +33,7 @@ def self.with_renderer
2833
@@pool.with { |renderer| yield(renderer) }
2934
end
3035

36+
# Raised when something went wrong during server rendering.
3137
class PrerenderError < RuntimeError
3238
def initialize(component_name, props, js_message)
3339
message = ["Encountered error \"#{js_message.inspect}\" when prerendering #{component_name} with #{props}",

lib/react/server_rendering/bundle_renderer.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,9 @@ def assets_precompiled?
9191
!::Rails.application.config.assets.compile
9292
end
9393

94+
# Detect what kind of asset system is in use and choose that container.
95+
# Or, if the user has provided {.asset_container_class}, use that.
96+
# @return [Class] suitable for {#asset_container}
9497
def asset_container_class
9598
if self.class.asset_container_class.present?
9699
self.class.asset_container_class

lib/react/server_rendering/webpacker_manifest_container.rb

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,25 @@
22

33
module React
44
module ServerRendering
5-
CLIENT_REQUIRE = %r{__webpack_require__\(.*webpack-dev-server\/client\/index\.js.*\n}
6-
7-
# Get a compiled file from Webpacker
5+
# Get a compiled file from Webpacker. It may come from:
6+
#
7+
# - webpack-dev-server
8+
# - compiled pack
89
class WebpackerManifestContainer
10+
# This pattern matches the code that initializes the dev-server client.
11+
CLIENT_REQUIRE = %r{__webpack_require__\(.*webpack-dev-server\/client\/index\.js.*\n}
12+
913
def find_asset(logical_path)
1014
# raises if not found
1115
asset_path = Webpacker::Manifest.lookup(logical_path).to_s
1216
if asset_path.start_with?("http")
13-
# this includes `webpack-dev-server/client/index.js` code which causes ExecJS to 💥
17+
# Get a file from the webpack-dev-server
1418
dev_server_asset = open(asset_path).read
19+
# Remove `webpack-dev-server/client/index.js` code which causes ExecJS to 💥
1520
dev_server_asset.sub!(CLIENT_REQUIRE, '//\0')
1621
dev_server_asset
1722
else
23+
# Read the already-compiled pack:
1824
full_path = Webpacker::Manifest.lookup_path(logical_path).to_s
1925
File.read(full_path)
2026
end

react_ujs/index.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,11 @@ var ReactRailsUJS = {
5555
// the default is ReactRailsUJS.ComponentGlobal
5656
getConstructor: constructorFromGlobal,
5757

58-
useContext: function(req) {
59-
this.getConstructor = constructorFromRequireContextWithGlobalFallback(req)
58+
// Given a Webpack `require.context`,
59+
// try finding components with `require`,
60+
// then falling back to global lookup.
61+
useContext: function(requireContext) {
62+
this.getConstructor = constructorFromRequireContextWithGlobalFallback(requireContext)
6063
},
6164

6265
// Render `componentName` with `props` to a string,

react_ujs/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "react_ujs",
3-
"version": "0.2.0",
3+
"version": "0.3.0",
44
"description": "Rails UJS for the react-rails gem",
55
"main": "index.js",
66
"repository": "reactjs/react-rails",

react_ujs/readme.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
# react-rails UJS
22

3-
UJS driver for [`react-rails`](https://github.com/reactjs/react-rails).
3+
UJS driver for [`react-rails`](https://github.com/reactjs/react-rails). See the Ruby gem for license, documentation and changelog.

test/dummy/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
"rails-erb-loader": "^4.0.0",
2222
"react": "^15.4.2",
2323
"react-dom": "^15.4.2",
24-
"react_ujs": "^0.2.0",
24+
"react_ujs": "^0.3.0",
2525
"sass-loader": "^6.0.3",
2626
"style-loader": "^0.16.1",
2727
"webpack": "^2.3.3",

test/dummy/yarn.lock

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3450,9 +3450,9 @@ react@^15.4.2:
34503450
loose-envify "^1.1.0"
34513451
object-assign "^4.1.0"
34523452

3453-
react_ujs@^0.2.0:
3454-
version "0.2.0"
3455-
resolved "https://registry.yarnpkg.com/react_ujs/-/react_ujs-0.2.0.tgz#4eb5141e6bd1cb6a220db7154843aabbfe1b4199"
3453+
react_ujs@^0.3.0:
3454+
version "0.3.0"
3455+
resolved "https://registry.yarnpkg.com/react_ujs/-/react_ujs-0.3.0.tgz#078298dca3116b813b6813419b4825c6e2b5b57f"
34563456

34573457
read-cache@^1.0.0:
34583458
version "1.0.0"

0 commit comments

Comments
 (0)