背景

最近因为要做一个新的管理后台项目,新公司大部分是用vue写的,技术栈这块也是想切到react上面来,所以,这次从0到1重新搭建一个react项目架子,需要考虑的东西的很多,包括目录结构、代码规范、请求封装等等,

涉及内容较多,所以我分成了几个部分来记录搭建的过程:

  1. 从0到1用react+antd+redux搭建一个开箱即用的企业级管理后台系列(基础篇)
  2. 从0到1用react+antd+redux搭建一个开箱即用的企业级管理后台系列(引入redux)
  3. 从0到1用react+antd+redux搭建一个开箱即用的企业级管理后台系列(菜单路由)
  4. 从0到1用react+antd+redux搭建一个开箱即用的企业级管理后台系列(权限)

项目我已经上传到github,有需要的可以自取,记得star哦!也欢迎大家在上面提issue~

项目初始化

  1. 通过create-react-app并使用typescript模板创建项目
  1. yarn create react-app react-antd-adminMT --template typescript
  1. 目录结构调整

为了便于开发和管理代码,我们在src下创建components、navigation、pages、redux、services、utils子文件夹

  1. ├── LICENSE
  2. ├── README.md
  3. ├── build
  4. ├── mock ---本地mock服务
  5.    ├── server.js
  6.    └── test.js
  7. ├── package.json
  8. ├── public
  9. ├── src
  10.    ├── components ---组件
  11.    ├── config ---配置文件
  12.    ├── index.css
  13.    ├── index.tsx
  14.    ├── navigation ---路由导航
  15.    ├── pages ---页面组件
  16.    ├── redux
  17.    ├── services ---接口文件
  18.    ├── setupProxy.js
  19.    ├── setupTests.ts
  20.    └── utils ---工具相关
  21. ├── tsconfig.json
  22. └── yarn.lock

多环境打包配置

例如我们需要配置多个不同的环境,加载不同的变量

  1. .env.development
  2. .env.staging
  3. .env.production

每个文件里面对应不同的变量值

  1. PORT=3000
  2. REACT_APP_ENV=staging
  3. REACT_APP_BASE_URL=https://www.zhihu.com

打包时加载不同环境变量文件

两种方式:

  • env-cmd
  • dotenv-cli
  1. "scripts": {
  2. "dev": "env-cmd -f .env.development react-scripts start",
  3. "dev:stg": "env-cmd -f .env.staging react-scripts start",
  4. "build": "react-scripts build",
  5. "build:stg": "env-cmd -f .env.staging yarn build",
  6. "build:prod": "env-cmd -f .env.production yarn build",
  7. "test": "react-scripts test",
  8. "eject": "react-scripts eject"
  9. },

这里我使用的是env-cmd,通过在脚本命令配置env-cmd -f .env.development,这样我们就可以再执行yarn dev的时候加载.env.development文件里面的变量,类似,每个不同环境打包加载对应不同的环境变量

配置代码规范

prettier配合eslint

eslint主要用于语法校验,prettier保持风格统一

  1. 安装相关包
  1. $ yarn add C eslint-plugin-prettier eslint-config-prettier --dev

上面安装包中eslint、 prettier肯定是必不可少的。eslint-plugin-prettier插件会调用prettier对你的代码风格进行检查,eslint-config-prettier插件可以关闭一些不必要的或者与prettier冲突的lint选项

  1. 在根目录下创建.eslintrc.js文件
  1. module.exports = {
  2. root: true,
  3. parserOptions: {
  4. ecmaFeatures: {
  5. jsx: true
  6. }
  7. },
  8. env: {
  9. browser: true,
  10. es6: true
  11. },
  12. extends: ['react-app', 'plugin:prettier/recommended'],
  13. plugins: ['prettier'],
  14. rules: {
  15. 'prettier/prettier': 'error',
  16. 'react-hooks/rules-of-hooks': 'error',
  17. 'react-hooks/exhaustive-deps': 'off'
  18. }
  19. }

eslint配置项有很多,例如:

Parser、parserOptions、Environments、Globals、Plugins、extends、Rules

详情可以查看eslint手册 https://eslint.bootcss.com/docs/user-guide/configuring

这里主要介绍下extends、plugins和rules选项

  1. extends

一个配置文件可以从基础配置中继承已启用的规则。extends 里面可以引入 共享配置包,可以引入 插件

  • 可共享的配置

可共享的配置 是一个 npm 包,它输出一个配置对象。extends 属性值可以省略包名的前缀 eslint-config-。

  • 插件

