react_on_rails 11.2.2 → 12.0.0.pre.beta.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (100) 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 -20
  11. data/CHANGELOG.md +73 -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 +137 -95
  16. data/Rakefile +0 -7
  17. data/SUMMARY.md +9 -12
  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 +7 -8
  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/minitest-configuration.md +31 -0
  33. data/docs/basics/react-server-rendering.md +1 -1
  34. data/docs/basics/recommended-project-structure.md +5 -22
  35. data/docs/basics/{generator-functions-and-railscontext.md → render-functions-and-railscontext.md} +59 -21
  36. data/docs/basics/rspec-configuration.md +29 -18
  37. data/docs/basics/upgrading-react-on-rails.md +69 -3
  38. data/docs/basics/webpack-configuration.md +18 -8
  39. data/docs/contributor-info/errors-with-hooks.md +45 -0
  40. data/docs/contributor-info/pull-requests.md +44 -0
  41. data/docs/misc/doctrine.md +1 -1
  42. data/docs/{misc-pending → outdated}/code-splitting.md +12 -8
  43. data/docs/{basics → outdated}/how-react-on-rails-works.md +8 -4
  44. data/docs/{misc-pending → outdated}/manual-installation-overview.md +5 -5
  45. data/docs/{additional-reading → outdated}/rails-assets-relative-paths.md +3 -3
  46. data/docs/{misc-pending → outdated}/rails-assets.md +2 -12
  47. data/docs/{misc → outdated}/rails3.md +0 -0
  48. data/docs/testimonials/testimonials.md +3 -3
  49. data/docs/tutorial.md +96 -70
  50. data/jest.config.js +4 -0
  51. data/lib/generators/react_on_rails/base_generator.rb +2 -2
  52. data/lib/generators/react_on_rails/dev_tests_generator.rb +1 -1
  53. data/lib/generators/react_on_rails/generator_helper.rb +4 -6
  54. data/lib/generators/react_on_rails/templates/base/base/Procfile.dev +3 -1
  55. data/lib/generators/react_on_rails/templates/base/base/Procfile.dev-hmr +26 -0
  56. data/lib/generators/react_on_rails/templates/base/base/app/javascript/bundles/HelloWorld/components/HelloWorld.jsx +20 -40
  57. data/lib/generators/react_on_rails/templates/base/base/config/initializers/react_on_rails.rb +4 -1
  58. data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/components/HelloWorld.jsx +4 -8
  59. data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/store/helloWorldStore.js +1 -3
  60. data/lib/react_on_rails.rb +3 -1
  61. data/lib/react_on_rails/configuration.rb +58 -28
  62. data/lib/react_on_rails/error.rb +2 -0
  63. data/lib/react_on_rails/helper.rb +48 -92
  64. data/lib/react_on_rails/json_parse_error.rb +2 -0
  65. data/lib/react_on_rails/locales/base.rb +150 -0
  66. data/lib/react_on_rails/locales/to_js.rb +37 -0
  67. data/lib/react_on_rails/locales/to_json.rb +27 -0
  68. data/lib/react_on_rails/prerender_error.rb +11 -15
  69. data/lib/react_on_rails/react_component/render_options.rb +4 -0
  70. data/lib/react_on_rails/server_rendering_pool/ruby_embedded_java_script.rb +41 -46
  71. data/lib/react_on_rails/test_helper/ensure_assets_compiled.rb +7 -8
  72. data/lib/react_on_rails/test_helper/webpack_assets_compiler.rb +17 -0
  73. data/lib/react_on_rails/utils.rb +14 -19
  74. data/lib/react_on_rails/version.rb +1 -1
  75. data/lib/react_on_rails/version_checker.rb +1 -0
  76. data/lib/react_on_rails/webpacker_utils.rb +19 -2
  77. data/lib/tasks/assets.rake +29 -47
  78. data/lib/tasks/locale.rake +4 -2
  79. data/package-scripts.yml +11 -8
  80. data/package.json +29 -28
  81. data/rakelib/dummy_apps.rake +1 -9
  82. data/rakelib/example_type.rb +3 -1
  83. data/rakelib/examples.rake +3 -0
  84. data/rakelib/lint.rake +2 -7
  85. data/rakelib/node_package.rake +2 -2
  86. data/rakelib/release.rake +0 -6
  87. data/rakelib/run_rspec.rake +5 -18
  88. data/react_on_rails.gemspec +4 -5
  89. data/tsconfig.json +14 -0
  90. data/webpackConfigLoader.js +3 -2
  91. data/yarn.lock +4333 -2209
  92. metadata +47 -57
  93. data/Gemfile.rails32 +0 -73
  94. data/docs/additional-reading/babel.md +0 -5
  95. data/docs/additional-reading/heroku-deployment.md +0 -92
  96. data/docs/additional-reading/hot-reloading-rails-development-asset-pipeline.md +0 -47
  97. data/docs/api/ruby-api-hot-reload-view-helpers.md +0 -44
  98. data/lib/generators/react_on_rails/templates/base/base/Procfile.dev-server +0 -12
  99. data/lib/react_on_rails/assets_precompile.rb +0 -153
  100. data/lib/react_on_rails/locales_to_js.rb +0 -138
