class React::ServerRendering::ExecJSRenderer
A bare-bones renderer for React.js + Exec.js
-
Depends on global ReactRailsUJS in the ExecJS context
-
No
Rails
dependency -
No browser concerns
Constants
- GLOBAL_WRAPPER
Handle Node.js & other ExecJS contexts
Attributes
context[R]
@return [ExecJS::Runtime::Context] The JS context for this renderer
Public Class Methods
new(options={})
click to toggle source
# File lib/react/server_rendering/exec_js_renderer.rb, line 11 def initialize(options={}) js_code = options[:code] || raise('Pass `code:` option to instantiate a JS context!') @context = ExecJS.compile(GLOBAL_WRAPPER + js_code) end
Public Instance Methods
after_render(component_name, props, prerender_options)
click to toggle source
# File lib/react/server_rendering/exec_js_renderer.rb, line 27 def after_render(component_name, props, prerender_options); ''; end
before_render(component_name, props, prerender_options)
click to toggle source
Hooks for inserting JS before/after rendering
# File lib/react/server_rendering/exec_js_renderer.rb, line 26 def before_render(component_name, props, prerender_options); ''; end
render(component_name, props, prerender_options)
click to toggle source
# File lib/react/server_rendering/exec_js_renderer.rb, line 16 def render(component_name, props, prerender_options) js_executed_before = before_render(component_name, props, prerender_options) js_executed_after = after_render(component_name, props, prerender_options) js_main_section = main_render(component_name, props, prerender_options) render_from_parts(js_executed_before, js_main_section, js_executed_after) rescue ExecJS::ProgramError => err raise React::ServerRendering::PrerenderError.new(component_name, props, err) end
Private Instance Methods
compose_js(before, main, after)
click to toggle source
# File lib/react/server_rendering/exec_js_renderer.rb, line 47 def compose_js(before, main, after) <<-JS (function () { #{before} var result = #{main}; #{after} return result; })() JS end
main_render(component_name, props, prerender_options)
click to toggle source
# File lib/react/server_rendering/exec_js_renderer.rb, line 42 def main_render(component_name, props, prerender_options) render_function = prerender_options.fetch(:render_function, 'renderToString') "this.ReactRailsUJS.serverRender('#{render_function}', '#{component_name}', #{props})" end
render_from_parts(before, main, after)
click to toggle source
# File lib/react/server_rendering/exec_js_renderer.rb, line 37 def render_from_parts(before, main, after) js_code = compose_js(before, main, after) @context.eval(js_code).html_safe end