tombolo 0.9.1 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +29 -4
- data/lib/tombolo/configuration.rb +7 -2
- data/lib/tombolo/renderer.rb +4 -4
- data/lib/tombolo/version.rb +1 -1
- data/lib/tombolo/view_helper.rb +11 -6
- data/lib/tombolo.rb +8 -4
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 873413c284aae7d6d0c85db23c2003bbd30370ccd91b37f0b48c2b67da547799
|
|
4
|
+
data.tar.gz: 035a44bd53c27c2c2175a2502f13ad70968b7203a78beb7bd175f18162d42ec4
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 5d8acbf9ebf978d082922b21d6385742307329856846e30aa2835a0cb1a8d531b5eb5346398c9dba0eb144020d979032871e9b20b9850e1ee1efef58cd86c7b5
|
|
7
|
+
data.tar.gz: d91194cfd684ac5f781ff7b692380f6fc9a2d00054517816525d6fe6f0be91696f1a933185b884b8146566e1d9f73201422875e4ee4e7cdc33a0fa9925f64dad
|
data/README.md
CHANGED
|
@@ -150,6 +150,28 @@ Tombolo.configure do |config|
|
|
|
150
150
|
end
|
|
151
151
|
```
|
|
152
152
|
|
|
153
|
+
#### Named render scopes
|
|
154
|
+
|
|
155
|
+
If your app needs multiple SSR bundles with different sets of components, you
|
|
156
|
+
can register named render scopes. Each scope gets its own isolated ExecJS
|
|
157
|
+
runtime:
|
|
158
|
+
|
|
159
|
+
```ruby
|
|
160
|
+
Tombolo.configuration.server_bundles[:admin] = "app/assets/builds/admin/prerender.js"
|
|
161
|
+
Tombolo.configuration.server_bundles[:storefront] = "app/assets/builds/storefront/prerender.js"
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
Then reference the scope by name:
|
|
165
|
+
|
|
166
|
+
```erb
|
|
167
|
+
<%= react_component("Dashboard", prerender: :admin, props: { ... }) %>
|
|
168
|
+
<%= react_component("ProductGrid", prerender: :storefront, props: { ... }) %>
|
|
169
|
+
<%= react_component("Greeting", prerender: true, props: { ... }) %> <%# uses :default %>
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
`prerender: true` uses the `:default` bundle. `prerender: :name` uses a named
|
|
173
|
+
bundle.
|
|
174
|
+
|
|
153
175
|
## Configuration
|
|
154
176
|
|
|
155
177
|
```ruby
|
|
@@ -157,9 +179,12 @@ Tombolo.configure do |config|
|
|
|
157
179
|
# Convert snake_case prop keys to camelCase (default: false)
|
|
158
180
|
config.camelize_props = true
|
|
159
181
|
|
|
160
|
-
# Path to the server-side JS bundle for SSR
|
|
182
|
+
# Path to the default server-side JS bundle for SSR
|
|
161
183
|
# (default: "app/assets/builds/prerender.js")
|
|
162
184
|
config.server_bundle = "app/assets/builds/prerender.js"
|
|
185
|
+
|
|
186
|
+
# Named server bundles for isolated SSR render scopes
|
|
187
|
+
# config.server_bundles[:admin] = "path/to/admin/prerender.js"
|
|
163
188
|
end
|
|
164
189
|
```
|
|
165
190
|
|
|
@@ -203,9 +228,9 @@ making it callable from ExecJS. Used in server entry points for SSR.
|
|
|
203
228
|
|
|
204
229
|
Renders a `<div>` with `data-react-component` and `data-react-props`
|
|
205
230
|
attributes. When `prerender: true`, the component is rendered on the server
|
|
206
|
-
via ExecJS
|
|
207
|
-
to
|
|
208
|
-
configuration.
|
|
231
|
+
via ExecJS using the `:default` bundle. Pass a Symbol (e.g. `prerender: :admin`)
|
|
232
|
+
to use a named render scope instead. Pass `camelize_props: true` to convert
|
|
233
|
+
snake_case prop keys to camelCase, or set it globally in the configuration.
|
|
209
234
|
|
|
210
235
|
#### `Tombolo.configure { |config| ... }`
|
|
211
236
|
|
|
@@ -2,11 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
module Tombolo
|
|
4
4
|
class Configuration
|
|
5
|
-
attr_accessor :camelize_props
|
|
5
|
+
attr_accessor :camelize_props
|
|
6
|
+
attr_reader :server_bundles
|
|
6
7
|
|
|
7
8
|
def initialize
|
|
8
9
|
@camelize_props = false
|
|
9
|
-
@
|
|
10
|
+
@server_bundles = { default: "app/assets/builds/prerender.js" }
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def server_bundle=(path)
|
|
14
|
+
@server_bundles[:default] = path
|
|
10
15
|
end
|
|
11
16
|
end
|
|
12
17
|
end
|
data/lib/tombolo/renderer.rb
CHANGED
|
@@ -10,7 +10,8 @@ end
|
|
|
10
10
|
|
|
11
11
|
module Tombolo
|
|
12
12
|
class Renderer
|
|
13
|
-
def initialize
|
|
13
|
+
def initialize(server_bundle:)
|
|
14
|
+
@server_bundle = server_bundle
|
|
14
15
|
@mutex = Mutex.new
|
|
15
16
|
@context = nil
|
|
16
17
|
end
|
|
@@ -28,10 +29,9 @@ module Tombolo
|
|
|
28
29
|
end
|
|
29
30
|
|
|
30
31
|
def bundle_source
|
|
31
|
-
|
|
32
|
-
raise "Tombolo server bundle not found: #{path}" unless File.exist?(path)
|
|
32
|
+
raise "Tombolo server bundle not found: #{@server_bundle}" unless File.exist?(@server_bundle)
|
|
33
33
|
|
|
34
|
-
console_polyfill + File.read(
|
|
34
|
+
console_polyfill + File.read(@server_bundle)
|
|
35
35
|
end
|
|
36
36
|
|
|
37
37
|
def console_polyfill
|
data/lib/tombolo/version.rb
CHANGED
data/lib/tombolo/view_helper.rb
CHANGED
|
@@ -11,14 +11,19 @@ module Tombolo
|
|
|
11
11
|
|
|
12
12
|
props_json = props.to_json
|
|
13
13
|
data = { react_component: name, react_props: props_json }
|
|
14
|
-
|
|
15
|
-
content = ""
|
|
16
|
-
if prerender
|
|
17
|
-
data[:react_prerender] = ""
|
|
18
|
-
content = Tombolo.renderer.render(name, props_json).html_safe # rubocop:disable Rails/OutputSafety
|
|
19
|
-
end
|
|
14
|
+
content = prerender_content(name, props_json, prerender, data)
|
|
20
15
|
|
|
21
16
|
content_tag(:div, content, data:)
|
|
22
17
|
end
|
|
18
|
+
|
|
19
|
+
private
|
|
20
|
+
|
|
21
|
+
def prerender_content(name, props_json, prerender, data)
|
|
22
|
+
return "" unless prerender
|
|
23
|
+
|
|
24
|
+
data[:react_prerender] = ""
|
|
25
|
+
renderer = Tombolo.renderer(prerender == true ? :default : prerender)
|
|
26
|
+
renderer.render(name, props_json).html_safe # rubocop:disable Rails/OutputSafety
|
|
27
|
+
end
|
|
23
28
|
end
|
|
24
29
|
end
|
data/lib/tombolo.rb
CHANGED
|
@@ -15,16 +15,20 @@ module Tombolo
|
|
|
15
15
|
yield configuration
|
|
16
16
|
end
|
|
17
17
|
|
|
18
|
-
def renderer
|
|
19
|
-
@
|
|
18
|
+
def renderer(name = :default)
|
|
19
|
+
@renderers ||= {}
|
|
20
|
+
@renderers[name] ||= begin
|
|
21
|
+
path = configuration.server_bundles[name]
|
|
22
|
+
raise ArgumentError, "No server bundle configured for #{name.inspect}" unless path
|
|
23
|
+
|
|
20
24
|
require "tombolo/renderer"
|
|
21
|
-
Renderer.new
|
|
25
|
+
Renderer.new(server_bundle: path)
|
|
22
26
|
end
|
|
23
27
|
end
|
|
24
28
|
|
|
25
29
|
def reset!
|
|
26
30
|
@configuration = nil
|
|
27
|
-
@
|
|
31
|
+
@renderers = nil
|
|
28
32
|
end
|
|
29
33
|
end
|
|
30
34
|
end
|