Skip to content

Commit b98013f

Browse files
author
Robert Mosolgo
committed
Merge pull request #350 from rmosolgo/document-extensions
docs(readme) document some customization points
2 parents c2cc362 + d632756 commit b98013f

File tree

2 files changed

+41
-1
lines changed

2 files changed

+41
-1
lines changed

README.md

+40
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ in your Ruby on Rails (3.2+) application. `react-rails` can:
1717
- [Render components into views and mount them](#rendering--mounting) via view helper & `react_ujs`
1818
- [Render components server-side](#server-rendering) with `prerender: true`
1919
- [Generate components](#component-generator) with a Rails generator
20+
- [Be extended](#extending-react-rails) with custom renderers, transformers and view helpers
2021

2122
## Installation
2223

@@ -305,3 +306,42 @@ Component = React.createClass
305306
render: ->
306307
`<ExampleComponent videos={this.props.videos} />`
307308
```
309+
310+
## Extending `react-rails`
311+
312+
You can extend some of the core functionality of `react-rails` by injecting new implementations during configuration.
313+
314+
### Custom Server Renderer
315+
316+
`react-rails` depends on a renderer class for rendering components on the server. You can provide a custom renderer class to `config.react.server_renderer`. The class must implement:
317+
318+
- `#initialize(options={})`, which accepts the hash from `config.react.server_renderer_options`
319+
- `#render(component_name, props, prerender_options)` to return a string of HTML
320+
321+
`react-rails` provides two renderer classes: `React::ServerRendering::ExecJSRenderer` and `React::ServerRendering::SprocketsRenderer`.
322+
323+
`ExecJSRenderer` offers two other points for extension:
324+
325+
- `#before_render(component_name, props, prerender_options)` to return a string of JavaScript to execute _before_ calling `React.render`
326+
- `#after_render(component_name, props, prerender_options)` to return a string of JavaScript to execute _after_ calling `React.render`
327+
328+
Any subclass of `ExecJSRenderer` may use those hooks (for example, `SprocketsRenderer` uses them to handle `console.*` on the server).
329+
330+
### Custom View Helper
331+
332+
`react-rails` uses a "helper implementation" class to generate the output of the `react_component` helper. The helper is initialized once per request and used for each `react_component` call during that request. You can provide a custom helper class to `config.react.view_helper_implementation`. The class must implement:
333+
334+
- `#react_component(name, props = {}, options = {}, &block)` to return a string to inject into the Rails view
335+
- `#setup(rack_env)`, called when the helper is initialized at the start of the request
336+
- `#teardown(rack_env)`, called at the end of the request
337+
338+
`react-rails` provides one implementation, `React::Rails::ComponentMount`.
339+
340+
### Custom JSX Transformer
341+
342+
`react-rails` uses a transformer class to transform JSX for the browser. The transformer is initialized once, at boot. You can provide a custom transformer to `config.react.jsx_transformer_class`. The transformer must implement:
343+
344+
- `#initialize(options)`, where options is the value passed to `config.react.jsx_transform_options`
345+
- `#transform(code_string)` to return a string of transformed code
346+
347+
`react-rails` provides two transformers, `React::JSX::JSXTransformer` and `React::JSX::BabelTransformer`.

lib/react/jsx.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ module JSX
99
DEFAULT_TRANSFORMER = BabelTransformer
1010
mattr_accessor :transform_options, :transformer_class, :transformer
1111

12-
# You can assign `React::JSX.transformer_class = `
12+
# You can assign `config.react.jsx_transformer_class = `
1313
# to provide your own transformer. It must implement:
1414
# - #initialize(options)
1515
# - #transform(code) => new code

0 commit comments

Comments
 (0)