依赖包:
{ "dependencies": { "moment": "^2.18.1","react": "^15.5.4","react-addons-css-transition-group": "^15.5.2","react-dom": "^15.5.4","react-fastclick": "^3.0.2-alpha.1","react-redux": "^5.0.5","react-router": "^4.1.1","react-router-dom": "^4.1.1","react-swipe": "^5.0.8","redux": "^3.6.0","underscore": "^1.8.3" },"devDependencies": { "babel-core": "^6.24.1","babel-eslint": "^7.2.3","babel-loader": "^7.0.0","babel-preset-es2015": "^6.24.1","babel-preset-react": "^6.24.1","babel-preset-stage-0": "^6.24.1","babel-plugin-transform-runtime": "^6.23.0","eslint": "^4.0.0","eslint-plugin-react": "^7.1.0","webpack": "^2.6.1" } }
webpack的配置:
var webpack = require("webpack"); var path = require("path"); module.exports = { entry: { app:path.resolve(__dirname,'./src/main.jsx'),vendor : [ 'react','react-dom','react-router','react-router-dom',// 'react-addons-css-transition-group','react-fastclick','react-redux','react-swipe','redux','underscore','moment' ] },// 入口文件 devtool: 'source-map', // 调试时定位到编译前的代码位置,推荐安装react插件 output: { path: path.resolve(__dirname,"./dist"),filename: '[name].bundle.js' // 打包输出的文件 },module: { rules: [{ test: /\.jsx?$/,// test 去判断是否为.js或.jsx,是的话就是进行es6和jsx的编译 exclude: /(node_modules|bower_components)/,loader: 'babel-loader',query: { presets: ['es2015','stage-0','react'] } }] },resolve: { // 现在你import文件的时候可以直接使用import Func from './file',不用再使用import Func from './file.js' extensions: ['.js','.jsx'] },plugins: [ new webpack.optimize.CommonsChunkPlugin({ name: 'vendor' }) ],externals: { //require("zepto") is external and available //on the global var Zepto //'zepto': 'Zepto' },};
src:
import React from 'react'; import ReactDOM from 'react-dom'; import { createStore,combineReducers } from 'redux'; import { Provider,connect } from 'react-redux'; const reducer = (state = {},action) => { switch (action.type) { case "test": return { ...state,...{ demo: action.data } }; default: return state; } }; const store = createStore(reducer); // 不稳定的语法,ES7装饰器 // @connect(mapStateToProps,mapDispatchToProps) class App extends React.Component { render() { return ( <div> <div onClick={ev => this.props.triggerFun("WOW!")}>Hello</div> <div>{this.props.demo}</div> </div> ); } } const mapStateToProps = state => ({ demo: state.demo }); const mapDispatchToProps = dispatch => ({ triggerFun: data => dispatch({ type: "test",data: data }) }); const AppView = connect(mapStateToProps,mapDispatchToProps)(App); ReactDOM.render( <Provider store={store}> <AppView /> </Provider>,document.getElementById("react-root") );
如果使用了路由:
class MainPage extends React.Component { render() { return ( <Provider store={store}> <Router> <div> <Route exact path="/" component={HelloView} /> </div> </Router> </Provider> ); } }