react_on_rails 11.3.0 → 12.0.0.pre.beta.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +320 -0
  3. data/.eslintignore +2 -1
  4. data/.eslintrc +23 -1
  5. data/.github/FUNDING.yml +1 -0
  6. data/.gitignore +3 -1
  7. data/.prettierignore +10 -1
  8. data/.prettierrc +3 -0
  9. data/.rubocop.yml +37 -11
  10. data/.travis.yml +9 -22
  11. data/CHANGELOG.md +65 -6
  12. data/CONTRIBUTING.md +60 -71
  13. data/Gemfile +3 -4
  14. data/{COMM-LICENSE → REACT-ON-RAILS-PRO-LICENSE} +6 -9
  15. data/README.md +129 -92
  16. data/Rakefile +0 -7
  17. data/SUMMARY.md +7 -11
  18. data/book.json +5 -5
  19. data/docs/additional-reading/asset-pipeline.md +8 -16
  20. data/docs/additional-reading/react-helmet.md +30 -10
  21. data/docs/additional-reading/react-router.md +52 -75
  22. data/docs/additional-reading/server-rendering-tips.md +12 -7
  23. data/docs/api/javascript-api.md +3 -3
  24. data/docs/api/redux-store-api.md +4 -2
  25. data/docs/api/view-helpers-api.md +6 -7
  26. data/docs/basics/configuration.md +83 -69
  27. data/docs/basics/deployment.md +2 -4
  28. data/docs/basics/heroku-deployment.md +24 -0
  29. data/docs/basics/hmr-and-hot-reloading-with-the-webpack-dev-server.md +49 -0
  30. data/docs/basics/i18n.md +45 -23
  31. data/docs/basics/installation-into-an-existing-rails-app.md +4 -9
  32. data/docs/basics/react-server-rendering.md +1 -1
  33. data/docs/basics/recommended-project-structure.md +5 -22
  34. data/docs/basics/{generator-functions-and-railscontext.md → render-functions-and-railscontext.md} +59 -21
  35. data/docs/basics/rspec-configuration.md +27 -16
  36. data/docs/basics/upgrading-react-on-rails.md +58 -2
  37. data/docs/basics/webpack-configuration.md +18 -8
  38. data/docs/contributor-info/errors-with-hooks.md +45 -0
  39. data/docs/contributor-info/pull-requests.md +44 -0
  40. data/docs/misc/doctrine.md +1 -1
  41. data/docs/{misc-pending → outdated}/code-splitting.md +12 -8
  42. data/docs/{basics → outdated}/how-react-on-rails-works.md +8 -4
  43. data/docs/{misc-pending → outdated}/manual-installation-overview.md +5 -5
  44. data/docs/{additional-reading → outdated}/rails-assets-relative-paths.md +3 -3
  45. data/docs/{misc-pending → outdated}/rails-assets.md +2 -12
  46. data/docs/{misc → outdated}/rails3.md +0 -0
  47. data/docs/tutorial.md +94 -68
  48. data/jest.config.js +4 -0
  49. data/lib/generators/react_on_rails/base_generator.rb +2 -2
  50. data/lib/generators/react_on_rails/dev_tests_generator.rb +1 -1
  51. data/lib/generators/react_on_rails/generator_helper.rb +4 -6
  52. data/lib/generators/react_on_rails/templates/base/base/Procfile.dev +3 -1
  53. data/lib/generators/react_on_rails/templates/base/base/Procfile.dev-hmr +26 -0
  54. data/lib/generators/react_on_rails/templates/base/base/app/javascript/bundles/HelloWorld/components/HelloWorld.jsx +20 -40
  55. data/lib/generators/react_on_rails/templates/base/base/config/initializers/react_on_rails.rb +4 -1
  56. data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/components/HelloWorld.jsx +4 -8
  57. data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/store/helloWorldStore.js +1 -3
  58. data/lib/react_on_rails.rb +3 -1
  59. data/lib/react_on_rails/configuration.rb +58 -28
  60. data/lib/react_on_rails/error.rb +2 -0
  61. data/lib/react_on_rails/helper.rb +41 -91
  62. data/lib/react_on_rails/json_parse_error.rb +2 -0
  63. data/lib/react_on_rails/locales/base.rb +150 -0
  64. data/lib/react_on_rails/locales/to_js.rb +37 -0
  65. data/lib/react_on_rails/locales/to_json.rb +27 -0
  66. data/lib/react_on_rails/prerender_error.rb +11 -15
  67. data/lib/react_on_rails/server_rendering_pool/ruby_embedded_java_script.rb +41 -46
  68. data/lib/react_on_rails/test_helper/ensure_assets_compiled.rb +7 -8
  69. data/lib/react_on_rails/test_helper/webpack_assets_compiler.rb +17 -0
  70. data/lib/react_on_rails/utils.rb +14 -19
  71. data/lib/react_on_rails/version.rb +1 -1
  72. data/lib/react_on_rails/version_checker.rb +1 -0
  73. data/lib/react_on_rails/webpacker_utils.rb +19 -2
  74. data/lib/tasks/assets.rake +33 -46
  75. data/lib/tasks/locale.rake +4 -2
  76. data/package-scripts.yml +11 -8
  77. data/package.json +29 -28
  78. data/rakelib/dummy_apps.rake +1 -9
  79. data/rakelib/example_type.rb +3 -1
  80. data/rakelib/examples.rake +3 -0
  81. data/rakelib/lint.rake +2 -7
  82. data/rakelib/node_package.rake +2 -2
  83. data/rakelib/release.rake +0 -6
  84. data/rakelib/run_rspec.rake +5 -18
  85. data/react_on_rails.gemspec +4 -5
  86. data/tsconfig.json +14 -0
  87. data/webpackConfigLoader.js +3 -2
  88. data/yarn.lock +4333 -2209
  89. metadata +46 -57
  90. data/Gemfile.rails32 +0 -73
  91. data/docs/additional-reading/babel.md +0 -5
  92. data/docs/additional-reading/heroku-deployment.md +0 -92
  93. data/docs/additional-reading/hot-reloading-rails-development-asset-pipeline.md +0 -47
  94. data/docs/api/ruby-api-hot-reload-view-helpers.md +0 -44
  95. data/lib/generators/react_on_rails/templates/base/base/Procfile.dev-server +0 -12
  96. data/lib/react_on_rails/assets_precompile.rb +0 -153
  97. data/lib/react_on_rails/locales_to_js.rb +0 -138
