Class: React::ServerRendering::ExecJSRenderer

Inherits:
Object
  • Object
show all
Defined in:
lib/react/server_rendering/exec_js_renderer.rb

Overview

A bare-bones renderer for React.js + Exec.js

  • Depends on global ReactDOMServer in the ExecJS context

  • No Rails dependency

  • No browser concerns

Direct Known Subclasses

SprocketsRenderer

Constant Summary collapse

GLOBAL_WRAPPER =

Handle Node.js & other ExecJS contexts

<<-JS
  var global = global || this;
  var self = self || this;
  var window = window || this;
JS

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ ExecJSRenderer

Returns a new instance of ExecJSRenderer.



8
9
10
11
# File 'lib/react/server_rendering/exec_js_renderer.rb', line 8

def initialize(options={})
  js_code = options[:code] || raise("Pass `code:` option to instantiate a JS context!")
  @context = ExecJS.compile(GLOBAL_WRAPPER + js_code)
end

Instance Method Details

#after_render(component_name, props, prerender_options) ⇒ Object



30
# File 'lib/react/server_rendering/exec_js_renderer.rb', line 30

def after_render(component_name, props, prerender_options); ""; end

#before_render(component_name, props, prerender_options) ⇒ Object

Hooks for inserting JS before/after rendering



29
# File 'lib/react/server_rendering/exec_js_renderer.rb', line 29

def before_render(component_name, props, prerender_options); ""; end

#render(component_name, props, prerender_options) ⇒ Object



13
14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/react/server_rendering/exec_js_renderer.rb', line 13

def render(component_name, props, prerender_options)
  render_function = prerender_options.fetch(:render_function, "renderToString")
  js_code = <<-JS
    (function () {
      #{before_render(component_name, props, prerender_options)}
      var result = ReactDOMServer.#{render_function}(React.createElement(#{component_name}, #{props}));
      #{after_render(component_name, props, prerender_options)}
      return result;
    })()
  JS
  @context.eval(js_code).html_safe
rescue ExecJS::ProgramError => err
  raise React::ServerRendering::PrerenderError.new(component_name, props, err)
end