Class: React::ServerRendering::SprocketsRenderer

Inherits:
ExecJSRenderer show all
Defined in:
lib/react/server_rendering/sprockets_renderer.rb

Overview

Extends ExecJSRenderer for the Rails environment

  • builds JS code out of the asset pipeline

  • stringifies props

  • implements console replay

Constant Summary collapse

CONSOLE_POLYFILL =

Reimplement console methods for replaying on the client

File.read(File.join(File.dirname(__FILE__), "sprockets_renderer/console_polyfill.js"))
CONSOLE_REPLAY =
File.read(File.join(File.dirname(__FILE__), "sprockets_renderer/console_replay.js"))

Constants inherited from ExecJSRenderer

ExecJSRenderer::GLOBAL_WRAPPER

Class Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from ExecJSRenderer

#before_render

Constructor Details

#initialize(options = {}) ⇒ SprocketsRenderer

Returns a new instance of SprocketsRenderer.



16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/react/server_rendering/sprockets_renderer.rb', line 16

def initialize(options={})
  @replay_console = options.fetch(:replay_console, true)
  filenames = options.fetch(:files, ["react-server.js", "components.js"])
  js_code = CONSOLE_POLYFILL.dup
  js_code << options.fetch(:code, '')

  filenames.each do |filename|
    js_code << asset_container.find_asset(filename)
  end

  super(options.merge(code: js_code))
end

Class Attribute Details

.asset_container_classObject

Returns the value of attribute asset_container_class.



49
50
51
# File 'lib/react/server_rendering/sprockets_renderer.rb', line 49

def asset_container_class
  @asset_container_class
end

Instance Method Details

#after_render(component_name, props, prerender_options) ⇒ Object



44
45
46
# File 'lib/react/server_rendering/sprockets_renderer.rb', line 44

def after_render(component_name, props, prerender_options)
  @replay_console ? CONSOLE_REPLAY : ""
end

#asset_container#find_asset(logical_path)

Get an object which exposes assets by their logical path.

Out of the box, it supports a Sprockets::Environment (application.assets) and a Sprockets::Manifest (application.assets_manifest), which covers the default Rails setups.

You can provide a custom asset container with ‘React::ServerRendering::SprocketsRender.asset_container_class = MyAssetContainer`.

Returns:

  • (#find_asset(logical_path))

    An object that returns asset contents by logical path



62
63
64
65
66
67
68
69
70
71
72
# File 'lib/react/server_rendering/sprockets_renderer.rb', line 62

def asset_container
  @asset_container ||= if self.class.asset_container_class.present?
    self.class.asset_container_class.new
  elsif assets_precompiled? && ManifestContainer.compatible?
    ManifestContainer.new
  elsif assets_precompiled? && YamlManifestContainer.compatible?
    YamlManifestContainer.new
  else
    EnvironmentContainer.new
  end
end

#assets_precompiled?Boolean

Returns:

  • (Boolean)


74
75
76
# File 'lib/react/server_rendering/sprockets_renderer.rb', line 74

def assets_precompiled?
  !::Rails.application.config.assets.compile
end

#render(component_name, props, prerender_options) ⇒ Object



29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/react/server_rendering/sprockets_renderer.rb', line 29

def render(component_name, props, prerender_options)
  # pass prerender: :static to use renderToStaticMarkup
  react_render_method = if prerender_options == :static
      "renderToStaticMarkup"
    else
      "renderToString"
    end

  if !props.is_a?(String)
    props = props.to_json
  end

  super(component_name, props, {render_function: react_render_method})
end