data/Rakefile CHANGED
@@ -3,8 +3,6 @@
3
3
  # Rake will automatically load any *.rake files inside of the "rakelib" folder
4
4
  # See rakelib/
5
5
 
6
- require_relative "./spec/react_on_rails/support/rails32_helper"
7
-
8
6
  tasks = %w[run_rspec lint]
9
7
  prepare_for_ci = %w[node_package dummy_apps]
10
8
 
@@ -14,11 +12,6 @@ if ENV["USE_COVERALLS"] == "TRUE"
14
12
  tasks << "coveralls:push"
15
13
  end
16
14
 
17
- if using_rails32?
18
- tasks = %w[run_rspec:gem_rails32 run_rspec:dummy_no_webpacker]
19
- prepare_for_ci = %w[node_package dummy_apps:dummy_no_webpacker]
20
- end
21
-
22
15
  desc "Run all tests and linting"
23
16
  task default: tasks
24
17
 
data/SUMMARY.md CHANGED
@@ -5,11 +5,11 @@
5
5
  ## **Basics**
6
6
  + [React on Rails Basic Installation Tutorial](./docs/tutorial.md)
7
7
  + [Webpack Configuration](./docs/basics/webpack-configuration.md)
8
- + [How React on Rails Works](./docs/basics/how-react-on-rails-works.md)
8
+ + [How React on Rails Works](docs/outdated/how-react-on-rails-works.md)
9
9
  + [Client vs. Server Rendering](./docs/basics/client-vs-server-rendering.md)
10
10
  + [React Server Rendering](./docs/basics/react-server-rendering.md)
11
11
  + [Recommended Project Structure](./docs/basics/recommended-project-structure.md)
