Skip to content

Commit e2fe21f

Browse files
authored
Merge pull request #686 from reactjs/webpacker-without-sprockets
Webpacker without sprockets
2 parents fbe18b8 + 7b6f03b commit e2fe21f

37 files changed

+156
-142
lines changed

.travis.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ gemfile:
1717
- gemfiles/rails_4.2_sprockets_2.gemfile
1818
- gemfiles/rails_4.2_sprockets_3.gemfile
1919
- gemfiles/rails_4.2_sprockets_4.gemfile
20-
- gemfiles/rails_5.gemfile
20+
- gemfiles/rails_5_no_sprockets_webpacker.gemfile
2121
- gemfiles/rails_5_no_sprockets.gemfile
2222
- gemfiles/rails_5_sprockets_4.gemfile
2323

@@ -37,7 +37,7 @@ matrix:
3737
- rvm: 2.1
3838
gemfile: gemfiles/rails_4.2_sprockets_4.gemfile
3939
- rvm: 2.1
40-
gemfile: gemfiles/rails_5.gemfile
40+
gemfile: gemfiles/rails_5_no_sprockets_webpacker.gemfile
4141
- rvm: 2.1
4242
gemfile: gemfiles/rails_5_no_sprockets.gemfile
4343
- rvm: 2.1
@@ -51,7 +51,7 @@ matrix:
5151
- rvm: jruby-9.0.1.0
5252
gemfile: gemfiles/rails_4.2_sprockets_2.gemfile
5353
- rvm: jruby-9.0.1.0
54-
gemfile: gemfiles/rails_5_mini_racer.gemfile
54+
gemfile: gemfiles/rails_5_no_sprockets_webpacker.gemfile
5555

5656
allow_failures:
5757
- rvm: jruby-9.0.1.0

Appraisals

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,8 @@ appraise "rails-4.2-sprockets_4" do
4949
gem "mini_racer"
5050
end
5151