File without changes
@@ -1,13 +1,13 @@
1
1
  # Testimonials
2
- # [HVMN Testimonial, Written by Paul Benigeri, October 12, 2018](./testimonials/hvmn.md)
2
+ # [HVMN Testimonial, Written by Paul Benigeri, October 12, 2018](./hvmn.md)
3
3
 
4
4
  > The price we paid for the consultation + the React on Rails pro license has already been made back a couple of times from hosting fees alone. The entire process was super hands off, and our core team was able to focus on shipping new feature during that sprint.
5
5
 
6
- Full writeup [here](./testimonials/hvmn.md).
6
+ Full writeup [here](./hvmn.md).
7
7
 
8
8
  ---
9
9
 
10
- # [Leora from ResortPass](./testimonials/resortpass.md), December 10, 2018
10
+ # [Leora from ResortPass](./resortpass.md), December 10, 2018
11
11
 
12
12
  Justin and his team were instrumental in assisting us in setting design foundations and standards for our transition to a react on rails application. Just three months of work with the team at Shaka code and we have a main page of our application server-side rendering at exponentially improved speeds.
13
13
 
@@ -1,6 +1,8 @@
1
1
  # React on Rails Basic Tutorial
2
2
 
3
- This tutorial guides you through setting up a new or existing Rails app with **React on Rails**, demonstrating Rails + React + Redux + Server Rendering. It is updated to 11.2.1.
3
+ *Updated for Ruby 2.7.1, Rails 6.0.3.1, and React on Rails v12.0.0*
4
+
5
+ This tutorial guides you through setting up a new or existing Rails app with **React on Rails**, demonstrating Rails + React + Redux + Server Rendering.
4
6
 
5
7
  After finishing this tutorial you will get an application that can do the following (live on Heroku):
6
8
 
@@ -17,9 +19,9 @@ By the time you read this, the latest may have changed. Be sure to check the ver
17
19
 
18
20
  _Note: some of the screen images below show the "npm" command. react_on_rails 6.6.0 and greater uses `yarn`._
19
21
 
20
- ## Setting up the environment
22
+ ## Setting up your environment
21
23
 
