GithubHelp home page GithubHelp logo

treble37 / react-webpack-rails-tutorial Goto Github PK

View Code? Open in Web Editor NEW

This project forked from shakacode/react-webpack-rails-tutorial

0.0 2.0 0.0 1.43 MB

Example of integration of Rails, react, redux, using the react_on_rails gem, webpack, enabling the es7 and jsx transpilers, and node integration. Live Demo:

Home Page: http://www.reactrails.com

License: MIT License

Ruby 47.04% JavaScript 41.09% CSS 1.84% HTML 9.69% Shell 0.35%

react-webpack-rails-tutorial's Introduction

Codeship Status for justin808/react-webpack-rails-tutorial Build Status Coverage Status Dependency Status

React, Redux, React-Bootstrap, ES7, Webpack Rails

Server Rendering via the react_on_rails gem

By Justin Gordon and the Shaka Code Team, www.shakacode.com

  • If this work interests you and you are looking for full or part-time remote work, please click here.
  • ShakaCode is doing Skype plus Slack/Github based coaching for "React on Rails". Click here for more information.
  • Please email us at [email protected] if you have a ReactJs + Rails project and are interested in help from our experienced team.
  • Please file issues for problems and feature requests.
  • Pull requests are welcome! (and a great way to get on the ShakaCode team)
  • Feel free to open discussions at forum.shakacode.com. We love to help!
  • We now have a gitter chat room for this topic but we prefer our Slack Channel (email us for an invite).
  • Check out the react_on_rails gem for easy webpack integration.
  • If you came to here from the blog article, this example project has evolved. See pull requests.

A Full tutorial article can be found at: Fast Rich Client Rails Development With Webpack and the ES6 Transpiler. Note, this source code repository is way ahead of the tutorial. We plan to update the tutorial article as soon as we can catch our breath!

NEWS

We have not yet updated the react_on_rails gem generators for the following tasks. We're looking for help to migrate this, if you're interested in contributing to the project. The tutorial refers to this repo. The following changes have resulted in lots of differences for the webpack files and visual assets:

  1. Handling of Sass and Bootstrap: The tutorial uses CSS modules via Webpack. This is totally different than the older way of having Rails handle Sass/Bootstrap, and having NPM/Webpack handle the Webpack Dev Server. The tutorial now has NPM handle all visual assets. We are using this technique on a new app, and it's awesome!
  2. Hot Reloading with Rails: The tutorial has different startup scripts than the generators. The dev mode has the WebapackDev server providing the JS and CSS assets to the tutorial. This means you get HOT RELOADING of your JS and CSS within your Rails app.

If you did generate a fresh app from React On Rails and want to move to CSS Modules, then see PR 175: Babel 6 / CSS Modules / Rails hot reloading. Note, while there are probably fixes after this PR was accepted, this has the majority of the changes.

Example Application

This is a simple example application that illustrates the use of ReactJs to implement a commenting system. Front-end code leverages both ReactJs and Rails asset pipeline while the backend is 100% Rails. It shows off a little bit of the interactivity of a ReactJs application, allowing the commmenter to choose the form layout. react-bootstrap is used for the React components. A pure Rails UI generated from scaffolding is shown for comparison.

You can see this tutorial live here: http://reactrails.com/

Motivation

In no particular order:

  • Example of using the react_on_rails gem for easy react/webpack integration with Rails.
  • Example of React with CSS Modules inside of Rails using Webpack as described in Smarter CSS builds with Webpack.
  • Example of enabling hot reloading of both JS and CSS from your Rails app in development mode. Change your code. Save. Browser updates without a refresh!
  • Example of Rails 4.2 with ReactJs/Redux/React-Router with Webpack and ES7.
  • Enabling development of a JS client independently from Rails using the Webpack Dev Server. You can see this by starting the app and visiting http://localhost:4000
  • Enabling the use of npm modules and Babel with a Rails application using Webpack.
  • Easily enable retrofitting such a JS framework into an existing Rails app. You don't need a brand new single page app!
  • Example setting up Ruby and JavaScript linting in a real project, with corresponding CI rake tasks.

Technologies involved

See package.json and Gemfile for versions

  1. react_on_rails gem
  2. React (for front-end app)
  3. react-bootstrap
  4. bootstrap-loader
  5. Redux
  6. Webpack with hot-reload (for local dev)
  7. Babel transpiler
  8. Ruby on Rails 4.2 for backend app and comparision with plain HTML
  9. Heroku for Rails 4.2 deployment

Basic Setup

  1. Be sure that you have Node installed! We suggest nvm, with node version v5.0 or above. See this article Updating and using nvm.
  2. git clone [email protected]:shakacode/react-webpack-rails-tutorial.git
  3. cd react-webpack-rails-tutorial
  4. Check that you have Ruby 2.2.3
  5. Check that you're using the right version of node. Run nvm list to check.
  6. Check that you have Postgres installed. Run which postgres to check.
  7. bundle install
  8. npm install
  9. rake db:setup
  10. foreman start -f Procfile.dev
  11. Open a browser tab to http://localhost:3000 for the Rails app example.
  12. Open a browser tab to http://localhost:4000 for the Hot Module Replacement Example.
  13. With the browser open to any JSX file, such as client/app/bundles/comments/components/CommentBox/CommentBox.jsx and you can change the JSX code, hit save, and you will see the sceen update without refreshing the window. This applies to port 3000 and port 4000.
  14. Try changing a .scss file, such as a color in client/app/bundles/comments/components/CommentBox/CommentList/Comment/Comment.scss. You can see port 3000 or 4000 update automatically.

