Class: React::ServerRendering::SprocketsRenderer

Inherits:
ExecJSRenderer show all
Defined in:
lib/react/server_rendering/sprockets_renderer.rb

Constant Summary collapse

CONSOLE_POLYFILL =

Reimplement console methods for replaying on the client

<<-JS
  var console = { history: [] };
  ['error', 'log', 'info', 'warn'].forEach(function (fn) {
    console[fn] = function () {
      console.history.push({level: fn, arguments: Array.prototype.slice.call(arguments)});
    };
  });
JS
CONSOLE_REPLAY =

Replay message from console history

<<-JS
  (function (history) {
    if (history && history.length > 0) {
      result += '\\n<scr'+'ipt>';
      history.forEach(function (msg) {
        result += '\\nconsole.' + msg.level + '.apply(console, ' + JSON.stringify(msg.arguments) + ');';
      });
      result += '\\n</scr'+'ipt>';
    }
  })(console.history);
JS

Constants inherited from ExecJSRenderer

ExecJSRenderer::GLOBAL_WRAPPER

Instance Method Summary collapse

Methods inherited from ExecJSRenderer

#before_render

Constructor Details

#initialize(options = {}) ⇒ SprocketsRenderer

Returns a new instance of SprocketsRenderer.



8
9
10
11
12
13
14
15
16
17
18
# File 'lib/react/server_rendering/sprockets_renderer.rb', line 8

def initialize(options={})
  @replay_console = options.fetch(:replay_console, true)
  filenames = options.fetch(:files, ["react.js", "components.js"])
  js_code = CONSOLE_POLYFILL.dup

  filenames.each do |filename|
    js_code << ::Rails.application.assets[filename].to_s
  end

  super(options.merge(code: js_code))
end

Instance Method Details

#after_render(component_name, props, prerender_options) ⇒ Object



35
36
37
# File 'lib/react/server_rendering/sprockets_renderer.rb', line 35

def after_render(component_name, props, prerender_options)
  @replay_console ? CONSOLE_REPLAY : ""
end

#render(component_name, props, prerender_options) ⇒ Object



20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/react/server_rendering/sprockets_renderer.rb', line 20

def render(component_name, props, prerender_options)
  # pass prerender: :static to use renderToStaticMarkup
  react_render_method = if prerender_options == :static
      "renderToStaticMarkup"
    else
      "renderToString"
    end

  if !props.is_a?(String)
    props = props.to_json
  end

  super(component_name, props, {render_function: react_render_method})
end