52-
appraise "rails-5" do
52+
appraise "rails-5_no_sprockets_webpacker" do
5353
gem 'rails', '~> 5.0.0'
54-
gem "turbolinks", "~> 5.0.0"
5554
gem "webpacker", github: "rails/webpacker"
5655
# This ExecJS backend provides stateful context
5756
# which the default nodejs backend does not

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,7 @@ MyApp::Application.configure do
288288
# Settings for the pool of renderers:
289289
config.react.server_renderer_pool_size ||= 1 # ExecJS doesn't allow more than one on MRI
290290
config.react.server_renderer_timeout ||= 20 # seconds
291-
config.react.server_renderer = React::ServerRendering::SprocketsRenderer
291+
config.react.server_renderer = React::ServerRendering::BundleRenderer
292292
config.react.server_renderer_options = {
293293
files: ["server_rendering.js"], # files to load for prerendering
294294
replay_console: true, # if true, console.* will be replayed client-side
@@ -306,14 +306,14 @@ end
306306
- `#initialize(options={})`, which accepts the hash from `config.react.server_renderer_options`
307307
- `#render(component_name, props, prerender_options)` to return a string of HTML
308308

309-
`react-rails` provides two renderer classes: `React::ServerRendering::ExecJSRenderer` and `React::ServerRendering::SprocketsRenderer`.
309+
`react-rails` provides two renderer classes: `React::ServerRendering::ExecJSRenderer` and `React::ServerRendering::BundleRenderer`.
310310

311311
`ExecJSRenderer` offers two other points for extension:
312312

313313
- `#before_render(component_name, props, prerender_options)` to return a string of JavaScript to execute _before_ calling `React.render`
314314
- `#after_render(component_name, props, prerender_options)` to return a string of JavaScript to execute _after_ calling `React.render`
315315

316-
Any subclass of `ExecJSRenderer` may use those hooks (for example, `SprocketsRenderer` uses them to handle `console.*` on the server).
316+
Any subclass of `ExecJSRenderer` may use those hooks (for example, `BundleRenderer` uses them to handle `console.*` on the server).
317317

318318
## Controller Actions
319319

gemfiles/rails_3.2.gemfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
source "http://rubygems.org"
44

5+
gem "turbolinks", "~> 2.0"
56
gem "rails", "~> 3.2.21"
67
gem "rack-cache", "~> 1.6.1"
7-
gem "turbolinks", "~> 2.0"
88

99
gemspec :path => "../"

gemfiles/rails_4.0.5.gemfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
source "http://rubygems.org"
44

5-
gem "rails", "4.0.5"
65
gem "turbolinks"
6+
gem "rails", "4.0.5"
77

88
gemspec :path => "../"

gemfiles/rails_4.0_with_therubyracer.gemfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
source "http://rubygems.org"
44

5+
gem "turbolinks"
56
gem "rails", "~> 4.0.13"
67
gem "therubyracer", "0.12.0", :platform => :mri
7-
gem "turbolinks"
88

99
gemspec :path => "../"

gemfiles/rails_4.1.gemfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
source "http://rubygems.org"
44

5-
gem "rails", "~> 4.1.10"
65
gem "turbolinks", "~> 2.3.0"
6+
gem "rails", "~> 4.1.10"
77

88
gemspec :path => "../"

gemfiles/rails_4.2_sprockets_2.gemfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
source "http://rubygems.org"
44

5+
gem "turbolinks"
56
gem "rails", "~> 4.2.1"
67
gem "sprockets", "~> 2.12"
7-
gem "turbolinks"
88

99
gemspec :path => "../"

gemfiles/rails_4.2_sprockets_3.gemfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
source "http://rubygems.org"
44

5+
gem "turbolinks", "~> 2.5.0"
56
gem "rails", "~> 4.2.1"
67
gem "sprockets", "~> 3.5"
7-
gem "turbolinks", "~> 2.5.0"
88

99
gemspec :path => "../"

gemfiles/rails_4.2_sprockets_4.gemfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
source "http://rubygems.org"
44

5+
gem "turbolinks", "~> 2.5.0"
56
gem "rails", "~> 4.2.1"
67
gem "sprockets", "~> 4.0.x"
7-
gem "turbolinks", "~> 2.5.0"
88
gem "webpacker", :github => "rails/webpacker"
99
gem "mini_racer"
1010

gemfiles/rails_5.gemfile renamed to gemfiles/rails_5_no_sprockets_webpacker.gemfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
# This file was generated by Appraisal
2+
# This file shouldn't have turbolinks or sprockets in it
23

34
source "http://rubygems.org"
45

56
gem "rails", "~> 5.0.0"
6-
gem "turbolinks", "~> 5.0.0"
77
gem "webpacker", :github => "rails/webpacker"
88
gem "therubyracer"
99

gemfiles/rails_5_sprockets_4.gemfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
source "http://rubygems.org"
44

5+
gem "turbolinks", "~> 5.0.0"
56
gem "rails", "~> 5.0.0"
67
gem "sprockets", "~> 4.0.x"
7-
gem "turbolinks", "~> 5.0.0"
88

99
gemspec :path => "../"

lib/react/rails/railtie.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ class Railtie < ::Rails::Railtie
1515
# Server rendering:
1616
config.react.server_renderer_pool_size = 1 # increase if you're on JRuby
1717
config.react.server_renderer_timeout = 20 # seconds
18-
config.react.server_renderer = nil # defaults to SprocketsRenderer
19-
config.react.server_renderer_options = {} # SprocketsRenderer provides defaults
18+
config.react.server_renderer = nil # defaults to BundleRenderer
19+
config.react.server_renderer_options = {} # BundleRenderer provides defaults
2020
# Changing files with these extensions in these directories will cause the server renderer to reload:
2121
config.react.server_renderer_directories = ["/app/assets/javascripts/"]
2222
config.react.server_renderer_extensions = ["jsx"]
@@ -96,7 +96,7 @@ class Railtie < ::Rails::Railtie
9696

9797
config.after_initialize do |app|
9898
# The class isn't accessible in the configure block, so assign it here if it wasn't overridden:
99-
app.config.react.server_renderer ||= React::ServerRendering::SprocketsRenderer
99+
app.config.react.server_renderer ||= React::ServerRendering::BundleRenderer
100100

101101
React::ServerRendering.pool_size = app.config.react.server_renderer_pool_size
102102
React::ServerRendering.pool_timeout = app.config.react.server_renderer_timeout

lib/react/server_rendering.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
require 'connection_pool'
22
require 'react/server_rendering/exec_js_renderer'
3-
require 'react/server_rendering/sprockets_renderer'
3+
require 'react/server_rendering/bundle_renderer'
44

55
module React
66
module ServerRendering

lib/react/server_rendering/sprockets_renderer.rb renamed to lib/react/server_rendering/bundle_renderer.rb

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@
66
module React
77
module ServerRendering
88
# Extends ExecJSRenderer for the Rails environment
9-
# - builds JS code out of the asset pipeline
9+
# - fetches JS code from the Rails app (webpacker or sprockets)
1010
# - stringifies props
1111
# - implements console replay
12-
class SprocketsRenderer < ExecJSRenderer
12+
class BundleRenderer < ExecJSRenderer
1313
# Reimplement console methods for replaying on the client
14-
CONSOLE_POLYFILL = File.read(File.join(File.dirname(__FILE__), "sprockets_renderer/console_polyfill.js"))
15-
CONSOLE_REPLAY = File.read(File.join(File.dirname(__FILE__), "sprockets_renderer/console_replay.js"))
16-
TIMEOUT_POLYFILL = File.read(File.join(File.dirname(__FILE__), "sprockets_renderer/timeout_polyfill.js"))
14+
CONSOLE_POLYFILL = File.read(File.join(File.dirname(__FILE__), "bundle_renderer/console_polyfill.js"))
15+
CONSOLE_REPLAY = File.read(File.join(File.dirname(__FILE__), "bundle_renderer/console_replay.js"))
16+
TIMEOUT_POLYFILL = File.read(File.join(File.dirname(__FILE__), "bundle_renderer/timeout_polyfill.js"))
1717

1818
def initialize(options={})
1919
@replay_console = options.fetch(:replay_console, true)
@@ -54,7 +54,7 @@ class << self
5454
# default Rails setups.
5555
#
5656
# You can provide a custom asset container
57-
# with `React::ServerRendering::SprocketsRenderer.asset_container_class = MyAssetContainer`.
57+
# with `React::ServerRendering::BundleRenderer.asset_container_class = MyAssetContainer`.
5858
#
5959
# @return [#find_asset(logical_path)] An object that returns asset contents by logical path
6060
def asset_container

react_ujs/src/events/detect.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ module.exports = function(ujs) {
2828
} else {
2929
turbolinksClassicDeprecatedEvents.setup(ujs);
3030
}
31-
} else if ($ && typeof $.pjax === 'function') {
31+
} else if (typeof $ !== "undefined" && typeof $.pjax === 'function') {
3232
pjaxEvents.setup(ujs);
3333
} else {
3434
nativeEvents.setup(ujs);

test/dummy/app/controllers/pages_controller.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
class PagesController < ApplicationController
2-
if !SKIP_SPROCKETS
2+
if WebpackerHelpers.available? || SprocketsHelpers.available?
33
per_request_react_rails_prerenderer
44
end
55

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
var React = require("react")
2+
13
module.exports = {
24
Component: function(props) { return <h2>Named Export</h2> }
35
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
var React = require("react")
2+
13
module.exports = function(props) {
24
return <h2>Exports</h2>
35
}

test/dummy/app/views/layouts/application.html.erb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22
<html>
33
<head>
44
<title>Dummy</title>
5-
<%= stylesheet_link_tag "application", media: "all", "data-turbolinks-track" => true %>
6-
<%= javascript_include_tag "application", "data-turbolinks-track" => true %>
5+
<% if SprocketsHelpers.available? %>
6+
<%= javascript_include_tag "application", "data-turbolinks-track" => true %>
7+
<% end %>
78
<%= csrf_meta_tags %>
89
</head>
910
<body>

test/dummy/config/application.rb

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@
66
require "action_mailer/railtie"
77

88
# Test no-sprockets environment by testing the gemfile name
9-
SKIP_SPROCKETS = ENV["BUNDLE_GEMFILE"] =~ /no_sprockets/
10-
if !SKIP_SPROCKETS
9+
if SprocketsHelpers.available?
1110
require "sprockets/railtie"
1211
end
1312

@@ -33,7 +32,7 @@ class Application < Rails::Application
3332
# config.i18n.default_locale = :de
3433
config.react.variant = :production
3534
config.react.addons = false
36-
if !SKIP_SPROCKETS
35+
if SprocketsHelpers.available?
3736
config.assets.enabled = true
3837
end
3938
end

test/dummy/config/environments/test.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
# we need this to reload the jsx transformer when different version is dropped in
1010
config.cache_classes = false
1111
config.reload_plugins = true
12-
if !SKIP_SPROCKETS
12+
if SprocketsHelpers.available?
1313
config.assets.cache_store = :null_store
1414
end
1515

test/react/jsx/jsx_prepocessor_test.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
require 'test_helper'
22

3-
when_sprockets_available do
3+
SprocketsHelpers.when_available do
44
class JSXPreprocessorTest < ActiveSupport::TestCase
55
REQUIRED_JAVASCRIPT = "var requirePlainJavascript = true;"
66
REQUIRED_COFFEESCRIPT = "var requireCoffee; requireCoffee = true;"
77
REQUIRED_JSX = "React.createElement(\"div\", { className: \"require-jsx\" });"
88
OWN_JSX = "React.createElement(\"div\", { className: \"le-javascript\" });"
99
test 'executes //= require directives' do
10-
require_parent = fetch_asset_body("require_test/jsx_preprocessor_test.js")
10+
require_parent = SprocketsHelpers.fetch_asset_body("require_test/jsx_preprocessor_test.js")
1111

1212
assert_compiled_javascript_includes(require_parent, REQUIRED_JAVASCRIPT)
1313
assert_compiled_javascript_includes(require_parent, REQUIRED_COFFEESCRIPT)

test/react/jsx/jsx_transformer_test.rb

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,24 @@
11
require 'test_helper'
22

3-
when_sprockets_available do
3+
SprocketsHelpers.when_available do
44
class JSXTransformerTest < ActionDispatch::IntegrationTest
55
setup do
66
reset_transformer
77
React::JSX.transformer_class = React::JSX::JSXTransformer
8-
manually_expire_asset('JSXTransformer.js')
8+
SprocketsHelpers.manually_expire_asset('JSXTransformer.js')
99
end
1010

1111
teardown do
1212
reset_transformer
13-
manually_expire_asset('JSXTransformer.js')
13+
SprocketsHelpers.manually_expire_asset('JSXTransformer.js')
1414
end
1515

1616
test 'can use dropped-in version of JSX transformer' do
1717
hidden_path = Rails.root.join("vendor/assets/react/JSXTransformer__.js")
1818
replacing_path = Rails.root.join("vendor/assets/react/JSXTransformer.js")
1919

2020
FileUtils.cp hidden_path, replacing_path
21-
manually_expire_asset('example3.js')
21+
SprocketsHelpers.manually_expire_asset('example3.js')
2222

2323
get '/assets/example3.js'
2424
FileUtils.rm replacing_path
@@ -53,7 +53,7 @@ class JSXTransformerTest < ActionDispatch::IntegrationTest
5353

5454
FileUtils.mkdir_p(custom_path)
5555
FileUtils.cp(hidden_path, replacing_path)
56-
manually_expire_asset('example3.js')
56+
SprocketsHelpers.manually_expire_asset('example3.js')
5757
get '/assets/example3.js'
5858

5959
FileUtils.rm_rf custom_path

test/react/jsx_test.rb

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def transform(code)
2626
end
2727
end
2828

29-
when_sprockets_available do
29+
SprocketsHelpers.when_available do
3030
class JSXTransformTest < ActionDispatch::IntegrationTest
3131
setup do
3232
reset_transformer
@@ -37,30 +37,30 @@ class JSXTransformTest < ActionDispatch::IntegrationTest
3737
end
3838

3939
test 'asset pipeline should transform JSX' do
40-
manually_expire_asset('example.js')
40+
SprocketsHelpers.manually_expire_asset('example.js')
4141
get '/assets/example.js'
4242
assert_response :success
4343
assert_compiled_javascript_matches(EXPECTED_JS, @response.body)
4444
end
4545

4646
test 'asset pipeline should transform JSX + Coffeescript' do
47-
manually_expire_asset('example2.js')
47+
SprocketsHelpers.manually_expire_asset('example2.js')
4848
get '/assets/example2.js'
4949
assert_response :success
5050
assert_compiled_javascript_matches(EXPECTED_JS_2, @response.body)
5151
end
5252

5353
test 'use a custom transformer' do
5454
React::JSX.transformer_class = NullTransformer
55-
manually_expire_asset('example2.js')
55+
SprocketsHelpers.manually_expire_asset('example2.js')
5656
get '/assets/example2.js'
5757

5858
assert_equal "TRANSFORMED CODE!;\n", @response.body
5959
end
6060

6161
def test_babel_transformer_accepts_babel_transformation_options
6262
React::JSX.transform_options = {blacklist: ['spec.functionName', 'validation.react', "strict"]}
63-
manually_expire_asset('example.js')
63+
SprocketsHelpers.manually_expire_asset('example.js')
6464
get '/assets/example.js'
6565
assert_response :success
6666

0 commit comments

Comments
 (0)