插件 是一个 npm 包,通常输出规则。plugins 属性值 可以省略包名的前缀 eslint-plugin-。

  • extends 属性值可以由以下组成:

(1)、plugin: (2)、包名 (省略了前缀,比如,react) (3)、/ (4)、配置名称 (比如 recommended)

例如:extends: ['react-app', 'plugin:prettier/recommended']

  1. plugins

ESLint 支持使用第三方插件。在使用插件之前,你必须使用包管理工具安装它,插件名称可以省略 eslint-plugin- 前缀

  1. rules

ESLint 附带有大量的规则,可以使用注释或配置文件修改你项目中要使用的规则。要改变一个规则设置,你必须将规则 ID 设置为off、warn、error三者之一。

  1. 根目录下创建.prettierrc.js文件
  1. module.exports = {
  2. semi: false, // 句末加分号
  3. singleQuote: true, // 用单引号
  4. printWidth: 80, // 换行字符串阈值
  5. jsxSingleQuote: true, // 在jsx中使用单引号代替双引号
  6. trailingComma: 'none', // 最后一个对象元素加逗号
  7. arrowParens: 'avoid' // (x) => {} 是否要有小括号
  8. }
  1. 上面将eslint和prettier配置完了之后,但是要能够自动格式化,那么我们还需要做一些集成。例如,在修改代码保存后,能够自动格式化代码

打开VScode的配置文件,添加如下配置

  1. {
  2. "eslint.alwaysShowStatus": true,
  3. "editor.formatOnSave": true,
  4. "[javascript]": {
  5. "editor.formatOnSave": false
  6. },
  7. "[html]": {
  8. "editor.formatOnSave": false
  9. },
  10. "editor.formatOnPaste": false,
  11. "editor.tabSize": 2,
  12. "javascript.updateImportsOnFileMove.enabled": "never",
  13. "editor.codeActionsOnSave": {
  14. "source.fixAll.eslint": true
  15. }
  16. }

上面添加配置因为是全局的,为了能够在团队开发时统一,我们也可以为项目单独配置,在项目根目录下创建.vscode文件夹并新建settings.json文件,然后将上面内容拷贝进去

配置husky

husky,是一个git hooks工具,它可以再我们代码commit或push的时候做一些事情,以保证我们提交的代码是符合规范的

  1. 安装husky
  1. $ yarn add husky --dev
  1. 在package.json中设置我们需要的git hooks
  1. "husky": {
  2. "hooks": {
  3. "pre-commit": "lint-staged",//commit前检查暂存区文件进行规则校验
  4. "commit-msg": "commitlint -E HUSKY_GIT_PARAMS",//校验commit时添加的备注信息是否符合我们要求的规范
  5. }
  6. },

这里我们需要下面安装几个包

  1. $ yarn add @commitlint/cli @commitlint/config-conventional lint-staged eslint-plugin-simple-import-sort -D

lint-staged,在代码提交之前,进行代码规则检查能够确保进入git库的代码都是符合代码规则的,如果在整个项目上运行lint速度会很慢,lint-staged能够让lint只检测暂存区的文件,速度很快。

@commitlint/cli @commitlint/config-conventional,这两个主要是用来规范代码提交的信息

type支持以下类型:

  • build:主要目的是修改项目构建系统(例如 glup,webpack,rollup 的配置等)的提交
  • ci:主要目的是修改项目继续集成流程(例如 Travis,Jenkins,GitLab CI,Circle等)的提交
  • docs:文档更新
  • feat:新增功能
  • fix:bug 修复
  • perf:性能优化
  • refactor:重构代码(既没有新增功能,也没有修复 bug)
  • style:不影响程序逻辑的代码修改(修改空白字符,补全缺失的分号等)
  • test:新增测试用例或是更新现有测试
  • revert:回滚某个更早之前的提交
  • chore:不属于以上类型的其他类型(日常事务)

例如:

  1. $ git commit -m 'feat: 新增xxx功能'
  2. $ git commit -m 'fix: 修复xxxbug'

如果不符合以上支持type的规范,提交的时候会报错

  1. 根目录下新建.lintstagedrc.js文件
  1. module.exports = {
  2. '**/*.{js,jsx,ts,tsx}': [
  3. 'prettier --write',
  4. 'eslint --fix --plugin=simple-import-sort --rule=simple-import-sort/imports:error',
  5. 'git add'
  6. ],
  7. '**/*.{json,md,mdx,css,html,yml,yaml,scss}': ['prettier --write', 'git add']
  8. }
  1. 根目录下新建.commitlintrc.json文件
  1. {
  2. "extends": [
  3. "@commitlint/config-conventional"
  4. ]
  5. }
  1. 最后,需要注意的是,配置好了husky之后commit不生效,发现是husky 6.0版本做了破坏性的更新,这里我们通过移除husky包并添加低版本的方式来解决
  1. $ yarn remove husky
  2. $ yarn add husky@4.3.8 -D

