Universal Redux is an npm package that when used as a dependency in your project provides a universal (isomorphic) rendering server. You can either use its defaults and begin coding your project, or configure it to your liking with custom Webpack options and Express or Redux middleware. It's intended as both an easy starting point for developers new to React and Redux, as well as an extensible base by which advanced developers can augment with their own middleware and keep up to date with the fast-moving React ecosystem.
The quickest way to get started is to clone the starter project. This gives you a base project that is set up with default configurations of Webpack and Express.
- An example with JWT authentication (Heroku demo)
- A refactor of react-redux-universal-hot-example with universal-redux and react-router-redux (Heroku demo)
- An example using Koa instead of Express
Your project must define a set of routes as specified by a React Router configuration, but other than that, your folder structure and development path is up to you. Depending on your other dependencies, you may want to use a version of Universal Redux that is not the latest, using the section below to decide.
Node.JS >= 4.1.1
npm >= 3.3.12 (install via npm install -g npm@3
if you are on Node 4)
npm install --save universal-redux
The configuration file in your project at config/universal-redux.config.js
defines what properties you want to customize. You can start by copying the annotated example. The configuration file is optional and is only necessary if you wish to modify default behavior.
Generally kept in src/routes.js
, this is where you define what routes map to what views. See routes.js
in the example project.
Any items specified in the webpack.config
of your configuration will be merged with the default Webpack configuration. You may also turn on verbose
mode to see the exact Webpack configuration you are running.
You can add your own Express middleware like so:
import { express, renderer, start } from 'universal-redux';
import config from '../config/universal-redux.config.js';
const app = express(config);
// app.use(someMiddleware);
// app.use(someOtherMiddleware);
app.use(renderer(config));
start(app, config);
Alternatively, you may create your own Express instance, add middleware beforehand and pass that instance as parameter when calling universal.app(app)
.
You can activate your own Redux middleware by specifying the middleware
property in the configuration file. This must be a path to a file which exports each middleware as a function. All properties specified in globals
will be available to the middleware.
The html.head
configuration allows you to define your own <head>
that will be merged with the necessary items for serverside rendering. You can see an example of this in the JWT project here.
Alternatively, you can specify html.root
in your configuration and this will be used instead of the default one. If you do take that approach, you'll want to be sure to include the items from src/server/head.js
and src/server/body.js
.
You can add or override the default webpack-isomorphic-tools configuration, by providing a toolsConfigPath
value to your config.js
.
The following npm bin aliases have been defined:
universal-redux-watch
universal-redux-server
universal-redux-build
You'll generally call these from the corresponding section of your project's scripts. See package.json
in the example project.
Peer dependencies for each version:
"react": "^0.14.3",
"react-dom": "^0.14.3",
"react-router": "^1.0.0",
"redux-router": "^1.0.0-beta4"
"react": "^0.14.3",
"react-dom": "^0.14.3",
"react-router": "^1.0.0",
"redux-simple-router": "^1.0.1"
"react": "^0.14.3",
"react-dom": "^0.14.3",
"react-router": "^1.0.0",
"redux-simple-router": "^1.0.1"
Babel 6, React Router 2, React Router Redux 3 (Redux Simple Router renamed) is available but optional.
"react": "^0.14.3",
"react-dom": "^0.14.3",
"react-router": "^2.0.0-rc4",
If you'd like to develop on Universal Redux, clone the repo and while testing with a project that uses it, you can run PROJECT_PATH=/path/to/project npm run dev
from the Universal Redux root, which will watch for changes and copy them over to your project's node_modules/universal-redux/lib
directory. If any of your changes add dependencies, you will need to copy those over manually.
This project forked off of react-redux-universal-hot-example. Please refer to the README there for more details and join the discussion at the pull request.