Sha256: 18f9290a7de058be6201a81cd38eb126971b3efd0945c7b90974a4a8fd21c1dc
Contents?: true
Size: 1.4 KB
Versions: 6
Compression:
Stored size: 1.4 KB
Contents
# A bare-bones renderer for React.js + Exec.js # - No Rails dependency # - No browser concerns module React module ServerRendering class ExecJSRenderer def initialize(options={}) js_code = options[:code] || raise("Pass `code:` option to instantiate a JS context!") @context = ExecJS.compile(GLOBAL_WRAPPER + js_code) end 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 = React.#{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 # Hooks for inserting JS before/after rendering def before_render(component_name, props, prerender_options); ""; end def after_render(component_name, props, prerender_options); ""; end # Handle Node.js & other ExecJS contexts GLOBAL_WRAPPER = <<-JS var global = global || this; var self = self || this; var window = window || this; JS end end end
Version data entries
6 entries across 6 versions & 1 rubygems