12
- + [Generator Functions and the RailsContext](docs/basics/generator-functions-and-railscontext.md)
12
+ + [Render-Functions and the RailsContext](docs/basics/render-functions-and-railscontext.md)
13
13
  + [Caching and Performance: React on Rails Pro](https://github.com/shakacode/react_on_rails/wiki).
14
14
  + [Deployment](docs/basics/deployment.md).
15
15
  + [React on Rails Internationalization (I18n, localization)](docs/basics/i18n.md)
@@ -26,35 +26,31 @@
26
26
  + [Migration from react-rails](./docs/basics/migrating-from-react-rails.md)
27
27
  + [Generator Details](docs/basics/generator-details.md)
28
28
  + [Updating Dependencies](./docs/additional-reading/updating-dependencies.md)
29
- + [Manual Installation Overview](docs/misc-pending/manual-installation-overview.md)
29
+ + [Manual Installation Overview](docs/outdated/manual-installation-overview.md)
30
30
  + [Upgrading from rails/webpacker v3 to v4](docs/additional-reading/upgrade-webpacker-v3-to-v4.md)
31
31
 
32
32
  ## **Rails**
33
33
  + [Rails Engine Integration](./docs/additional-reading/rails-engine-integration.md)
34
34
  + [Rails View Rendering from Inline JavaScript](./docs/additional-reading/rails_view_rendering_from_inline_javascript.md)
35
35
  + [Turbolinks](./docs/additional-reading/turbolinks.md)
36
- + [Rails Assets](docs/misc-pending/rails-assets.md)
37
36
  + [Converting a Rails 5 API only app to a Rails app](./docs/additional-reading/convert-rails-5-api-only-app.md)
38
37
 
39
38
  ## **Javascript**
40
39
  + [Node Dependencies, NPM, and Yarn](./docs/additional-reading/node-dependencies-and-npm.md)
41
- + [Babel](./docs/additional-reading/babel.md)
42
40
  + [React Router](./docs/additional-reading/react-router.md)
43
41
  + [React & Redux](./docs/additional-reading/react-and-redux.md)
44
42
  + [Webpack Tips](./docs/additional-reading/webpack.md)
45
43
  + [Server Rendering Tips](./docs/additional-reading/server-rendering-tips.md)
46
- + [Code Splitting](docs/misc-pending/code-splitting.md)
44
+ + [Code Splitting](docs/outdated/code-splitting.md)
47
45
  + [AngularJS Integration and Migration to React on Rails](./docs/additional-reading/angular-js-integration-migration.md)
48
46
 
49
47
  ## **Deployment**
50
- + [Heroku Deployment](./docs/additional-reading/heroku-deployment.md)
48
+ + [Heroku Deployment](docs/basics/heroku-deployment.md)
51
49
  + [Elastic Beanstalk Deployment](./docs/additional-reading/elastic-beanstalk.md)
52
50
 
53
- ## Older, Non-Webpack Docs
54
- + [Setting up Hot Reloading during Rails Development, API docs](./docs/api/ruby-api-hot-reload-view-helpers.md)
51
+ ## Outdated Non-Webpack Docs
55
52
  + [Developing with the Webpack Dev Server](./docs/additional-reading/webpack-dev-server.md)
56
- + [Webpack, the Asset Pipeline, and Using Assets w/ React](./docs/additional-reading/rails-assets-relative-paths.md)
57
- + [Hot Reloading of Assets For Rails Development for Asset Pipeline](docs/additional-reading/hot-reloading-rails-development-asset-pipeline.md)
53
+ + [Webpack, the Asset Pipeline, and Using Assets w/ React](./docs/outdated/rails-assets-relative-paths.md)
58
54
 
59
55
  ## **[CONTRIBUTING](CONTRIBUTING.md)**
60
56
  + [Generator Testing](./docs/contributor-info/generator-testing.md)
data/book.json CHANGED
@@ -7,12 +7,12 @@
7
7
  "url": "https://github.com/shakacode/react_on_rails/"
8
8
  },
9
9
  "sharing": {
10
- "facebook": true,
11
- "twitter": true,
12
- "google": true,
13
- "weibo": true,
10
+ "facebook": true,
11
+ "twitter": true,
12
+ "google": true,
13
+ "weibo": true,
14
14
  "instapaper": true,
15
- "vk": true
15
+ "vk": true
16
16
  }
