用react + react-redux构建项目 基本配置

原创
2017/07/14 17:52
阅读数 301

依赖包:

{
  "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>
        );
    }
}
展开阅读全文
打赏
0
1 收藏
分享
加载中
更多评论
打赏
0 评论
1 收藏
0
分享
返回顶部
顶部