The building blocks of a react app
This repo demonstrates how to plug in other technologies, one block at a time, into React.
The concept is to use GitHub's branch-comparison screens to quickly demo the code changes that are needed for only the technology you are interested in.
A client-side React app which is fully tested and production ready on the master
branch.
From Master, universal
was created which added Server-side Rendering (SSR) via Express.
Every other branch then adds one more technology, with the smallest possible changes.
All branches, have been setup with continuous deployment.
All branches use babel v6, es2015, React v15.1, React-router v1, Webpack v1 unless otherwise stated
Each tech has its own branch, and in my experience, can be mixed and matched almost seamlessly!
- Client-side
- Server-side Rendering (SSR)
- Build Tools
- Hot-Reloading
- Routing
- State Management
- Importing Assets
The client-side apps are production ready and fully tested, they both use the following :
- CSS (Sass-loader, Autoprefixer)
- tests
- unit with Enzyme
- functional
- end-to-end with Nightwatch and BrowserStack
- smoke
- code coverage
- Code linting with eslint
- CI integration with CircleCI
- Continuous deployment with Heroku
All other branches include the above and are also production ready.
master
branch
The react app uses react-router v2 for routing.
Because of Ben Fletcher and this tweet I thought i'd give Preact a shot.
Turns out it was actually very easy! After removing a few dependencies we swapped routers for preact-router.
Using Koa, the App now renders on the server, Compare Koa with Express.
- Add Webpack 2
- Add React-router 4 to the above
- Add React-hot-loader v3 to the above
- Add React-router 4 to the above
I simply rebased and rebased and rebased some more :) Oh, I did swap in koa's hot middleware, but that was it. And it works, bonus.
Using Express, the App now renders on the server, Compare Express with Koa.
- Add React-hot-loader v3
- Add Webpack 2
- Add React-hot-loader v3 to the above
- Add React-router 4 to the above
- Add React-hot-loader v3 to the above
This was added out of pure interest and I haven't used it in anger yet. Take a look at the comparison branch to see how to upgrade from webpack v1 to v2.
Other Webpack v2 Branches:
react-hot-loader allows you to see changes made to any part of your app without having to restart the server. We are currently using v3.
>> More about adding react-hot-loader
- Express with React-hot-loader v3
- Express with Webpack v2 React-hot-loader v3
- Koa with Webpack v2 and React-hot-loader v3
React Router v4 sees to be very close to being released so I was interested in how hard the upgrade would be. Easy, it seems - the new syntax includes a lot for JSX which is friendly and more flexible.
Based on the
universal
branch. _compare branches
Redux was added with data being hydrated on the server.
The app now has an API which can be called to return the required data. This data is now formatted inside a reducer.
Based on the
redux
branch. compare branches
This branch allows you to make async requests on the server and hydrate your redux store before rendering the page. The massive win here is that each container dictates what data it needs while still on the server.
>> More about adding Promise middleware
Based on the
redux
branch. compare branches
Add Redux-DevTools to the app to help debugging.
>> More about adding redux-dev-tools
In the base branches, we have simply added the CSS into webpack entry
array to get it to convert Scss into CSS.
these are some other ways to achieve more modular components:
>> More about the different CSS methods
Based on the
universal
branch. compare branches
Using webpack-isomorphic-tools and svg-inline-loader we are able to directly import SVGs into our JavaScript. This has the added benefit of :
- Reusing SVG files (without code duplication)
- Keep SVGs inline and style them with CSS
- Serverside rendering of SVG's
Based on the
universal
branch compare branches
Import your css into your component and use the class names as they are written.
This method is the least obtrusive and feels most like traditional css.
You must manually take care of css scope using things like BEM or Smaccs.
Based on the
universal
branch compare branches
Import your css into your components and add the class names using js object notation. This method completely changes the css class names output. Scoping problems are gone, but you must specifically mark 'global' classes.
Based on the
universal
branch compare branches
import your css into your components as Javascript Objects.
Class names are a thing of the past as are scoping problems.