create-react-app + antd 后台管理项目创建详细步骤

一、 创建项目:

1. npm i create-react-app -g  --> 全局安装react脚手架(进度条卡住时可按下回车)

2. create-react-app react-demo --> 创建一个名为react-demo的项目

3. cd react-demo --> 进入该项目

4. npm/yarn start --> 启动项目(推荐yarn,它和react都是Facebook开发)

ps:
vscode-react配置:
    1.settings.json写入:
    // 标签自动闭合
    "emmet.includeLanguages": {
        "javascript": "javascriptreact"
    }
    2.插件:ES7 React/Redux/GraphQL/React-Native snippets

yarn add prop-types // 安装props限制的库
用法:
    import PropTypes from 'prop-types'
    static propTypes = {
        todos: PropTypes.func.isRequired
    }
yarn add uuid(体积较大) OR yarn add nanoid(体积较小) // 生成uuid的库
用法:
    import { nanoid } from 'nanoid'
    console.log(nanoid())

二、文件分析:

1. public/manifest.json --> 应用加壳时的配置文件;
2. public/robots.text --> 爬虫规则文件;
3. src/index.js --> 项目入口文件;
4. src/reportWebVitals --> 记录页面性能;
5. src/setupTests.js --> 组件测试,需要配合jest-dom库使用;
6. src/App.test.js --> 用于给app做测试;
7. yarn.lock --> yarn的缓存文件;

区分组件和js文件:
1. 组件以.jsx结尾,功能文件以js结尾;
2. 组件首字母大小,功能文件全部小写;

三、上传到github

1. github创建一个仓库 repositories

2. git init --> 在项目路径下初始化一个仓库

3. git add . 

4. gc -m 'xxx'

5. git remote add origin https://github.com/xxx.git
--> 建立远程仓库
6. git push -u origin master --> 将本地仓库push到远程仓库

ps:本地删除.eslintcache文件不生效,因为已经push到了远端:
git rm .eslintcache -r // 删除需要被忽略的文件
add -> commit -> push 到远端服务器

四、引入UI库:

1. npm i antd -S

2. 引入到项目中:

(1) 全局引入(打包后比较大,建议按需引入):

在项目入口引入所有样式:import antd/dist/antd.css

在项目中引入antd组件:import { Button } from 'antd'

(2) 按需加载(3种方法):

1、引入独立的组件和样式(基本不采用):
import Button from 'antd/lib/button';
import 'antd/lib/button/style';
2、暴露配置 + babel-plugin-import:
npm run eject(暴露webpack的配置,不可逆)
npm i babel-plugin-import -S
修改package.json:
    "babel": {
      "presets": [
        "react-app"
      ],
      "plugins": [
    +   ["import", { "libraryName": "antd", "libraryDirectory": "es", "style": "css" }]
      ]
    }
项目中直接引入antd组件,不需另外引入css:import { Button } from 'antd'
参考:https://www.xiaoweihuang.me/2018/11/14/two-ways-to-import-antd-into-react-app/
https://juejin.im/post/5b20a3546fb9a01e312833d5
3、推荐:react-app-rewire + babel-plugin-import:

yarn add react-app-rewired customize-cra

/* package.json */
"scripts": {
-   "start": "react-scripts start",
+   "start": "react-app-rewired start",
-   "build": "react-scripts build",
+   "build": "react-app-rewired build",
-   "test": "react-scripts test",
+   "test": "react-app-rewired test",
}

yarn add babel-plugin-import

/* 根目录新建config-overrides.js */
const { override, fixBabelImports } = require('customize-cra');
 module.exports = override(
   fixBabelImports('import', {
     libraryName: 'antd',
     libraryDirectory: 'es',
     style: 'css',
   }),
 );

3、自定义主题、用@代替src路径

yarn add less less-loader

/* 修改 config-overrides.js */
- const { override, fixBabelImports } = require('customize-cra');
+ const { override, fixBabelImports, addLessLoader } = require('customize-cra');
+ const path = require('path')

+ function resolve(dir) {
+  return path.join(__dirname, dir)
+}

module.exports = override(
  fixBabelImports('import', {
    libraryName: 'antd',
    libraryDirectory: 'es',
-   style: 'css',
+   style: true,
  }),
+ addLessLoader({
+   lessOptions:{
+     javascriptEnabled: true,
+     modifyVars: { 
+       '@primary-color': '#1DA57A' 
+     }
+   }
+ }),
+ addWebpackAlias({
+     '@': resolve('src')
+ })
);

五、路由:

1. 安装路由器:yarn add react-router-dom -S
2. app.js中引入:
import { BrowserRouter, Route, Switch } from 'react-router-dom'
3. 使用:
<BrowserRouter>
  <Switch> {/* 只匹配其中一个 */}
    <Route path='/login' component={Login}></Route>
    <Route path='/' component={Admin}></Route>
  </Switch>
</BrowserRouter>
4. ps:
react路由的两种模式:HashRouter(hash模式),BrowserRouter(history模式)

六、开发环境跨域

1. yarn add http-proxy-middleware

2. src文件夹根目录添加一个setupProxy.js文件:
const { createProxyMiddleware } = require('http-proxy-middleware');
module.exports = function (app) {
  app.use( // 可配置多个代理
    '/api',
    createProxyMiddleware({
      target: 'http://111.11.11.111',
      changeOrigin: true,
      pathRewrite: {
        '^/api': ''
      }
    })
  )
}

七、高阶函数

  1. 定义:高阶函数是一类特别的函数。
  2. 类型:接收函数类型的参数,或返回值是函数。
  3. 常见的高阶函数:
1、定时器
2、Promise的then()
3、数组遍历相关的方法:forEach()/filter()/map()/reduce()/find()/findIndex()
4、函数对象的bind()
5、Form.create()() / getFieldDecorator()()
  1. 高阶函数更新动态,更加具有扩展性

六、高阶组件

1. 本质是一个函数,接收一个组件(被包装组件),返回一个新的组件(包装组件)。
新组件内部渲染,包装组件会向被包装组件传入特定属性。 
2. 作用:扩展某个组件的功能。
3. 高阶组件也是高阶函数:接收一个组件函数,返回一个新的组件函数。
4. withRouter:向非路由组件传递history,location,match三个属性。

八、模拟前端需要的数据

1. yarn add json-server mockjs nodemon (json-server 支持跨域)
2. cd 自定义的存储假数据的文件夹(mock),新建一个db.js文件.
db.js 中:
    let Mock = require('mockjs')
    let Random = Mock.Random
    module.exports = function() {
      return data
    }
3. 启动服务的命令: json-server db.js -p 3001 -c ./config.js
4. 也可以根目录的package.json,写入
{
  "scripts": {
    "mock": "json-server db.js --port 3001"
  }
}
再次启动用npm run mock 即可
5. 项目根目录下的package.json中可以配置代理:"proxy": "http://localhost:3001"

参考:
https://www.jianshu.com/p/20a681a9c645
https://www.cnblogs.com/fly_dragon/p/9150732.html

九、封装请求接口的模块

1. 封装常用的几种接口请求方式的方法,并暴露出来。
2. 使用async和await可以简化promise的then和catch,以同步编码方式实现异步流程。
3. await不能单独使用,在返回promise的表达式左侧写await,await所在的最内层函数的左侧写async。
4. 优化:
    统一处理请求异常:
        在外层包一个自己创建的promise对象,在请求成功时resolve(res),
        在请求失败时不reject(err),而是显示错误提示。

杂7杂8

1. render中第一行写debugger,即可在source中断点调试;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。