Http请求封装

  1. 新一个apiClient.js文件用来配置axios,最后返回axios实例
  1. import axios from 'axios'
  2. const baseURL = process.env.REACT_APP_BASE_URL
  3. const instance = axios.create({
  4. baseURL,
  5. timeout: 15000
  6. })
  7. // Add a request interceptor
  8. instance.interceptors.request.use(
  9. function (config) {
  10. // Do something before request is sent
  11. return config
  12. },
  13. function (error) {
  14. // Do something with request error
  15. return Promise.reject(error)
  16. }
  17. )
  18. // Add a response interceptor
  19. instance.interceptors.response.use(
  20. function (response) {
  21. // Any status code that lie within the range of 2xx cause this function to trigger
  22. // Do something with response data
  23. return response
  24. },
  25. function (error) {
  26. // Any status codes that falls outside the range of 2xx cause this function to trigger
  27. // Do something with response error
  28. return Promise.reject(error)
  29. }
  30. )
  31. export default instance
  1. 引入apiClient并调用axios的请求方法
  1. import apiClient from './apiClient'
  2. export const getContractList = () => apiClient.get(`/api/v4/search/top_search`)
  1. get、post传参形式

这里需要注意一点是,get和post传参形式有点区别,get请求传参需要带上params字段

  1. //get请求
  2. axios.get('/user', {
  3. params: {
  4. ID: 12345
  5. }
  6. })
  7. // post请求
  8. axios.post('/user', {
  9. firstName: 'Fred',
  10. lastName: 'Flintstone'
  11. })

本地跨域请求

在src目录下创建setupProxy.js文件配置代理接口,这样我们在请求带有/proxy-api接口的时候,就能代理到http://localhost:3001服务上,从而解决跨域的问题

  1. const { createProxyMiddleware } = require('http-proxy-middleware')
  2. module.exports = function (app) {
  3. app.use(
  4. '/proxy-api',
  5. createProxyMiddleware({
  6. target: 'http://localhost:3001',
  7. changeOrigin: true,
  8. secure: false,
  9. pathRewrite: {
  10. '^/proxy-api': '' // 请求中去除/api
  11. }
  12. })
  13. )
  14. }

搭建本地Mock服务

  1. 根目录下创建mock文件夹,新建server.js文件 ,这里我使用express开启一个node服务
  1. const express = require('express')
  2. const app = express()
  3. const port = 3001
  4. app.use(express.json())
  5. app.use(express.urlencoded({ extended: false }))
  6. app.get('/', (req, res) => {
  7. res.send('Hello World!')
  8. })
  9. // 加载路由
  10. app.use('/api', require('./test'))
  11. app.listen(port, () => {
  12. console.log(`mock server listening at http://localhost:${port}`)
  13. })
  1. 接口路由,返回mock数据
  1. var express = require('express')
  2. var router = express.Router()
  3. // http://mockjs.com/
  4. var Mock = require('mockjs')
  5. router.get('/hello', function (req, res) {
  6. res.json({ user: 'hello' })
  7. })
  8. router.get('/mock', function (req, res) {
  9. console.log(req.body)
  10. var data = Mock.mock({
  11. top_search: {
  12. 'words|10': [
  13. {
  14. query: '一人之下',
  15. display_query: '《一人之下》565'
  16. }
  17. ]
  18. }
  19. })
  20. return res.json(data)
  21. })
  22. module.exports = router

  1. 访问mock接口数据
  1. "scripts": {
  2. "mock": "nodemon ./mock/server.js",
  3. },

我们在scripts下添加一个mock脚本命令,执行yarn mock就能开启mock服务,例如访问上面接口http://localhost:3001/api/mock

文章最后

本文作者阿健Kerry,货拉拉高级前端工程师,转载请注明出处。如果觉得本文对你有帮助,记得点赞三连哦,也可以扫码关注我新建立的前端技术公众号【有你前端】,之后我所有文章会同步发到这个公众号上面。另外,我建了一个可以帮助咱们程序员脱单的公众号,每周都会推送几个优秀的单身小姐姐,如果你是程序员技术好又正好是单身,那你可以下面扫码关注【缘来你是程序猿】公众号开启你的脱单之旅。

