lib/react/rails/railtie.rb in react-rails-0.13.0.0 vs lib/react/rails/railtie.rb in react-rails-1.0.0

- old
+ new

@@ -3,34 +3,85 @@ module React module Rails class Railtie < ::Rails::Railtie config.react = ActiveSupport::OrderedOptions.new - initializer "react_rails.setup_vendor", :after => "sprockets.environment", group: :all do |app| - variant = app.config.react.variant + # Sensible defaults. Can be overridden in application.rb + config.react.variant = (::Rails.env.production? ? :production : :development) + config.react.addons = false + config.react.jsx_transform_options = {} + # Server-side rendering + config.react.max_renderers = 10 + config.react.timeout = 20 #seconds + config.react.react_js = lambda {File.read(::Rails.application.assets.resolve('react.js'))} + config.react.component_filenames = ['components.js'] + # Watch .jsx files for changes in dev, so we can reload the JS VMs with the new JS code. + initializer "react_rails.add_watchable_files", group: :all do |app| + app.config.watchable_files.concat Dir["#{app.root}/app/assets/javascripts/**/*.jsx*"] + end + + # Include the react-rails view helper lazily + initializer "react_rails.setup_view_helpers", group: :all do |app| + React::JSX.transform_options = app.config.react.jsx_transform_options + ActiveSupport.on_load(:action_view) do + include ::React::Rails::ViewHelper + end + end + + initializer "react_rails.setup_vendor", group: :all do |app| # Mimic behavior of ember-rails... # We want to include different files in dev/prod. The unminified builds # contain console logging for invariants and logging to help catch # common mistakes. These are all stripped out in the minified build. - if variant = app.config.react.variant || ::Rails.env.test? - variant ||= :development - addons = app.config.react.addons || false - # Copy over the variant into a path that sprockets will pick up. - # We'll always copy to 'react.js' so that no includes need to change. - # We'll also always copy of JSXTransformer.js - tmp_path = app.root.join('tmp/react-rails') - filename = 'react' + (addons ? '-with-addons' : '') + (variant == :production ? '.min.js' : '.js') - FileUtils.mkdir_p(tmp_path) - FileUtils.cp(::React::Source.bundled_path_for(filename), - tmp_path.join('react.js')) - FileUtils.cp(::React::Source.bundled_path_for('JSXTransformer.js'), - tmp_path.join('JSXTransformer.js')) + # Copy over the variant into a path that sprockets will pick up. + # We'll always copy to 'react.js' so that no includes need to change. + # We'll also always copy of JSXTransformer.js + tmp_path = app.root.join('tmp/react-rails') + filename = 'react' + + (app.config.react.addons ? '-with-addons' : '') + + (app.config.react.variant == :production ? '.min.js' : '.js') + FileUtils.mkdir_p(tmp_path) + FileUtils.cp(::React::Source.bundled_path_for(filename), + tmp_path.join('react.js')) + FileUtils.cp(::React::Source.bundled_path_for('JSXTransformer.js'), + tmp_path.join('JSXTransformer.js')) + app.assets.prepend_path tmp_path - # Make sure it can be found - app.assets.append_path(tmp_path) + # Allow overriding react files that are not based on environment + # e.g. /vendor/assets/react/JSXTransformer.js + dropin_path = app.root.join("vendor/assets/react") + app.assets.prepend_path dropin_path if dropin_path.exist? + + # Allow overriding react files that are based on environment + # e.g. /vendor/assets/react/development/react.js + dropin_path_env = app.root.join("vendor/assets/react/#{app.config.react.variant}") + app.assets.prepend_path dropin_path_env if dropin_path_env.exist? + end + + + config.after_initialize do |app| + # Server Rendering + # Concat component_filenames together for server rendering + app.config.react.components_js = lambda { + app.config.react.component_filenames.map do |filename| + app.assets[filename].to_s + end.join(";") + } + + do_setup = lambda do + cfg = app.config.react + React::Renderer.setup!( cfg.react_js, cfg.components_js, cfg.replay_console, + {:size => cfg.max_renderers, :timeout => cfg.timeout}) end + + do_setup.call + + # Reload the JS VMs in dev when files change + ActionDispatch::Reloader.to_prepare(&do_setup) end + + end end end