react-webpack-node
Boilerplate for an isomorphic universal React application in ES6 with webpack using Redux running on an Express server.
| React + Redux / alt + Immutable + Express + mongoose + MongoDB |
Demo site:
https://react-webpack-node.herokuapp.com/
Features:
We now have two isomorphic Universal Flux implementations in this repository:
On master branch:
- redux
- react-router
- redux-simple-router
- react-transform-hmr
- universal authentication for react-router
On flux/alt branch:
- alt
- iso to help with bootstrapping data for isomorphic Flux
- react-router
- ImmutableJS
Note: If you have previously used an alt implementation of this repository, please refer to this branch. I will not be updating it as frequently as master, but definitely welcome suggestions!
- Css Modules
- Webpack config file
- Express server
- Mongoose for MongoDB
- Procfile to enable deployment to Heroku
Why redux?
I'm really a fan of this implementation. The main principles of having:
- a single store
- state being read-only (you have to express an intent to mutate being creating actions)
- mutations are written as pure functions
make it very fun and easy to write predictable code! Redux also has a really good ecosystem and strong support from the community.
Why alt?
Having isomorphic React was one of my key criteria when choosing a Flux library, which helped narrow down the scope of libraries.
I found alt's implementation to be clean and simple, and like the option of allowing us to create alt instances or using singletons (and flushing the stores). I also like the direction in which alt is heading.
Mission
The aim of this repo is to incorporate the best practices to building a non-trivial apps with Reactjs and Node. I am working to document this repo extensively so it would be easy for both beginners and experts to begin dev-ing on it without pulling your hair out.
Instructions
- First run your mongo server
mongod
- Read setting up your database section to install MongoDB
Production build
Run the commands below for a production build, i.e. what is deployed to Heroku. If you are deploying to Heroku or similar, we assume that you serving the pages over HTTPS.
npm run build
- cleans the
/public
folder - runs
webpack
through configurations specified inwebpack.config.prod.js
- cleans the
npm start
to start server
Development build
npm run dev
starts the server with webpack-hot-middleware and react-transform-hmr- If you get an error saying file not found, run
npm run build && npm run dev
(because the server relies on the compiled file to exist in order to serve those files). - I am looking into using webpack isomorphic tools to help with bundling files server side, so we will potentially move away from having two configs for client and server side.
- If you get an error saying file not found, run
Where do you compile your scss?
We use ExtractTextPlugin to extract compiled css in our webpack config file
What loaders do you use for ES6/ ES2015?
babel-loader. Seriously, try it!
Setting up your Database
Install MongoDB:
brew update
brew install mongodb
mongod
(Make sure you have the permissions to the directory /data/db)
If you're interested in a boilerplate example with postgresql, check reap out!
Deploying to Heroku
heroku create
heroku app:rename newname
if you need togit push heroku master
Note: If you are working from a different machine and get heroku does not appear to be a remote repository
message, be sure to run git remote add heroku git@heroku.com:appname.git
.
heroku open
to open the link- If you wish to have a database setup on Heroku, remember to use
heroku addons:add mongohq
orheroku addons:add mongolab
.
Note: For Google Auth, read Setting up Google Authentication below
Deploying to Digital Ocean
- Create a Droplet
- Follow this or this tutorial to set up nodejs
- Follow this tutorial to install mongodb
- git clone this repo
npm install
sudo npm install pm2 -g
pm2 start server/index.js
pm2 startup ubuntu
sudo env PATH=$PATH:/usr/local/bin pm2 startup ubuntu -u sammy
Read more on DO config here
Component Hierarchy
- app.js
- App.jsx
- Navigation.jsx
- Vote.jsx
- EntryBox.jsx
- MainSection.jsx
- Scoreboard.jsx
- Login.jsx
- Logout.jsx
- About.jsx
- App.jsx
Testing
Testing with:
karma
as test runnerkarma.conf.js
for the main karma configuration (it has webpack configurations)tests.webpack.js
which is the single entry file. It useswebpack
's require API to find all the files we need that have a-test.js
suffix.
mocha
as the test frameworkjsdom
as my test environment
npm test
to run test oncenpm test:watch
to run inwatch
mode
We have unit tests for /actions
and /reducers
in place, but none for /components
yet.
I previously followed the example for writing tests with redux which used mocha
and jsdom
, but I soon encountered problems with require
-ing files without using a relative path, also a lot issues with nock
-ing correctly.
Yeoman Generator
If you like using yeoman generators, you could check out this cool yeoman generator by @iiegor!
Questions
-
Google Authentication does not work locally or on heroku!
- Setting up Google Authentication
- Follow these steps from Google to create your API keys on Google Developers Console
- Under APIs & Auth, Copy your Client ID and Client Secret
- Dev
- For Google Auth to work locally, you need to do the following in your terminal before starting the server:
export GOOGLE_CLIENTID=YOUR_CLIENTID
export GOOGLE_SECRET=YOUR_SECRET
- For Google Auth to work locally, you need to do the following in your terminal before starting the server:
- Heroku
- Fret not! Heroku's covered this pretty well:
heroku config:set GOOGLE_CLIENTID=YOUR_CLIENTID
heroku config:set GOOGLE_SECRET=YOUR_SECRET
heroku config:set GOOGLE_CALLBACK=YOUR_CALLBACK
- Fret not! Heroku's covered this pretty well:
- Setting up Google Authentication
-
I do not know how to write React Components/anything in ES6. Help!
-
Why do I get
Error: Failed to serialize user into session
when trying to login with email/password locally? It's because there are no users created in your local DB so it's throwing an error on the server's end. We haven't set up the handling of errors for this yet. I intend to fix this. If you check this, you'll see that there is a/signup
endpoint for creating a user. In the meantime, a quick and easy way to do this is to paste this in your console log while your server is running:
var http = new XMLHttpRequest();
var url = "http://localhost:3000/signup";
var params = "email=example@ninja.com&password=ninja";
http.open("POST", url, true);http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
http.send(params);
This should create a user in your local database and all will be well!!
Todo:
Best way to keep up to date is check the issues.
My priorities are:
- Improving the server side rendering
- Better dev experience
- Auth routing
How to Contribute:
- Any suggestions/improvements/bugs can be in the form of Pull Requests, or creating an issue.
- Coding guidelines:
Credits to webpack-server-side-example, example-app, flux-examples, node-express-mongo-demo, hackathon-starter, web-starter-kit, awesome material-ui, alt and iso, react-starter, reap.
License
MIT