17
17
  }
18
18
  }
@@ -1,20 +1,12 @@
1
- # Asset Pipeline
1
+ # Asset Pipeline with React on Rails
2
2
 
3
- The plumbing of webpack produced assets through the asset pipeline is deprecated as of v9.0.
3
+ In general, you should not be mixing the asset pipeline with rails/webpacker and React on Rails.
4
4
 
5
- The information in this document is here for those that have not yet upgraded.
5
+ If you're using React, then all of your CSS and images should be under either `/client` or
6
+ `/app/javascript` or wherever you want your client side application.
6
7
 
8
+ If you are incrementally migrating a large application, your main concern will be how to minimize
9
+ duplication of styles and images between your old application and the new one.
7
10
 
8
-
9
-
10
- This option still works for your `/config/initializers/react_on_rails.rb` if you are still using the
11
- asset pipeline.
12
- ```
13
- ################################################################################
14
- # MISCELLANEOUS OPTIONS
15
- ################################################################################
16
- # If you want to use webpack for CSS and images, and still use the asset pipeline,
17
- # see https://github.com/shakacode/react_on_rails/blob/master/docs/additional-reading/rails-assets.md
18
- # And you will use a setting like this.
19
- config.symlink_non_digested_assets_regex = /\.(png|jpg|jpeg|gif|tiff|woff|ttf|eot|svg|map)/
20
- ```
11
+ Please email [justin@shakacode.com](mailto:justin@shakacode.com) if you would be interested in help
12
+ to migrate a larger application.
@@ -1,12 +1,13 @@
1
1
  # Using React Helmet to build `<head>` content
2
2
 
3
3
  ## Installation and general usage