从0到1用react+antd+redux搭建一个开箱即用的企业级管理后台系列(基础篇)的更多相关文章

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

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

  2. Rails + React +antd + Redux环境搭建

    前提条件:node和ruby on rails必须已经安装好(相关安装流程不再此处介绍) 1.nvm.node 2.npm or yarn装一个就好 3.rvm.ruby on rails 4.for ...

  3. 真刀实战地搭建React+Webpack+Express搭建一个简易聊天室

    一.前面bb两句 因为自惭(自残)webpack配置还不够熟悉,想折腾着做一个小实例熟悉.想着七夕快到了,做一个聊天室自己和自己聊天吧哈哈.好了,可以停止bb了,说一下干货. 二. 这个项目能学到啥? ...

  4. .net core 2.0学习记录(一):搭建一个.Net Core网站项目

    .Net Core开发可以使用Visual Studio 2017或者Visual Studio Code,下面使用Visual Studio 2017搭建一个.net Core MVC网站项目. 一 ...

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

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

  6. React之 redux 的简单介绍及使用

    1.为什么使用redux?在小型react项目的开发中 ,view(视图层)中的数据模型(即数据),可以存放在组件中的 state 对象,换句话说页面中的动态数据存放在 state 中. 但对于开发大 ...

  7. 《React 与 Redux 开发实例精解》出版了!

    <React 与 Redux 开发实例精解>出版了! <React 与 Redux 开发实例精解>出版了! 关于 React 与 Redux React 与 Redux, 一个 ...

  8. 从零开始搭建一个react项目

    Nav logo 120 发现 关注 消息 4 搜索 从零开始搭建一个react项目 96 瘦人假噜噜 2017.04.23 23:29* 字数 6330 阅读 32892评论 31喜欢 36 项目地 ...

  9. 快速搭建一个基于react的项目

    最近在学习react,快速搭建一个基于react的项目 1.创建一个放项目文件夹,用编辑器打开 2.打开集成终端输入命令: npm install -g create-react-app 3. cre ...

随机推荐

  1. Python 之父爆料:明年至少令 Python 提速 1 倍!

    大概在半年前,我偶然看到一篇文章,有人提出了给 Python 提速 5 倍的计划,并在寻找经费赞助.当时并没有在意,此后也没有看到这方面的消息. 但是,就在 5 月 13 日"2021 年 ...

  2. Let's go!

    第一次开通博客 心情还是很激动的,而且做出了这么好看的页面虽然都是用的别人的组件,自己不是很知道原理但是也很开心,以后会将自己学习的东西写成笔记发在上面

  3. 在Visual Studio 中使用git——浏览版本库(七)

    在Visual Studio 中使用git--什么是Git(一) 在Visual Studio 中使用git--给Visual Studio安装 git插件(二) 在Visual Studio 中使用 ...

  4. Spring AOP 框架

    引言 要掌握 Spring AOP 框架,需要弄明白 AOP 的概念. AOP 概念 AOP(Aspect Oriented Programming的缩写,翻译为面向方面或面向切面编程),通过预编译方 ...

  5. centos7 Nacos+Elasticsearch+SkyWalking

    安装包下载 nacos 下载地址:https://github.com/alibaba/nacos/releases es 下载地址:https://www.elastic.co/cn/downloa ...

  6. ms5611-01ba03 气压传感器 中英文 数据手册

    中文: https://wenku.baidu.com/view/6f8a861fff00bed5b9f31d53.html 英文: https://wenku.baidu.com/view/fe93 ...

  7. esp项目,

    http://www.cirmall.com/circuit/6012/%E6%99%BA%E8%83%BD%E5%8C%96%E7%A7%8D%E8%8A%B1%E7%AE%80%E6%98%93% ...

  8. [leetcode] 37. 解数独(Java)(dfs,递归,回溯)

    37. 解数独 1A 这个题其实15分钟左右就敲出来并且对了...但是由于我输错了一个数..导致我白白debug一个多小时.. 没啥难度,练递归-dfs的好题 class Solution { pri ...

  9. OpenResty 最佳实践

    OpenResty 最佳实践 https://moonbingbing.gitbooks.io/openresty-best-practices/content/index.html

  10. 安装spark 报错:java.io.IOException: Could not locate executable E:\hadoop-2.7.7\bin\winutils.exe

    打开 cmd 输入 spark-shell 虽然可以正常出现 spark 的标志符,但是报错:java.io.IOException: Could not locate executable E:\h ...