class React::ServerRendering::ExecJSRenderer

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

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