• 安装React脚手架:

    npm install -g create-react-app
  • 创建项目:

    create-react-app app

    app:为该项目名称

    或者跳过以上两步直接使用:

    npx create-react-app app
  • 启动项目:
    cd app
    npm start

项目创建完成,目录如下:

  • 安装 Ant Design:API Docs

    npm install antd --save

    cnpm install antd --save
    cnpm i antd -S

    没有权限请使用 sudo

使用 babel-plugin-import(推荐)。

  1. 首先暴露配置文件:

    npm run eject

    NOTE: Create React App 2+ supports TypeScript, Sass, CSS Modules and more without ejecting: https://reactjs.org/blog/2018/10/01/create-react-app-v2.html

    该操作为永久性,不可逆的。

  2. 在 package.json 中配置 babel (需要安装 babel-plugin-import 
    Error: Cannot find module 'babel-plugin-import'
    需要安装 babel-plugin-import
    npm install babel-plugin-import --save-dev

    cnpm install babel-plugin-import --save-dev
    cnpm i babel-plugin-import -D

    babel 配置如下:

    "babel": {
    "presets": [
    "react-app"
    ],
    "plugins": [
    [
    "import",
    {
    "libraryName": "antd",
    "libraryDirectory": "es",
    "style": true
    }
    ]
    ]
    }

    使用 babel-plugin-import 的 style 配置来引入样式,需要将配置值从 'style': 'css' 改为 'style': true,这样会引入 less 文件。

  3. 配置 Ant Design 中文语言(默认文案是英文):配置文档

    在入口文件index.js中配置:
    import { ConfigProvider } from 'antd';
    import zh_CN from 'antd/lib/locale-provider/zh_CN';
    import moment from 'moment';
    import 'moment/locale/zh-cn'; moment.locale('zh-cn');

    语言列表请参照:Ant Design 国际化

    另外需要使用 ConfigProvider 组件把 根组件 包裹起来:

    <ConfigProvider locale={zhCN}>
    <App />
    </ConfigProvider>
  • 安装配置 less 预处理器 && 配置 Ant Design 主题:  配置文档

    npm install less less-loader --save-dev

    cnpm install less less-loader --save-dev
    cnpm i less less-loader -D

    在 config/webpack.config.js 中配置 less:

    {
    test: /\.less$/,
    use: [{
    loader: 'style-loader',
    }, {
    loader: 'css-loader', // translates CSS into CommonJS
    }, {
    loader: 'less-loader', // compiles Less to CSS
    options: {
    modifyVars: {
    'primary-color': '#1DA57A',
    'link-color': '#1DA57A',
    'border-radius-base': '2px',
    // or
    'hack': `true; @import "your-less-file-path.less";`, // Override with less file
    },
    javascriptEnabled: true,
    },
    }]
    }

    配置位置如下:

    Ant Design 官网给出的可配置项:

  • @primary-color: #1890ff; // 全局主色
    @link-color: #1890ff; // 链接色
    @success-color: #52c41a; // 成功色
    @warning-color: #faad14; // 警告色
    @error-color: #f5222d; // 错误色
    @font-size-base: 14px; // 主字号
    @heading-color: rgba(, , , 0.85); // 标题色
    @text-color: rgba(, , , 0.65); // 主文本色
    @text-color-secondary : rgba(, , , .); // 次文本色
    @disabled-color : rgba(, , , .); // 失效色
    @border-radius-base: 4px; // 组件/浮层圆角
    @border-color-base: #d9d9d9; // 边框色
    @box-shadow-base: 2px 8px rgba(, , , 0.15); // 浮层阴影
  • 安装 CSS resets: Normalize.css ( 样式重置 )
    npm install normalize.css --save

    cnpm install normalize.css --save
    cnpm i normalize.css -S

    安装完成后在入口文件index.js中引入即可。

    import 'normalize.css';
  • 安装配置 axios、qs : 
    npm install axios qs --save

    cnpm install axios qs --save
    cnpm i axios qs -S

    配置请求拦截器、响应拦截器:
     service.js:

    import axios from 'axios';
    
    const service = axios.create({
    // baseURL: window.location.origin,
    timeout: ,
    /*headers: {
    'Cache-Control': 'no-cache'
    }*/
    }); /* 请求拦截器 */
    service.interceptors.request.use((config) => {
    // 在这里配置请求 config
     return config;
    }, (err) => {
    console.error('请求发生了错误', err);
    return Promise.reject(err);
    }); /* 响应拦截器 */
    service.interceptors.response.use((res) => {
    // 在这里配置响应拦截器
    return res;
    }, (err) => {
    console.error('响应发生了错误', err);
    return Promise.reject(err);
    }); export default service;

    配置API调用方法:

    // 引入 axios 配置
    import service from './service';
    import qs from "qs"; // post 请求
    export function apiPost(data = {}) {
    return service({
    url: "接口url",
    method: 'post',
    data: qs.stringify(data),
    });
    } // get 请求
    export function apiGet(params = {}) {
    return service({
    url: "接口url",
    method: 'get',
    params: params,
    });
    }
  • 配置跨域: Docs


    前面配置中 npm run eject 已经将配置暴露出来了
    npm install http-proxy-middleware --save

    cnpm i http-proxy-middleware -S

    src 下新建 setupProxy.js

    const proxy = require('http-proxy-middleware');
    
    module.exports = function(app) {
    app.use(proxy('/api', { target: 'http://localhost:5000/' }));
    };
  • 安装配置路由 React-router:API Docs
    npm install react-router-dom --save

    cnpm install react-router-dom --save
    cnpm i react-router-dom -S

    单独新建一个 router.js:( 或者在入口文件 index.js 中写路由视图)

    import React from 'react';
    import { BrowserRouter as Router, Route } from 'react-router-dom';
    import YourComponent from 'your-component-path'; export default function () {
    return (
    <Router>
    <Route path='/' component={YourComponent} />
    </Router>
    );
    }

    然后在index.js里引用使用这个router.js:

    import Router from './path/router.js';
    
    export default function Index() {
    return <Router />;
    }

    在哪个文件引用 router.js ,看个人项目构建喜好了,我是把 redux 和 antd 的配置 在 index.js 中引用的,把 router.js 在 app.js 中引用的,然后再把 app.js 引入到 index.js 中。
    可以看我 GitHub 的 mixins-demo

  • 安装配置 redux react-redux Docsredux Docs中文Docs
    npm install redux redux-thunk react-redux --save

    cnpm install redux redux-thunk react-redux --save
    cnpm i redux redux-thunk react-redux -S

    在src目录下新建 redux 文件夹,作为配置 redux 的目录:

    actions: 针对不同功能模块进行配置的 actions 文件放在此目录
    reducers: 针对不同功能模块进行配置的 reducers 文件放在此目录
    reducers.js: 把所有reducers 结合起来
    store.js: 对 redux 的配置文件
    types.js: 存放Actions中所需要的 type 属性值

    各文件代码:
    types.js:

    export const MYTODO = 'MYTODO';
    export const MYLIST = 'MYLIST';
    export const OTHERTODO = 'OTHERTODO';
    export const OTHERLIST = 'OTHERLIST';

    myReducer.js:

    import { MYTODO, MYLIST } from '../types';
    const initState = {
    myTodos: [],
    list: [],
    // ...etc.
    };
    export default function (state = initState, action) {
    switch (action.type) {
    case MYTODO:
    return {
    ...state,
    myTodos: action.payload
    };
    case MYLIST:
    return {
    ...state,
    list: action.payload
    };
    default:
    return state;
    }
    }

    myActions.js:

    import { MYTODO, MYLIST } from "../types";
    
    export const myTodos = (params) => (dispatch, getState) => {
    // const { myState, otherState } = getState();
    dispatch({
    type: MYTODO,
    payload: params
    });
    };
    export const handleMyList = (params) => (dispatch, getState) => {
    // const { myState, otherState } = getState();
    dispatch({
    type: MYLIST,
    payload: params
    });
    };

    otherReducer.js:

    import { OTHERTODO, OTHERLIST } from '../types';
    const initState = {
    otherTodos: [],
    list: [],
    // ...etc.
    };
    export default function (state = initState, action) {
    switch (action.type) {
    case OTHERTODO:
    return {
    ...state,
    otherTodos: action.payload
    };
    case OTHERLIST:
    return {
    ...state,
    list: action.payload
    };
    default:
    return state;
    }
    }

    otherActions.js:

    import { OTHERTODO, OTHERLIST } from "../types";
    
    export const otherTodos = (params) => (dispatch, getState) => {
    // const { myState, otherState } = getState();
    dispatch({
    type: OTHERTODO,
    payload: params
    });
    };
    export const handleOtherList = (params) => (dispatch, getState) => {
    // const { myState, otherState } = getState();
    dispatch({
    type: OTHERLIST,
    payload: params
    });
    };

    reducers.js:

    import { combineReducers } from 'redux';
    import myReducer from './reducers/myReducer';
    import otherReducer from './reducers/otherReducer'; export default combineReducers({
    myState: myReducer,
    otherState: otherReducer,
    });

    store.js:

    import { createStore, applyMiddleware, compose } from 'redux';
    import thunk from 'redux-thunk';
    import reducers from './reducers'; const initState = {};
    const middleware = [thunk]; const composeEnhancers =
    typeof window === 'object' && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__
    ? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({})
    : compose; const enhancer =
    process.env.NODE_ENV === 'development'
    ? composeEnhancers(applyMiddleware(...middleware))
    : applyMiddleware(...middleware); export const store = createStore(reducers, initState, enhancer);

    以上Redux基本配置完成,下面是调用方法:

    import React, { useEffect } from 'react';
    import PropTypes from 'prop-types';
    import { connect } from 'react-redux';
    import { myTodos, handleMyList } from './path/redux/actions/myActions'; function MyTodosComponent() {
    useEffect(() => {
    // 通过this.props 访问 state
    console.log(this.props.myTodos);
    console.log(this.props.list);
    // 调用 actions
    const todos = [
    {
    id: 1,
    todo: 'say hello world'
    }
    ];
    this.props.myTodos(todos);
    const list = [
    {
    id: 1,
    text: 'test',
    },
    ];
    this.props.handleMyList(list);
    }, []);
    return (
    <div>
    {
    this.props.todos.map((item, index) => {
    return (
    <div>id:{item.id}, todo:{item.todo}</div>
    );
    })
    }
    </div>
    );
    }
    // 类型检查
    MyTodosComponent.propTypes = {
    myTodos: PropTypes.array.isRequired,
    list: PropTypes.array.isRequired,
    };
    // 把redux中的state绑定到组件的props上
    const mapStateToProps = (state) => {
    const { myTodos, list } = state.myState;
    return {
    myTodos,
    list,
    };
    };
    // 把redux和组件结合起来,使组件能在props中访问到state和actions
    export default connect(
    mapStateToProps,
    {
    myTodos,
    handleMyList,
    },
    )(MyTodosComponent);

    以上代码只是示例,只需要关注配置和使用方法即可

    更多demo示例请看我的GitHub

React搭建项目(全家桶)的更多相关文章

  1. react 项目全家桶构件流程

    资源:create-react-app.react.react-dom.redux.react-redux.redux-thunk.react-router-dom.antd-mobile/antd. ...

  2. 如何使用React搭建项目

    1.首先说明node.js.npm.cnpm分别是做什么的? node.js简单的说 Node.js 就是运行在服务端的 JavaScript,安装了node.js默认安装了npm,可以使用npm - ...

  3. 使用webpack和react搭建项目

    看了N多博客,日志,一边迷茫一边摸索.本文记录流程.我怕自己忘了...并且修复了博客园首页推荐那个日志中遇到的bug 1.webstorm新建一个空白项目,比如webpack_demo 2.因为要用r ...

  4. 搭建vue全家桶

    1.直接利用vue-cli脚手架快速搭建 (1)全局安装vue-cli npm install -g vue-cli (2)创建项目 vue init webpack-simple my-projec ...

  5. react搭建项目

    1.创建react项目 使用react脚手架create-react-app npm install -g create-react-app create-react-app my-app cd my ...

  6. react全家桶从0搭建一个完整的react项目(react-router4、redux、redux-saga)

    react全家桶从0到1(最新) 本文从零开始,逐步讲解如何用react全家桶搭建一个完整的react项目.文中针对react.webpack.babel.react-route.redux.redu ...

  7. 使用React全家桶搭建一个后台管理系统

    引子 学生时代为了掌握某个知识点会不断地做习题,做总结,步入岗位之后何尝不是一样呢?做业务就如同做习题,如果‘课后’适当地进行总结,必然更快地提升自己的水平. 由于公司采用的react+node的技术 ...

  8. react-music React全家桶项目,精品之作!

    React-Music 全家桶项目,精品之作! 一.简介 该项目是基于React全家桶开发的一个音乐播放器,技术栈采用:Webpack + React + React-redux + React-ro ...

  9. 【实战】Vue全家桶(vue + axios + vue-router + vuex)搭建移动端H5项目

    使用Vue全家桶开发移动端页面. 本博文默认已安装node.js. github链接 一.准备工作 安装vue npm install vue 安装脚手架vue-cli npm install -g ...

随机推荐

  1. 当linux突然修改任何设置都没办法联网时的绝对有效解决办法

    以下操作为重新启动虚拟网卡的相关配置,初始化并重启虚拟网卡,对目前的配置不会有任何影响 打开终端,依次输入以下内容:– sudo service network-manager stop– sudo  ...

  2. CentOS6下安装zabbix3.4

    安装环境 系统 Centos6.7,最小化安装 CPU 2核 内存 2G 硬盘 200G IP 192.168.100.168/24 主机名 zabbix Zabbix版本 3.4 数据库 mysql ...

  3. C语言l博客作业05

    问题 回答 这个作业属于哪个课程 C语言程序设计ll 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/SE2019-2/homework/9830 我在这 ...

  4. 【洛谷P1835】素数密度

    题目描述: 给定区间[L,R](L≤R≤2147483647,R-L≤1000000),请计算区间中素数的个数. 思路: 暴力: 蒟蒻:哦?绿题?这么水?(便打出下面代码) 这绝对是最容易想到的!但, ...

  5. JS的静态类型检测,有内味儿了

    我们知道 TypeScript 2.3 以后的版本支持使用--checkJs对.js文件进行类型检查和错误提示. 但是由于 JavaScript 是弱类型语言,在编写代码的时候,是无法检测变量的类型的 ...

  6. pom父工程dependencyManagement中的jar包在子工程中不写版本号无法引入的问题

    1.遇到的问题:  本人用的idea,然后在导入别人的项目的时候,pom文件中没有报错了,但是在maven栏目中jar包却一直报红,是因为我没写版本的原因吗?不对呀,我的父工程下已经写了springb ...

  7. java访问数据库被拒绝,不能连接数据库ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

    错误原因:mysql数据库只允许本地ip访问: 解决方法:修改mysql表设置所有ip都可以访问: 登录数据库 使用以下命令: use mysql; grant all privileges on * ...

  8. MyBatis开发Dao的原始Dao开发和Mapper动态代理开发

    目录 咳咳...初学者看文字(Mapper接口开发四个规范)属实有点费劲,博主我就废了点劲做了如下图,方便理解: 原始Dao开发方式 1. 编写映射文件 3.编写Dao实现类 4.编写Dao测试 Ma ...

  9. 配置基于全局地址池的DHCP

    配置基于全局地址池的DHCP 配置基于全局地址池的DHCP服务器,从所有接口上的用户都可以选择该地址池中的地址,是个公共地址池. 实验 1.拓扑图 2.实验步骤 基本配置 开启DHCP功能 创建一个全 ...

  10. poi-tl二次开发

    poi-tl二次开发 poi-tl是一款非常好用的word模板生成库,更新响应快.文档demo齐全.堪称word模板界的小军刀! 写在前面 如果你对word模板技术有了解.或者有兴趣,更甚者工作中接触 ...