KEY COMMANDS

  1. Run all linters and tests: rake ci
  2. See all npm commands: npm run
  3. Start all development processes: foreman start -f Procfile.dev
  4. Start all Rails only development processes: foreman start -f Procfile.rails
  5. Start development without Rails, using the Webpack Dev Server only: npm start (or foreman start -f Procfile.express)

Javascript development without Rails using the Webpack Dev Server

  1. Run the node server with file server-express.js with command npm run or cd client && node server-express.js.
  2. Point your browser to http://localhost:4000

Save a change to a JSX file and see it update immediately in the browser! Note, any browser state still exists, such as what you've typed in the comments box. That's totally different than Live Reload which refreshes the browser. Note, we just got this working with your regular Rails server!

Rails integration

JS and CSS assets

We're now using Webpack for all Sass and JavaScript assets so we can do CSS Modules within Rails!

  1. Production Deployment: See assets.rake for we modify the Rails precompile task to deploy assets for production.
  2. Development Mode: We modify the URL in application.html.erb based on whether or not we're in production mode using the helpers env_stylesheet_link_tag and env_javascript_include_tag. Development mode uses the Webpack Dev server running on port 3500. Other modes (production/test) uses precompiled files.
<%= env_stylesheet_link_tag(static: 'application_static', hot: 'application_non_webpack', options: { media: 'all', 'data-turbolinks-track' => true })  %>
<%= env_javascript_include_tag(hot: ['http://localhost:3500/vendor-bundle.js', 'http://localhost:3500/app-bundle.js']) %>
<%= env_javascript_include_tag(static: 'application_static', hot: 'application_non_webpack', options: { 'data-turbolinks-track' => true }) %>
  1. Testing Mode: When running tests, it is useful to run foreman start -f Procfile.spec in order to have webpack automatically recompile the static bundles. Rspec is configured to automatically check whether or not this process is running. If it is not, it will automatically rebuild the webpack bundle to ensure you are not running tests on stale client code. This is achieved via the config.include ReactOnRails::EnsureAssetsCompiled, type: :feature line in the rails_helper.rb file. If you are using this project as an example and are not using RSpec, you may want to implement similar logic in your own project.

Webpack configuration

Config Files

  • webpack.client.base.config.js: Common client configuration file to minimize code duplication for webpack.client.rails.build.config, webpack.client.rails.hot.config, webpack.client.express.config
  • webpack.client.express.config.js: Webpack configuration for client/server-express.js
  • webpack.client.rails.build.config.js: Client side js bundle for deployment and tests.
  • webpack.client.rails.hot.config.js: Webpack Dev Server bundler for serving rails assets on port 3500, used by client/server-rails-hot.js, for hot reloading JS and CSS within Rails.
  • webpack.server.rails.build.config.js: Server side js bundle, used by server rendering.

Webpack Resources

Sass, CSS Modules, and Twitter Bootstrap integration

We're using Webpack to handle Sass assets so that we can use CSS modules. The best way to understand how we're handling assets is to close follow this example. We'll be working on more docs soon. If you'd like to give us a hand, that's a great way to learn about this!

For example in client/app/bundles/comments/components/CommentBox/CommentBox.jsx, see how we use standard JavaScript import syntax to refer to class names that come from CSS modules:

import css from './CommentBox.scss';

export default class CommentBox extends React.Component {
  render() {
    const { actions, data } = this.props;
    const cssTransitionGroupClassNames = {
      enter: css.elementEnter,
      enterActive: css.elementEnterActive,
      leave: css.elementLeave,
      leaveActive: css.elementLeaveActive,
    };
  }
}

Sass and fonts

The tutorial makes use of a custom font OpenSans-Light. We're doing this to show how to add assets for the CSS processing. The font files are located under client/app/assets/fonts and are loaded by both the Rails asset pipeline and the Webpack HMR server.

Process management

Run the following command in your development environment to invoke both Webpack and Rails.

bundle exec foreman start -f Procfile.dev

Contributors

The Shaka Code team! and many others!

Notable contributions include (please submit PR if I miss any!):

See the full list of Contributors

Open Code of Conduct

This project adheres to the Open Code of Conduct. By participating, you are expected to uphold this code.

RubyMine and WebStorm

Special thanks to JetBrains for their great tools: RubyMine and WebStorm. Some developers of this project use RubyMine at the top level, mostly for Ruby work, and we use WebStorm opened up to the client directory to focus on JSX and Sass files.

About ShakaCode

We hope you read Who Is ShakaCode and Success the ShakaCode Way!

Visit our forums!. We've got a category dedicated to react_on_rails.

If you're looking for consulting on a project using React and Rails, email us at [email protected]! You can also join our slack room for some free advice. Email us for an invite.

We're looking for great developers that want to work with Rails + React with a super-run, remote-first, distributed, worldwide team, for our own products, client work, and open source. More info here.

react-webpack-rails-tutorial's People

Contributors

justin808 avatar dylangrafmyre avatar mbreining avatar alex35mil avatar josiasds avatar robwise avatar marcusvmsa avatar thiagoc7 avatar mapreal19 avatar szyablitsky avatar jbhatab avatar plasticlizard avatar bronson avatar thewoolleyman avatar geoffevason avatar glennr avatar skv-headless avatar jameswatling avatar rstudner avatar samnang avatar stanboyet avatar

Watchers

Bruce Park avatar James Cloos avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.