Skip to content

Commit 865f80e

Browse files
authored
Merge pull request #682 from reactjs/reload-new-files
feat(ServerRendering) reload when new files are added; support configurable reloader globs
2 parents ebfd719 + 46caaa3 commit 865f80e

File tree

3 files changed

+35
-1
lines changed

3 files changed

+35
-1
lines changed

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,9 @@ MyApp::Application.configure do
189189
files: ["server_rendering.js"], # files to load for prerendering
190190
replay_console: true, # if true, console.* will be replayed client-side
191191
}
192+
# Changing files matching these dirs/exts will cause the server renderer to reload:
193+
config.react.server_renderer_extensions = ["jsx"]
194+
config.react.server_renderer_directories = ["/app/assets/javascripts"]
192195
end
193196
```
194197

lib/react/rails/railtie.rb

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,22 @@ class Railtie < ::Rails::Railtie
1717
config.react.server_renderer_timeout = 20 # seconds
1818
config.react.server_renderer = nil # defaults to SprocketsRenderer
1919
config.react.server_renderer_options = {} # SprocketsRenderer provides defaults
20+
# 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"]
2023
# View helper implementation:
2124
config.react.view_helper_implementation = nil # Defaults to ComponentMount
2225

2326
# Watch .jsx files for changes in dev, so we can reload the JS VMs with the new JS code.
2427
initializer "react_rails.add_watchable_files", group: :all do |app|
25-
app.config.watchable_files.concat Dir["#{app.root}/app/assets/javascripts/**/*.jsx*"]
28+
reload_paths = config.react.server_renderer_directories.reduce({}) do |memo, dir|
29+
app_dir = File.join(app.root, dir)
30+
memo[app_dir] = config.react.server_renderer_extensions
31+
memo
32+
end
33+
app.reloaders << ActiveSupport::FileUpdateChecker.new([], reload_paths) do
34+
React::ServerRendering.reset_pool
35+
end
2636
end
2737

2838
# Include the react-rails view helper lazily

test/server_rendered_html_test.rb

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,27 @@ def wait_to_ensure_asset_pipeline_detects_changes
3737
end
3838
end
3939

40+
test 'it reloads when new jsx files are added' do
41+
begin
42+
get '/server/1'
43+
refute_match(/Overwritten List/, response.body)
44+
45+
# Make it alphabetically last so it will override the preceeding one:
46+
new_file_path = File.expand_path('../dummy/app/assets/javascripts/components/ZZ_NewComponent.js.jsx', __FILE__)
47+
File.write new_file_path, <<-JS
48+
var TodoList = function() { return <span>"Overwritten List"</span> }
49+
JS
50+
51+
wait_to_ensure_asset_pipeline_detects_changes
52+
53+
get '/server/1'
54+
assert_match(/Overwritten List/, response.body)
55+
ensure
56+
FileUtils.rm_rf(new_file_path)
57+
wait_to_ensure_asset_pipeline_detects_changes
58+
end
59+
end
60+
4061
test 'react server rendering shows console output as html comment' do
4162
# Make sure console messages are replayed when requested
4263
get '/server/console_example'

0 commit comments

Comments
 (0)