Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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)

AltStyle によって変換されたページ (->オリジナル) /