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;\nvar self = self || this;\nvar 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)}\nvar result = ReactDOMServer.\#{render_function}(React.createElement(\#{component_name}, \#{props}));\n\#{after_render(component_name, props, prerender_options)}\nreturn result;\n})()\n"
  @context.eval(js_code).html_safe
rescue ExecJS::ProgramError => err
  raise React::ServerRendering::PrerenderError.new(component_name, props, err)
end