22
- Trying out **React on Rails** is super easy, so long as you have the basic prerequisites. This includes the basics for Rails 5.x and node version 6+. I recommend `rvm` and `nvm` to install Ruby and Node, and [brew](https://brew.sh/) to install [yarn](https://yarnpkg.com/en/docs/install#mac-tab). Rails can be installed as an ordinary gem.
24
+ Trying out **React on Rails** is super easy, so long as you have the basic prerequisites. This includes the basics for Rails 6.x and node version 13+. I recommend `rvm` and `nvm` to install Ruby and Node, and [brew](https://brew.sh/) to install [yarn](https://yarnpkg.com/en/docs/install#mac-tab). Rails can be installed as an ordinary gem.
23
25
 
24
26
  ```
25
27
  nvm install node # download and install latest stable Node
@@ -27,15 +29,15 @@ nvm alias default node # make it default version
27
29
  nvm list # check
28
30
 
29
31
  brew install yarn # you can use other installer if desired
30
- 11\.\d+\.\d+
31
- rvm install 2.5.0 # download and install latest stable Ruby (update to exact version)
32
- rvm use 2.5.0 --default # use it and make it default
32
+ rvm install 2.7 # download and install latest stable Ruby (update to exact version)
33
+ rvm use 2.7 --default # use it and make it default
33
34
  rvm list # check
34
35
 
35
36
  gem install rails # download and install latest stable Rails
36
37
  gem install foreman # download and install Foreman
37
38
  ```
38
39
 
40
+ ## Create a new Ruby on Rails App
39
41
  Then we need to create a fresh Rails application with webpacker react support as following.
40
42
 
41
43
  First be sure to run `rails -v` and check you are using Rails 5.1.3 or above. If you are using an older version of Rails, you'll need to install webpacker with react per the instructions [here](https://github.com/rails/webpacker).
@@ -43,98 +45,87 @@ First be sure to run `rails -v` and check you are using Rails 5.1.3 or above. If
43
45
  ```
44
46
  cd <directory where you want to create your new Rails app>
45
47
 
46
- # any name you like for the rails app
47
- rails new test-react-on-rails --webpack=react
48
+ # Any name you like for the rails app
49
+ # Skip javascript so will add that next and get the current version
50
+ rails new --skip-sprockets -J --skip-turbolinks test-react-on-rails-v12-no-sprockets
48
51
 
49
52
  cd test-react-on-rails
50
53
  bundle
51
54
  ```
52
55
 
53
- Note: if you are installing React On Rails in an existing app or an app that uses **Rails pre 5.1.3** (*not for Rails > 5.2*), you will need to run these two commands as well:
56
+ ## Add the webpacker gem
54
57
 
55
58
  ```
56
- bundle exec rails webpacker:install
57
- bundle exec rails webpacker:install:react
59
+ bundle add webpacker
60
+ bundle add react_on_rails
58
61
  ```
59
62
 
60
- Add the **React On Rails** gem to your Gemfile:
63
+ ## Run the webpacker generator
61
64
 
62
65
  ```
63
- gem 'react_on_rails', '11.2.1' # prefer exact gem version to match npm version
66
+ bundle exec rails webpacker:install
67
+ bundle exec rails webpacker:install:react
64
68
  ```
65
69
 
66
- Note: Latest released React On Rails version is considered stable. Please use the latest version to ensure you get all the security patches and the best support.
67
-
68
- Run `bundle` and commit the git repository (or `rails generate` will not work properly)
69
-
70
+ Let's commit everything before installing React on Rails.
70
71
 
71
72
  ```
72
- bundle
73
-
74
73
  # Here are git commands to make a new git repo and commit everything.
75
74
  # Newer versions of Rails create the git repo by default.
76
75
  git add -A
77
76
  git commit -m "Initial commit"
78
77
  ```
79
78
 
80
- Install React on Rails: `rails generate react_on_rails:install` or `rails generate react_on_rails:install --redux`. You need to first git commit your files before running the generator, or else it will generate an error.
79
+ ## Add the **React On Rails** gem to your `Gemfile`:
80
+
81
+ To avoid issues regarding inconsistent gem and npm versions, you should specify the exact versions
82
+ of both the gem and npm package. In other words, don't use the `^` or `~` in the version specifications.
81
83
 
82
84
  ```
83
- rails generate react_on_rails:install
84
- bundle && yarn
85
+ gem 'react_on_rails', '12.0.0' # prefer exact gem version to match npm version
85
86
  ```
86
87
 
87
- Then run server with static client side files:
88
+ Note: The latest released React On Rails version is considered stable. Please use the latest
89
+ version to ensure you get all the security patches and the best support.
88
90
 
89
- ```
90
- foreman start -f Procfile.dev
91
- ```
91
+ Run `bundle` and commit the changes.
92
92
 
93
- To run with the webpack-dev-server:
94
- ```
95
- foreman start -f Procfile.dev-server
96
93
  ```
94
+ bundle
97
95
 
98
- Visit [http://localhost:3000/hello_world](http://localhost:3000/hello_world) and see your **React On Rails** app running!
99
- Note, foreman defaults to PORT 5000 unless you set the value of PORT in your environment or in the Procfile.
96
+ git commit -am "Added React on Rails Gem"
97
+ ```
100
98
 
101
- ## Using a pre-release of rails/webpacker
102
- Until `rails/webpacker` v4 ships, or if you ever want to try out the master branch, you can modify the React on Rails tutorial instructions slightly. You can see the sequence of commits here. To summarize:
99
+ Install React on Rails: `rails generate react_on_rails:install`. You need to first git commit your files before running the generator, or else it will generate an error.
103
100
 
104
- Don't `run rails new with the --webpack=react option`. Instead, add the webpacker gem to the Gemfile such that it points to master, like this if `11.2.1` is the version you want.
101
+ Note, using `redux` is no longer recommended as the basic installer uses React Hooks.
102
+ If you want the redux install: `rails generate react_on_rails:install --redux`
105
103
 
106
- ```ruby
107
- gem 'webpacker', github: "rails/webpacker"
108
- gem 'react_on_rails', '11.2.1' # always use exact version
109
104
  ```
110
-
111
- Then run these commands:
112
-
113
- ```sh
114
- bundle exec rails webpacker:install
115
- yarn add "rails/webpacker" # because the installer has a bug that puts in an invalid version in your package.json.
116
- bundle exec rails webpacker:install:react
117
- yarn add --dev webpack-dev-server
118
- run rails generate react_on_rails:install && bundle && yarn
105
+ rails generate react_on_rails:install
119
106
  ```
120
107
 
121
- ### Custom IP & PORT setup (Cloud9 example)
108
+ Then run server with a static client bundle. Static means that the bundle is saved in your
109
+ public/webpack/packs directory.
122
110
 
123
- In case you are running some custom setup with different IP or PORT you should also edit Procfile.dev. For example to be able to run on free Cloud9 IDE we are putting IP 0.0.0.0 and PORT 8080. The default generated file `Procfile.dev` uses `-p 3000`.
111
+ ```
112
+ foreman start -f Procfile.dev
113
+ ```
124
114
 
125
- ``` Procfile.dev
126
- web: rails s -p 8080 -b 0.0.0.0
115
+ ## To run with the webpack-dev-server:
116
+ ```
117
+ foreman start -f Procfile.dev-hmr
127
118
  ```
128
119
 
129
- Then visit https://your-shared-addr.c9users.io:8080/hello_world
120
+ Visit [http://localhost:3000/hello_world](http://localhost:3000/hello_world) and see your **React On Rails** app running!
130
121
 
122
+ # HMR vs. React Hot Reloading
131
123
 
132
- ## RubyMine
124
+ First, check that the `hmr` and the `inline` options are `true` in your `config/webpacker.yml` file.
133
125
 
134
- It's super important to exclude certain directories from RubyMine or else it will slow to a crawl as it tries to parse all the npm files.
135
-
136
- * Generated files, per the settings in your `config/webpacker.yml`, which default to `public/packs` and `public/packs-test`
137
- * `node_modules`
126
+ The basic setup will have HMR working with the default webpacker setup. The basic
127
+ [HMR](https://webpack.js.org/concepts/hot-module-replacement/), without a special
128
+ React setup, will cause a full page refresh each time you save a file.
138
129
 
139
130
  ## Deploying to Heroku
140
131
 
@@ -157,17 +148,16 @@ Set heroku to use multiple buildpacks:
157
148
 
158
149
  ### Swap out sqlite for postgres by doing the following:
159
150
 
160
- 1. Delete the line with `sqlite` and replace it with:
151
+ Run these two commands:
161
152
 
162
- ```ruby
163
- gem 'pg'
164
153
  ```
165
-
166
- 2. Run `bundle`
154
+ bundle remove sqlite3
155
+ bundle add pg
156
+ ```
167
157
 
168
158
  ![07](https://cloud.githubusercontent.com/assets/20628911/17465015/1f2f4042-5cf4-11e6-8287-2fb077550809.png)
169
159
 
170
- 3. Replace your `database.yml` file with this (assuming your app name is "ror").
160
+ ### Replace your `database.yml` file with this (assuming your app name is "ror").
171
161
 
172
162
  ```yml
173
163
  default: &default
@@ -195,7 +185,6 @@ production:
195
185
  Then you need to setup postgres so you can run locally:
196
186
 
197
187
  ```
198
- bundle
199
188
  rake db:setup
200
189
  rake db:migrate
201
190
  ```
@@ -219,7 +208,7 @@ Create `/Procfile`. This is what Heroku uses to start your app.
219
208
  web: bundle exec puma -C config/puma.rb
220
209
  ```
221
210
 
222
- Note, newer versions of Rails create this file automatically. However, the [docs on Heroku](https://devcenter.heroku.com/articles/deploying-rails-applications-with-the-puma-web-server#config) have something a bit different, so please make it conform to those docs. As of 2018-10-13, the docs looked like this:
211
+ Note, newer versions of Rails create this file automatically. However, the [docs on Heroku](https://devcenter.heroku.com/articles/deploying-rails-applications-with-the-puma-web-server#config) have something a bit different, so please make it conform to those docs. As of 2020-06-04, the docs looked like this:
223
212
 
224
213
  `config/puma.rb`
225
214
  ```rb
@@ -240,10 +229,19 @@ on_worker_boot do
240
229
  end
241
230
  ```
242
231
 
232
+ Next, update your `package.json` to specify the version of yarn and node. Add this section:
233
+
234
+ ```json
235
+ "engines": {
236
+ "node": "13.9.0",
237
+ "yarn": "1.22.4"
238
+ },
239
+ ```
240
+
243
241
  Then after all changes are done don't forget to commit them with git and finally you can push your app to Heroku!
244
242
 
245
243
  ```
246
- git add -a
244
+ git add -A
247
245
  git commit -m "Changes for Heroku"
248
246
  git push heroku master
249
247
  ```
@@ -256,7 +254,6 @@ heroku open
256
254
 
257
255
  and you will see your live app and you can share this URL with your friends. Congrats!
258
256
 
259
-
260
257
  ## Turning on Server Rendering
261
258
 
262
259
  You can turn on server rendering by simply changing the `prerender` option to `true`:
@@ -265,10 +262,20 @@ You can turn on server rendering by simply changing the `prerender` option to `t
265
262
  <%= react_component("HelloWorld", props: @hello_world_props, prerender: true) %>
266
263
  ```
267
264
 
265
+ If you want to test this out with HMR, then you also need to add this line to your
266
+ `config/intializers/react_on_rails.rb`
267
+
268
+ ```ruby
269
+ config.same_bundle_for_client_and_server = true
270
+ ```
271
+
272
+ More likely, you will create a different build file for server rendering. However, if you want to
273
+ use the same file from the webpack-dev-server, you'll need to add that line.
274
+
268
275
  Then push to Heroku:
269
276
 
270
277
  ```
271
- git add -a
278
+ git add -A
272
279
  git commit -m "Enable server rendering"
273
280
  git push heroku master
274
281
  ```
@@ -309,7 +316,7 @@ mv app/javascript client
309
316
 
310
317
  ## Using HMR with the rails/webpacker setup
311
318
 
312
- Start the app using `foreman start -f Procfile.dev-server`.
319
+ Start the app using `foreman start -f Procfile.dev-hmr`.
313
320
 
314
321
  When you change a JSX file and save, the browser will automatically refresh!
315
322
 
@@ -318,11 +325,30 @@ So you get some basics from HMR with no code changes. If you want to go further,
318
325
  * https://github.com/rails/webpacker/blob/master/docs/webpack-dev-server.md
319
326
  * https://webpack.js.org/configuration/dev-server/
320
327
  * https://webpack.js.org/concepts/hot-module-replacement/
321
- * https://gaearon.github.io/react-hot-loader/getstarted/
322
- * https://github.com/gaearon/react-hot-loader
323
328
 
324
329
  React on Rails will automatically handle disabling server rendering if there is only one bundle file created by the Webpack development server by rails/webpacker.
325
330
 
331
+
332
+ ### Custom IP & PORT setup (Cloud9 example)
333
+
334
+ In case you are running some custom setup with different IP or PORT you should also edit Procfile.dev. For example to be able to run on free Cloud9 IDE we are putting IP 0.0.0.0 and PORT 8080. The default generated file `Procfile.dev` uses `-p 3000`.
335
+
336
+ ``` Procfile.dev
337
+ web: rails s -p 8080 -b 0.0.0.0
338
+ ```
339
+
340
+ Then visit https://your-shared-addr.c9users.io:8080/hello_world
341
+
342
+ ## RubyMine
343
+
344
+ It's super important to exclude certain directories from RubyMine or else it will slow to a crawl as it tries to parse all the npm files.
345
+
346
+ * Generated files, per the settings in your `config/webpacker.yml`, which default to `public/packs` and `public/packs-test`
347
+ * `node_modules`
348
+
349
+
350
+
351
+
326
352
  ## Conclusion
327
353
 
328
354
  * Browse the docs either on the [gitbook](https://shakacode.gitbooks.io/react-on-rails/content/) or in the [docs directory on github](https://github.com/shakacode/react_on_rails/tree/master/docs)
@@ -0,0 +1,4 @@
1
+ module.exports = {
2
+ preset: 'ts-jest/presets/js-with-ts',
3
+ testEnvironment: 'jsdom',
4
+ };
@@ -33,7 +33,7 @@ module ReactOnRails
33
33
  app/views/layouts/hello_world.html.erb
34
34
  config/initializers/react_on_rails.rb
35
35
  Procfile.dev
36
- Procfile.dev-server]
36
+ Procfile.dev-hmr]
37
37
  base_files.each { |file| copy_file("#{base_path}#{file}", file) }
38
38
  end
39
39
 
@@ -107,7 +107,7 @@ module ReactOnRails
107
107
  foreman start -f Procfile.dev
108
108
 
109
109
  - To turn on HMR, edit config/webpacker.yml and set HMR to true. Restart the rails server
110
- and bin/webpack-dev-server. Or use Procfile.dev-server.
110
+ and bin/webpack-dev-server. Or use Procfile.dev-hmr.
111
111
 
112
112
  - To server render, change this line app/views/hello_world/index.html.erb to
113
113
  `prerender: true` to see server rendering (right click on page and select "view source").
@@ -50,7 +50,7 @@ module ReactOnRails
50
50
  contents = File.read(package_json)
51
51
  replacement_value = <<-STRING
52
52
  "scripts": {
53
- "postinstall": "yarn link react-on-rails",
53
+ "postinstall": "yalc link react-on-rails",
54
54
  STRING
55
55
  new_client_package_json_contents = contents.gsub(/ {2}"scripts": {/,
56
56
  replacement_value)
@@ -15,13 +15,11 @@ module GeneratorHelper
15
15
  end
16
16
 
17
17
  def setup_file_error(file, data)
18
- # rubocop:disable Layout/IndentHeredoc
19
- <<-MSG
20
- #{file} was not found.
21
- Please add the following content to your #{file} file:
22
- #{data}
18
+ <<~MSG
19
+ #{file} was not found.
20
+ Please add the following content to your #{file} file:
21
+ #{data}
23
22
  MSG
24
- # rubocop:enable Layout/IndentHeredoc
25
23
  end
26
24
 
27
25
  def empty_directory_with_keep_file(destination, config = {})
@@ -4,4 +4,6 @@ web: rails s -p 3000
4
4
  # Next line runs a watch process with webpack to compile the changed files.
5
5
  # When making frequent changes to client side assets, you will prefer building webpack assets
6
6
  # upon saving rather than when you refresh your browser page.
7
- client: sh -c 'rm -rf public/packs/* || true && bundle exec rake react_on_rails:locale && bin/webpack -w'
7
+ # Note, if using React on Rails localization you will need to run
8
+ # `bundle exec rake react_on_rails:locale` before you run bin/webpack
9
+ client: sh -c 'rm -rf public/packs/* || true && bin/webpack -w'
@@ -0,0 +1,26 @@
1
+ # Procfile for development using HMR
2
+
3
+ web: rails s -p 3000
4
+
5
+ # Note, hot and live reloading don't work with the default generator setup on
6
+ # top of the rails/webpacker Webpack config with server rendering.
7
+ # If you have server rendering enabled (prerender is true), you either need to
8
+ # a. Ensure that you have dev_server.hmr and dev_server.inline BOTH set to false,
9
+ # and you have this option in your config/initializers/react_on_rails.rb:
10
+ # config.same_bundle_for_client_and_server = true
11
+ # If you have either config/webpacker.yml option set to true, you'll see errors like
12
+ # "ReferenceError: window is not defined" (if hmr is true)
13
+ # "TypeError: Cannot read property 'prototype' of undefined" (if inline is true)
14
+ # b. Skip using the webpack-dev-server. bin/webpack --watch is typically
15
+ fast enough.
16
+ # c. See the React on Rails README for a link to documentation for how to setup
17
+ # SSR with HMR and React hot loading using the webpack-dev-server only for the
18
+ # client bundles and a static file for the server bundle.
19
+
20
+ # Run the webpack-dev-server for client and maybe server files
21
+ webpack-dev-server: bin/webpack-dev-server
22
+
23
+ # Keep the JS fresh for server rendering. Remove if not server rendering.
24
+ # Especially if you have not configured generation of a server bundle without a hash.
25
+ # as that will conflict with the manifest created by the bin/webpack-dev-server
26
+ # rails-server-assets: SERVER_BUNDLE_ONLY=yes bin/webpack --watch
@@ -1,45 +1,25 @@
1
1
  import PropTypes from 'prop-types';
2
- import React from 'react';
2
+ import React, { useState } from 'react';
3
3
 
4
- export default class HelloWorld extends React.Component {
5
- static propTypes = {
6
- name: PropTypes.string.isRequired, // this is passed from the Rails view
7
- };
4
+ const HelloWorld = (props) => {
5
+ const [name, setName] = useState(props.name);
8
6
 
9
- /**
10
- * @param props - Comes from your rails view.
11
- */
12
- constructor(props) {
13
- super(props);
7
+ return (
8
+ <div>
9
+ <h3>Hello, {name}!</h3>
10
+ <hr />
11
+ <form>
12
+ <label htmlFor="name">
13
+ Say hello to:
14
+ <input id="name" type="text" value={name} onChange={(e) => setName(e.target.value)} />
15
+ </label>
16
+ </form>
17
+ </div>
18
+ );
19
+ };
14
20
 
15
- // How to set initial state in ES6 class syntax
16
- // https://reactjs.org/docs/state-and-lifecycle.html#adding-local-state-to-a-class
17
- this.state = { name: this.props.name };
18
- }
21
+ HelloWorld.propTypes = {
22
+ name: PropTypes.string.isRequired, // this is passed from the Rails view
23
+ };
19
24
 
20
- updateName = (name) => {
21
- this.setState({ name });
22
- };
23
-
24
- render() {
25
- return (
26
- <div>
27
- <h3>
28
- Hello, {this.state.name}!
29
- </h3>
30
- <hr />
31
- <form >
32
- <label htmlFor="name">
33
- Say hello to:
34
- </label>
35
- <input
36
- id="name"
37
- type="text"
38
- value={this.state.name}
39
- onChange={(e) => this.updateName(e.target.value)}
40
- />
41
- </form>
42
- </div>
43
- );
44
- }
45
- }
25
+ export default HelloWorld;