Class: React::ServerRendering::ExecJSRenderer

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

Direct Known Subclasses

SprocketsRenderer

Constant Summary collapse

GLOBAL_WRAPPER =

Handle Node.js & other ExecJS contexts

"  var global = global || this;\n  var self = self || this;\n  var window = window || this;\n"

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 = "    (function () {\n      \#{before_render(component_name, props, prerender_options)}\n      var result = ReactDOMServer.\#{render_function}(React.createElement(\#{component_name}, \#{props}));\n      \#{after_render(component_name, props, prerender_options)}\n      return result;\n    })()\n  JS\n  @context.eval(js_code).html_safe\nrescue ExecJS::ProgramError => err\n  raise React::ServerRendering::PrerenderError.new(component_name, props, err)\nend\n"