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

Version Path
react-rails-1.3.3 lib/react/server_rendering/exec_js_renderer.rb
react-rails-1.3.2 lib/react/server_rendering/exec_js_renderer.rb
react-rails-1.3.1 lib/react/server_rendering/exec_js_renderer.rb
react-rails-1.3.0 lib/react/server_rendering/exec_js_renderer.rb
react-rails-1.2.0 lib/react/server_rendering/exec_js_renderer.rb
react-rails-1.1.0 lib/react/server_rendering/exec_js_renderer.rb