4
- See https://github.com/nfl/react-helmet for details. Run `yarn add react-helmet` in your `client` directory to add this package to your application.
4
+ See [nfl/react-helmet](https://github.com/nfl/react-helmet) for details on how to use this package.
5
+ Run `yarn add react-helmet` to add this package to your application.
5
6
 
6
7
  ## Example
7
8
  Here is what you need to do in order to configure your Rails application to work with **ReactHelmet**.
8
9
 
9
- Create generator function for server rendering like this:
10
+ Create a render-function for server rendering like this:
10
11
 
11
12
  ```javascript
12
13
  export default (props, _railsContext) => {
@@ -20,17 +21,35 @@ export default (props, _railsContext) => {
20
21
  return { renderedHtml };
21
22
  };
22
23
  ```
23
- You can add more **helmet** properties to result, e.g. **meta**, **base** and so on. See https://github.com/nfl/react-helmet#server-usage.
24
+ You can add more **helmet** properties to the result, e.g. **meta**, **base** and so on. See https://github.com/nfl/react-helmet#server-usage.
24
25
 
25
- Use regular component or generator function for client-side:
26
+ Use a regular React functional or class component or a render-function for your client-side bundle:
26
27
 
27
28
  ```javascript
28
- export default (props, _railsContext) => (
29
+ // React functional component
30
+ export default (props) => (
29
31
  <App {...props} />
30
32
  );
31
33
  ```
32
34
 
33
- Put **ReactHelmet** component somewhere in your `<App>`:
35
+ Or a render-function. Note you can't return just the JSX (React element), but you need to return
36
+ either a React functional or class component.
37
+ ```javascript
38
+ // React functional component
39
+ export default (props, railsContext) => (
40
+ () => <App {{railsContext, ...props}} />
41
+ );
42
+ ```
43
+
44
+ Note, this doesn't work, because this function just returns a React element rather than a React component
45
+ ```javascript
46
+ // React functional component
47
+ export default (props, railsContext) => (
48
+ <App {{railsContext, ...props}} />
49
+ );
50
+ ```
51
+
52
+ Put the **ReactHelmet** component somewhere in your `<App>`:
34
53
  ```javascript
35
54
  import { Helmet } from 'react-helmet';
36
55
 
@@ -55,15 +74,18 @@ ReactOnRails.register({
55
74
  });
56
75
  ```
57
76
  ```javascript
77
+ // Note the import from the server file.
58
78
  import ReactHelmetApp from '../ReactHelmetServerApp';
59
79
 
60
80
  ReactOnRails.register({
61
81
  ReactHelmetApp
62
82
  });
63
83
  ```
64
- Now when the `react_component_hash` helper is called with **"ReactHelmetApp"** as a first argument it will return a hash instead of HTML string:
84
+ Now when the `react_component_hash` helper is called with **"ReactHelmetApp"** as a first argument it
85
+ will return a hash instead of HTML string. Note, there is no need to specify "prerender" as it would not
86
+ make sense to use react_component_hash without server rendering:
65
87
  ```ruby
66
- <% react_helmet_app = react_component_hash("ReactHelmetApp", prerender: true, props: { hello: "world" }, trace: true) %>
88
+ <% react_helmet_app = react_component_hash("ReactHelmetApp", props: { hello: "world" }, trace: true) %>
67
89
 
68
90
  <% content_for :title do %>
69
91
  <%= react_helmet_app['title'] %>
@@ -76,5 +98,3 @@ So now we're able to insert received title tag to our application layout:
76
98
  ```ruby
77
99
  <%= yield(:title) if content_for?(:title) %>
78
100
  ```
79
-
80
- Note: Use of `react_component` for this functionality is deprecated. Please use `react_component_hash` instead.
@@ -1,39 +1,28 @@
1
+ _This article needs updating for the latest version of React Router_
2
+
1
3
  # Using React Router
2
4
 
3
- React on Rails supports the use of React Router. Client-side code doesn't need any special configuration for the React on Rails gem. Implement React Router how you normally would. Note, you might want to avoid using Turbolinks as both Turbolinks and React-Router will be trying to handle the back and forward buttons. If you get this figured out, please do share with the community! Otherwise, you might have to tweak the basic settings for Turbolinks, and this may or may not be worth the effort.
4
5
 
5
- When attempting to use server-rendering, it is necessary to take steps that prevent rendering when there is a router error or redirect. In these cases, the client code should return an object containing the `error` and a `redirectLocation` instead of the React component. The `react_component` helper method in your Rails view will automatically detect that there was an error/redirect and handle it accordingly.
6
+ React on Rails supports the use of React Router. Client-side code doesn't need any special configuration for the React on Rails gem. Implement React Router how you normally would. Note, you might want to avoid using Turbolinks as both Turbolinks and React-Router will be trying to handle the back and forward buttons. If you get this figured out, please do share with the community! Otherwise, you might have to tweak the basic settings for Turbolinks, and this may or may not be worth the effort.
6
7
 
7
8
  If you are working with the HelloWorldApp created by the react_on_rails generator, then the code below corresponds to the module in `client/app/bundles/HelloWorld/startup/HelloWorldApp.jsx`.
8
9
 
9
10
  ```js
11
+
12
+ import { BrowserRouter, Switch } from 'react-router-dom'
13
+ import routes from './routes.jsx'
14
+
10
15
  const RouterApp = (props, railsContext) => {
11
- let error;
12
- let redirectLocation;
13
- let routeProps;
14
- const { location } = railsContext;
15
-
16
16
  // create your hydrated store
17
17
  const store = createStore(props);
18
-
19
- // See https://github.com/reactjs/react-router/blob/master/docs/guides/ServerRendering.md
20
- match({ routes, location }, (_error, _redirectLocation, _routeProps) => {
21
- error = _error;
22
- redirectLocation = _redirectLocation;
23
- routeProps = _routeProps;
24
- });
25
-
26
- // This tell react_on_rails to skip server rendering any HTML. Note, client rendering
27
- // will handle the redirect. What's key is that we don't try to render.
28
- // Critical to return the Object properties to match this { error, redirectLocation }
29
- if (error || redirectLocation) {
30
- return { error, redirectLocation };
31
- }
32
-
33
- // Important that you don't do this if you are redirecting or have an error.
18
+
34
19
  return (
35
20
  <Provider store={store}>
36
- <RouterContext {...routeProps} />
21
+ <BrowserRouter>
22
+ <Switch>
23
+ {routes}
24
+ </Switch>
25
+ </BrowserRouter>
37
26
  </Provider>
38
27
  );
39
28
  };
@@ -50,64 +39,52 @@ For a fleshed out integration of react_on_rails with react-router, check out [Re
50
39
 
51
40
  # Server Rendering Using React Router V4
52
41
 
53
- Your generator function may not return an object with the property `renderedHtml`. Thus, you call
42
+ Your render function may not return an object with the property `renderedHtml`. Thus, you call
54
43
  renderToString() and return an object with this property.
55
44
 
56
45
  This example **only applies to server rendering** and should be only used in the server side bundle.
57
46
 
58
- From the [original example in the ReactRouter docs](https://react-router.now.sh/ServerRouter)
47
+ From the [original example in the ReactRouter docs](https://github.com/ReactTraining/react-router/blob/v4.3.1/packages/react-router-dom/docs/guides/server-rendering.md)
59
48
 
60
49
  ```javascript
61
50
  import React from 'react'
62
51
  import { renderToString } from 'react-dom/server'
63
- import { ServerRouter, createServerRenderContext } from 'react-router'
64
-
65
- const ReactRouterComponent = (props, railsContext) => {
66
-
67
- // first create a context for <ServerRouter>, it's where we keep the
68
- // results of rendering for the second pass if necessary
69
- const context = createServerRenderContext()
70
- const { location } = railsContext;
71
-
72
- // render the first time
73
- let markup = renderToString(
74
- <ServerRouter
75
- location={location}
76
- context={context}
77
- >
78
- <App/>
79
- </ServerRouter>
80
- )
81
-
82
- // get the result
83
- const result = context.getResult()
84
-
85
- // the result will tell you if it redirected, if so, we ignore
86
- // the markup and send a proper redirect.
87
- if (result.redirect) {
88
- return {
89
- redirectLocation: result.redirect.pathname
90
- };
91
- } else {
92
-
93
- // the result will tell you if there were any misses, if so
94
- // we can send a 404 and then do a second render pass with
95
- // the context to clue the <Miss> components into rendering
96
- // this time (on the client they know from componentDidMount)
97
- if (result.missed) {
98
- // React on Rails does not support the 404 status code for the browser.
99
- // res.writeHead(404)
100
-
101
- markup = renderToString(
102
- <ServerRouter
103
- location={location}
104
- context={context}
105
- >
106
- <App/>
107
- </ServerRouter>
108
- )
109
- }
110
- return { renderedHtml: markup };
111
- }
52
+ import { StaticRouter } from 'react-router'
53
+ import { Provider } from 'react-redux'
54
+ import ReactOnRails from 'react-on-rails'
55
+
56
+ // App.jsx from src/client/App.jsx
57
+ import App from '../App'
58
+
59
+ const ReactServerRenderer = (props, railsContext) => {
60
+ const context = {}
61
+
62
+ // commentStore from src/server/store/commentStore
63
+ const store = ReactOnRails.getStore('../store/commentStore')
64
+
65
+ // Route Store generated from react-on-rails
66
+
67
+ const { location } = railsContext
68
+
69
+ const html = ReactDOMServer.renderToString(
70
+ <Provider store={store}>
71
+ <StaticRouter
72
+ location={location}
73
+ context={context}
74
+ props={props}
75
+ >
76
+ <App />
77
+ </StaticRouter>
78
+ </ Provider>
79
+ )
80
+
81
+ if (context.url) {
82
+ // Somewhere a `<Redirect>` was rendered
83
+ redirect(301, context.url)
84
+ } else {
85
+ // we're good, send the response
86
+ return { renderedHtml: html };
87
+ }
88
+ }
112
89
  }
113
90
  ```
@@ -1,14 +1,19 @@
1
1
  # Server Rendering Tips
2
2
 
3
- Be sure to use mini_racer. See [issues/428](https://github.com/shakacode/react_on_rails/issues/428)
3
+ For the best performance with Server Rendering, consider using [React on Rails Pro]
4
+
5
+ Be sure to use mini_racer. See [issues/428](https://github.com/shakacode/react_on_rails/issues/428).
6
+
7
+
4
8
 
5
9
  ## General Tips
6
- - Your code can't reference `document`. Server side JS execution does not have access to `document`, so jQuery and some
7
- other libs won't work in this environment. You can debug this by putting in `console.log`
8
- statements in your code.
9
- - You can conditionally avoid running code that references document by passing in a boolean prop to your top level react
10
- component. Since the passed in props Hash from the view helper applies to client and server side code, the best way to
11
- do this is to use a generator function.
10
+ - Your code can't reference `document`. Server side JS execution does not have access to `document`,
11
+ so jQuery and some other libs won't work in this environment. You can debug this by putting in
12
+ `console.log` statements in your code.
13
+ - You can conditionally avoid running code that references document by either checking if `window`
14
+ is defined or using the "railsContext"
15
+ your top level react component. Since the passed in props Hash from the view helper applies to
16
+ client and server side code, the best way to do this is to use a render function.
12
17
  - If you're serious about server rendering, it's worth the effort to have different entry points for client and server rendering. It's worth the extra complexity. The point is that you have separate files for top level client or server side, and you pass some extra option indicating that rendering is happening server side.
13
18
  - You can enable Node.js server rendering via [React on Rails Pro](https://github.com/shakacode/react_on_rails/wiki).
14
19
 
@@ -25,10 +25,10 @@ The best source of docs is the main [ReactOnRails.js](https://github.com/shakaco
25
25
  /**
26
26
  * Main entry point to using the react-on-rails npm package. This is how Rails will be able to
27
27
  * find you components for rendering. Components get called with props, or you may use a
28
- * "generator function" to return a React component or an object with the following shape:
28
+ * "render function" to return a React component or an object with the following shape:
29
29
  * { renderedHtml, redirectLocation, error }.
30
- * For server rendering, if you wish to return multiple HTML strings from a generator function,
31
- * you may return an Object from your generator function with a single top level property of
30
+ * For server rendering, if you wish to return multiple HTML strings from a render function,
31
+ * you may return an Object from your render function with a single top level property of
32
32
  * renderedHtml. Inside this Object, place a key called componentHtml, along with any other
33
33
  * needed keys. This is useful when you using side effects libraries like react helmet.
34
34
  * Your Ruby code with get this Object as a Hash containing keys componentHtml and any other
@@ -1,8 +1,10 @@
1
1
  # Redux Store
2
2
 
3
- First things first. You don't need to use the `redux_store` api to use redux. This api was setup to support multiple calls to `react_component` on one page that all talk to the same redux store.
3
+ _This redux API is no longer recommended as it prevents dynamic code splitting for performance. Instead, you should use the standard react_component view helper passing in a "render function."_
4
4
 
5
- If you are only rendering one react component on a page, as is typical to do a "Single Page App" in React, then you should _probably_ pass the props to your React component in a "generator function."
5
+ You don't need to use the `redux_store` api to use redux. This api was setup to support multiple calls to `react_component` on one page that all talk to the same redux store.
6
+
7
+ If you are only rendering one react component on a page, as is typical to do a "Single Page App" in React, then you should _probably_ pass the props to your React component in a "render function."
6
8
 
7
9
  Consider using the `redux_store` helper for the two following use cases:
8
10
 
@@ -22,7 +22,7 @@ Uncommonly used options:
22
22
  id: nil,
23
23
  ```
24
24
 
25
- - **component_name:** Can be a React component, created using an ES6 class or a generator function that returns a React component (or, only on the server side, an object with shape { redirectLocation, error, renderedHtml }), or a "renderer function" that manually renders a React component to the dom (client side only).
25
+ - **component_name:** Can be a React component, created using an ES6 class or a render function that returns a React component (or, only on the server side, an object with shape { redirectLocation, error, renderedHtml }), or a "renderer function" that manually renders a React component to the dom (client side only).
26
26
  All options except `props, id, html_options` will inherit from your `react_on_rails.rb` initializer, as described [here](../basics/configuration.md).
27
27
  - **general options:**
28
28
  - **props:** Ruby Hash which contains the properties to pass to the react object, or a JSON string. If you pass a string, we'll escape it for you.
@@ -45,7 +45,7 @@ adding meta-tags to a page. It is exactly like react_component except for the fo
45
45
 
46
46
  1. `prerender: true` is automatically added to options, as this method doesn't make sense for
47
47
  client only rendering.
48
- 2. Your JavaScript generator function for server rendering must return an Object rather than a React Component.
48
+ 2. Your JavaScript render function for server rendering must return an Object rather than a React Component.
49
49
  3. Your view code must expect an object and not a string.
50
50
 
51
51
  Here is an example of ERB view code:
@@ -73,7 +73,6 @@ export default (props, _railsContext) => {
73
73
  };
74
74
  return { renderedHtml };
75
75
  };
76
-
77
76
  ```
78
77
 
79
78
  ------------
@@ -99,11 +98,11 @@ You can call `rails_context` or `rails_context(server_side: true|false)` from yo
99
98
 
100
99
  ### Renderer Functions (function that will call ReactDOM.render or ReactDOM.hydrate)
101
100
 
102
- A "renderer function" is a generator function that accepts three arguments (rather than 2): `(props, railsContext, domNodeId) => { ... }`. Instead of returning a React component, a renderer is responsible for installing a callback that will call `ReactDOM.render` (in React 16+, `ReactDOM.hydrate`) to render a React component into the DOM. The "renderer function" is called at the same time the document ready event would instantate the React components into the DOM.
101
+ A "renderer function" is a render function that accepts three arguments (rather than 2): `(props, railsContext, domNodeId) => { ... }`. Instead of returning a React component, a renderer is responsible for installing a callback that will call `ReactDOM.render` (in React 16+, `ReactDOM.hydrate`) to render a React component into the DOM. The "renderer function" is called at the same time the document ready event would instantate the React components into the DOM.
103
102
 
104
- Why would you want to call `ReactDOM.hydrate` yourself? One possible use case is [code splitting](../misc-pending/code-splitting.md). In a nutshell, you don't want to load the React component on the DOM node yet. So you want to install some handler that will call `ReactDOM.hydrate` at a later time. In the case of code splitting with server rendering, the server rendered code has any async code loaded and used to server render. Thus, the client code must also fully load any asynch code before server rendering. Otherwise, the client code would first render partially, not matching the server rendering, and then a second later, the full code would render, resulting in an unpleasant flashing on the screen.
103
+ Why would you want to call `ReactDOM.hydrate` yourself? One possible use case is [code splitting](docs/outdated/code-splitting.md). In a nutshell, you don't want to load the React component on the DOM node yet. So you want to install some handler that will call `ReactDOM.hydrate` at a later time. In the case of code splitting with server rendering, the server rendered code has any async code loaded and used to server render. Thus, the client code must also fully load any asynch code before server rendering. Otherwise, the client code would first render partially, not matching the server rendering, and then a second later, the full code would render, resulting in an unpleasant flashing on the screen.
105
104
 
106
- Renderer functions are not meant to be used on the server since there's no DOM on the server. Instead, use a generator function. Attempting to server render with a renderer function will throw an error.
105
+ Renderer functions are not meant to be used on the server since there's no DOM on the server. Instead, use a render function. Attempting to server render with a renderer function will throw an error.
107
106
 
108
107
  ------------
109
108
 
@@ -113,7 +112,7 @@ Renderer functions are not meant to be used on the server since there's no DOM o
113
112
 
114
113
  1. [React on Rails docs for react-router](../additional-reading/react-router.md)
115
114
  2. Examples in [spec/dummy/app/views/react_router](../../spec/dummy/app/views/react_router) and follow to the JavaScript code in the [spec/dummy/client/app/startup/ServerRouterApp.jsx](../../spec/dummy/client/app/startup/ServerRouterApp.jsx).
116
- 3. [Code Splitting docs](../misc-pending/code-splitting.md) for information about how to set up code splitting for server rendered routes.
115
+ 3. [Code Splitting docs](docs/outdated/code-splitting.md) for information about how to set up code splitting for server rendered routes.
117
116
 
118
117
  ------------
119
118