A universal React/Redux boilerplate with sensible defaults. Out of the box, thisboilerplate comes with:
babel-node
.jest
and enzyme
to work with css modules, static files, and aliased module paths.The JavaScript ecosystem is brimming with open source libraries. With advancesin ES6 and commitments by the big tech companies to invest in JavaScript, thelast several years have arguably turned web development into what was once ahuge pain in the ass, to a pretty decently enjoyable experience.
With so many different packages now available, we now have the freedom and thechoice to craft applications to our exact specifications, reducing bloat andminimizing the number of code we need to support cross-platform apps. It reallyis a new world.
However, with so many different developers working on different libraries,things are constantly in flux, and breaking changes are often introduced. It canbe hard to keep up with the latest and greatest since they're always changing.
To help alleviate this, we've collected some of the best practices and featuresfrom the React ecosystem and put them in one place. Although this boilerplate isfully production-capable as is, its main goal is to serve as an example of howto bring an application together using the latest tools in the ecosystem.
Copy environment variables and edit them if necessary:
cp .env.example .env
Then:
npm install
npm start
Direct your browser to http://localhost:3000
.
Add environment variables the way you normally would on your production system.
npm run prod:build
npm run serve
Or simply:
npm run prod
If using Heroku, simply add a Procfile
in the root directory. Thepostinstall script will do the rest.
web: npm run serve
In package.json
, there is a property named _moduleAliases
. This objectdefines the require() aliases used by both webpack and node.
Aliased paths are prefixed with one of two symbols, which denote differentthings:
@
- component and template paths, e.g. @components
$
- server paths that are built by babel, e.g. server/api
Aliases are nice to use for convenience, and lets us avoid using relative pathsin our components:
// This sucks
import SomeComponent from '../../../components/SomeComponent';
// This is way better
import SomeComponent from '@components/SomeComponent';
You can add additional aliases in package.json
to your own liking.
In development mode, environment variables are loaded by dotenv
off the .env
file in your root directory. In production, you'll have to manage theseyourself.
An example with Heroku:
heroku config:set FOO=bar
This project uses CSS Modules.Class names should be in camelCase
. Simply import the .scss file into yourcomponent, for example:
├── components
│ ├── Header.js
│ ├── Header.scss
// Header.scss
.headerContainer {
height: 100px;
width: 100%;
}
// Header.js
import css from './Header.scss';
const Header = (props) => {
return (
<div className={css.headerContainer}>
{...}
</div>
);
}
This project supports the awesome Redux Devtools Extension.Install the Chrome or Firefox extension and it should just work.
When rendering components on the server, you'll find that you may need to fetchsome data before it can be rendered. The component rendererlooks for a fetchData
method on the container component and its childcomponents, then executes all of them and only renders after the promises haveall been resolved.
// As an ES6 class
class TodosContainer extends React.Component {
static fetchData = ({ store }) => {
return store.dispatch(fetchTodos());
};
}
// As a functional stateless component
const TodosContainer = (props) => {
const { todos } = props;
return (
// ...component code
);
}
TodosContainer.fetchData = ({ store }) => {
return store.dispatch(fetchTodos());
}
This project uses async/await
, available by default in Node.js v8.x.x orhigher. If you experience errors, please upgrade your version of Node.js.
The default testing framework is Jest, though you can use whatever you want.
Tests and their corresponding files such as Jest snapshots, should be co-locatedalongside the modules they are testing, in a spec/
folder. For example:
├── components
│ ├── todos
│ │ ├── TodoForm
│ │ │ ├── spec
│ │ │ │ ├── TodoForm.test.js
│ │ │ ├── index.js
│ │ │ ├── index.scss
Tests can be written with ES2015, since it passes through babel-register
.
To run a single test:
npm test /path/to/single.test.js
// Or, to watch for changes
npm run test:watch /path/to/single.test.js
To run all tests:
npm run test:all
// Or, to watch for changes
npm run test:all:watch
npm run lint
Check the .eslintignore
file for directories excluded from linting.
By default, assets are built into dist/public
. This path is then served byexpress under the path assets
. This is the public asset path. In a productionscenario, you may want your assets to be hosted on a CDN. To do so, just changethe PUBLIC_ASSET_PATH
environment variant.
Example using Heroku, if serving via CDN:
heroku config:set PUBLIC_ASSET_PATH=https://my.cdn.com
Example using Heroku, if serving locally:
heroku config:set PUBLIC_ASSET_PATH=/assets
我正在通过手机输入这个,所以我为缺乏格式而道歉. 对于我的项目,我正在做与你类似的事情;我有一个静态的fetchData方法,我循环遍历renderProps中的组件,然后我调用静态方法并等待promises解析. 然后,我从我的redux商店调用get状态,对其进行字符串化,并将其传递给服务器上的渲染函数,以便它可以在客户端上渲染出初始状态对象. 从客户端,我只需抓住该初始状态变量并将其传递给我
没有使用redux之前,获取视图数据 1 定义state constructor(props){ super(props); this.state ={ mobile:"", password:"" } } 2 在对应的input框绑定state改变的监听事件,将input中的数据通过t
�� Universal React Simple universal React application with server side rendering. Built using latest version of React (v16), React Router (v5+), Redux (v7+), Express (v5+), Webpack (v4+), Babel Preset
Koa React Universal koa2、react、react-universal-component、koa-webpack-server、async/await、code-splitting、hot-module-replacement、react-router4、redux-thunk This project is dedicated to build simple yet po
Universal React Tutorial A tutorial on building universal web applications. The web application is built with: Node.js Express React ReactRouter Redux and ReactRedux Download $ git clone https://githu
React Redux Universal Boilerplate Introduction I started this project to learn tools like React, Redux, Webpack, babeljs.io, ES6/ES2015... I did it mainly for fun. But it will be maintained and then I
Simple Universal React Redux The simplest possible Async Universal React & Redux boilerplate. This repo is an attempt to make the simplest server-side rendered (universal) async React Redux app. Boile
React Native Universal Monorepo An opinonated approach to supporting multiple platforms with React Native using a Yarn Workspaces monorepo. Check out Running React Native everywhere for an in-depth gu