A modular platform for Redux Isomorphic applications
This repository is a modular abstraction to build a ReactJS web application based on Redux paradigm. You can use it to quickly scaffold your React web application projects and development environments for these projects.
This seed should clarify how to wire up all the modules of your application, even when we understand that in some cases there must be some changes needed by the structure to fit your needs correctly
React-Base makes use of the latest tools to improve your workflow, and enables you to create future ready applications:
- Redux based architecture
- Isomorphic / Universal Javascript Apps
- Webpack 3 build configuration depending on enviroment
- Immutable data modeling using ImmutableJS
- Store middleware to handle request actions.
- Development & Production server using express and webpack-dev-server
- Hot Reload/Live Reload support for Js & Css using Webpack HMR
- Container and component generators using Yeoman
- JSX and ES6 transpilation using Babel
- Mocha as testing framework
- Enzyme/JsDom for unit/ui testing
- Nyc for code coverage
- PostCSS processing with isomorphic support.
- CssModules based
- Code Linting using Eslint
- Css Linting using CssLint
- Airbnb React Style Guide
To get you started, you need to meet the prerequisites, and then follow the installation instructions.
React-Base makes use a number of NodeJS tools to initialize and test React-Base. You must have node.js 6.2.0 at least, and its package manager (npm) installed. You can get it from nodejs.org.
You can clone our Git repository:
$ git clone https://github.com/atSistemas/react-base.git
This method requires Git to be installed on your computer. You can get it from here.
Setting up React-Base is as easy as running:
$ npm install
This command will install all the required dependencies and start your development server, which takes care of all the changes you make to your code and runs all the awesome stuff that ends with your code automagically transpiled and running on your browser.
Please note that npm install
is only required on your first start, or in case of updated dependencies.
Once all the dependencies are installed, you can run $ npm run start
to initialize your development server using webpack-dev-server express middleware.
The dev server uses HMR (Hot module replacement) that injects updated modules into the bundle in runtime. It's like LiveReload
React-base is based on Redux paradigm so you can find all the typical entities of an Redux project like reducers , store, actions , etc.
There are four main folders:
server
contains React-Base development & production server based in express with Universal/Isomorphic support and custom middlewares like Gzip.
server
api/ //Api mocks
lib/ //Universal rendering files
middleware/ //enviroment middleware
statics/ //definition of statics path
templates/ //universal templates
server //Server
routing //Routing middleware
webpack
contains React-Base Webpack configuration separated by enviroment that allows to use different plugins and loaders in each target enviroment.
webpack
webpack.common.config/ //Common config
webpack.dev.config/ //Development config
webpack.prod.config/ //Production config
webpack.test.config/ //Testing config
webpack.dll.config/ //Dll config
src/base/
contains React-Base platform bootstrapping code.
base
client/ //client bootstrap
conf/ //Configuration files and Yeoman templates
middleware/ //Redux Store middleware
components/ //base components
models/ //model index
reducers/ //reducer index
routes/ //routes index
shared/ // shared base folder
regenerators/ //index regenerators
CreateActionType //Custom action type creator
CreateReducer //Custom reducer creator
ENV //Env handler
Errors //Errors handler
FetchData //Isomorfic data handler
FileSystem //Filesystem manager
JsDomSetup //JsDom Configuration FileSystem
ModelHelper //Inmutable deserializators
Regenerate // Regenerate indexes
store/ //Store configuration and AppState definition
types/ //Action request Types
wp-plugins/ //Custom webpack plugins
...
src/app/
is the place where to put your application source code.
React-Base uses a "featured based" distribution, so all the necessary code for each page/features is located in its own folder inside containers folder as in src/app/containers/myContainer
A container is a React component who contains other components, Redux entities, functions and store subscriptions. Each container is self-contained and represents a feature like "clients" or "products" and it contains all the necessary stuff.
app/
containers/
myContainer/
api/ //api calls
actionTypes/ //action types definition
actions/ //action creators
components/ //container components
models/ //containers models using immutable
reducers/ //container reducers
index.ts //container component
...
ActionTypes it's a representation using constants of your possible actions:
import { createActionType } from 'base';
export const ActionTypes = createActionType([
'CLICK',
'MAIN_CONTAINER',
'MAIN_ERROR',
'MAIN_REQUEST',
'MAIN_SUCCESS',
'LAZY_CONTAINER',
'LOGIN',
]);
Actions are payloads of information witch represent that something happend in your application and send data from your application to your store:
clickHandler(id) {
return {
type: ActionTypes.USER_CLICK,
payload: {
id: id
}
};
}
React-Base include a Redux Store middleware to handle actions with service calls more easyly. You can define in the api folder of your container, an api call based in a fetch call:
fetchUsers() {
return fetch(url)
.then(req => req.json())
.then(data => data)
.catch(err => err)
},
Then, in your action you can attach this service call in your action using the request param:
export function getPosts() {
return {
type: ActionTypes.USERS_REQUEST,
request: api.fetchUsers()
};
}
The request middleware will resolve the request param and dispatch a new action with "ACTION_SUCCESS" or "ACTION_ERROR" with the response of the request in the payload.
Reducers describe how the state of your application changes in response to a new Action. React-Base uses a custom CreateReducer that allows to use separated reducers functions instead of "switch based" reducers.
import { createReducer } from 'base';
const click = (state, action) => {
return state.update('mainData', (value) => action.payload);
};
const request = (state, action) => {
return state;
};
const actionHandlers = {
[ActionTypes.CLICK]: click,
[ActionTypes.LOGIN]: login,
[ActionTypes.MAIN_REQUEST]: request,
[ActionTypes.MAIN_SUCCESS]: success,
};
export default CreateReducer(actionHandlers, new MainModel());
Represents your model data using ImmutableJS Data Types and sets its initial state using setInitialState() function.
import { Record } from 'immutable';
const MainModel = new Record({
display:0,
operator:'',
operation:'',
prevValue: 0,
nextValue: 0,
newValue: false,
resetDisplay: false,
});
function setInitialState(initialState) {
return initialState.Maiin = new MainModel();
}
export { MainModel, setInitialState };
React-base uses Yeoman to generate new application containers or components.
Fist of all you need to link yo:
$ npm run yo
Then, you can generate a new container run:
$ npm run generate:container
You'll be asked to provide a name for your container. After that, React-base will create all the necessary folder and file template structures you, and will rebuild the file indexes (routes, reducers, models, etc), so you don't have to worry about including all the required imports.
After that, you can access to your container from http://localhost:8000/myContainer
You can rebuild the file indexes (reducers, models and routes) running $ npm run regenerate
As with containers, React-base can automate components creation for you. To create a new component, just type:
$ npm run generate:component
Same as before, you will be asked for a component name, and after that React-base will do the rest, placing a component template under app/components
, and rebuilding all the indexes.
You can generate a complete distribution source ready for production enviroments.
$ npm run build:prod
will create a minified version for your application, ready for production.
$ npm run start:prod
will run production enviroment of your application serving content from dist directory.
React base uses - Enzyme a testing utillity created by Airbnb for unit testing and Ui testing using Airbnb so you can run your ui testing without a browser.
You can write your tests normally using Mocha and Chai for assertions.
$ npm run test
will perform your unit testing, or npm test:coverage to run your tests and display a code coverage report.
React base uses Nyc for code coverage and you can generate reports in console or icov/html format.
$ npm run test
will perform your code coverage, generating an html report located in coverage/ folder.
Anyone and everyone is welcome to contribute, however, if you decide to get involved, please take a moment to review the guidelines:
React-Base is available under the MIT license.