• 安装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. .NET自动化对象映射

    对象自动映射工具是用来解决对象之间映射转换的类库,能很好地解决DTO和Model之间的相互映射赋值问题. 只要两个对象的属性具有相同名字(或者符合它规定的命名约定),对象自动映射工具就可以替我们自动在 ...

  2. 微信浏览器跳转浏览器下载app解决方案

    新版本微信浏览器中,已禁用下载APP应用,只支持打开微信合作商APP下载,所以无法通过微信浏览器直接下载APP应用.列举微信浏览器下载APP的种解决方案: 方案:通过Url 跳转到手机默认浏览器,或者 ...

  3. 【数据结构】之顺序表(Java语言描述)

    之前总结过使用C语言描述的顺序表数据结构.在C语言类库中没有为我们提供顺序表的数据结构,因此我们需要自己手写,详细的有关顺序表的数据结构描述和C语言代码请见[我的这篇文章]. 在Java语言的JDK中 ...

  4. CentOS 7 ETCD集群配置大全

    目录 前言 环境准备 安装 静态集群 配置 node01 配置文件 node02 配置文件 node03 配置文件 启动测试 查看集群状态 生成TLS证书 etcd证书创建 安装cfssl工具集 生成 ...

  5. 深入了解CSS中盒子模型

    CSS中盒子模型介绍 什么是盒子? 盒子是用来存储物品,我们可以将盒子理解为酒盒,酒盒有什么组成的呢? 有酒可以喝.有填充物保护酒防止酒被摔坏.纸盒子. 我们怎么理解CSS中的盒子呢,CSS中盒子有什 ...

  6. IDEA如何重置窗口布局

    如何重置窗口布局 我不知道怎么搞的,左边的,上边的,下边的,视图都没有了 , 重启了一下,然后重置为默认视图,就好了

  7. 第四章 开始Unity Shader学习之旅(3)

    1. 程序员的烦恼:Debug 调试(debug),大概是所有程序员的噩梦.而不幸的是,对一个Shader进行调试更是噩梦中的噩梦.这也是造成Shader难写的原因之一--如果发现得到的效果不对,我们 ...

  8. 请问1^x+2^x+3^x+\cdots +n^x的算式是什么呢?

    目录 总结 请问\(1^x+2^x+3^x+\cdots +n^x\)的算式是什么呢? 一.求和式\(\sum\limits_{i=1}^n{i}\)的算式 如何证明求和简式\(\sum_{i=1}^ ...

  9. gulp+webpack+angular1的一点小经验(第三部分使用一些angular1的插件ui-bootstrap与highcharts)

    第一个要介绍的是我们的麻烦制造器:angular-ui-bootstrap ui-bootstrap可以有很多通用的插件给大家用,比如弹窗啊(modal),翻页控件啊(pagination),为什么说 ...

  10. 基于Win服务的标签打印(模板套打)

    最近做了几个项目,都有在产品贴标的需求 基本就是有个证卡类打印机,然后把产品的信息打印在标签上. 然后通过机器人把标签贴到产品上面 标签信息包括文本,二维码,条形码之类的,要根据对应的数据生成二维码, ...