其他章节请看:

react 高效高质量搭建后台系统 系列

脚手架搭建

本篇主要创建新项目 myspug,以及准备好环境(例如:安装 spug 中用到的包、本地开发和部署、自定义配置 react-app-rewired、代理 http-proxy-middleware、babel),为后续搭建真正的框架打好基石。

注:许多细节前面我们已经研究过,这部分就不在冗余介绍,请看相关链接。

创建新项目

详情请看 这里

Create React App 是一个用于学习 React 的舒适环境,也是用 React 创建新的单页应用的最佳方式。

$ npx create-react-app myspug
$ cd myspug/
$ npm start

访问 http://localhost:3000 即可看到 react 的页面。就像这样:

myspug 目录结构如下:

Mode                 LastWriteTime         Length Name
---- ------------- ------ ----
d----- 2022/3/3 17:50 node_modules
d----- 2022/3/3 17:48 public
d----- 2022/3/18 19:22 src
-a---- 1985/10/26 16:15 310 .gitignore
-a---- 2022/3/3 17:49 1120931 package-lock.json
-a---- 2022/3/3 17:49 817 package.json
-a---- 1985/10/26 16:15 3359 README.md
  • public 中最重要的是 index.html,即单页面
  • src/index.js 是入口文件,里面引用着 src/App.js 组件。

安装依赖包

我们根据 spug/packages.json 的内容,选择性的安装自己所需要的软件包。

// spug/packages.json
{
"name": "spug_web",
"version": "3.0.0",
"private": true,
"dependencies": {
// icon
"@ant-design/icons": "^4.3.0",
// 图表相关
"@antv/data-set": "^0.11.8",
// Ace 是一个用 JavaScript 编写的代码编辑器。 (不用)
"ace-builds": "^1.4.13",
// ui
"antd": "^4.19.2",
// http
"axios": "^0.21.0",
// 图表
"bizcharts": "^3.5.9",
// 小型功能路由器,通过搜索 `Enroute({` 发现只在 Test.js 中使用,应该是用于测试(不用)
"enroute": "^1.0.1",
// 路由相关
"history": "^4.10.1",
// jquery (不用)
"jquery": "^3.6.0",
"lodash": "^4.17.19",
// 状态
"mobx": "^5.15.6",
"mobx-react": "^6.3.0",
// 日期库
"moment": "^2.24.0",
// 数字
"numeral": "^2.0.6",
"react": "^16.13.1",
// 与 ace Editor 相关(不用)
"react-ace": "^9.5.0",
// react
"react-dom": "^16.13.1",
// 路由
"react-router-dom": "^5.2.0",
"react-scripts": "3.4.3",
// 浏览器中使用终端(不用)
"xterm": "^4.6.0",
"xterm-addon-fit": "^0.5.0"
},
// 本地启动、打包
"scripts": {
"start": "react-app-rewired start",
"build": "react-app-rewired build",
"test": "react-app-rewired test",
"eject": "react-scripts eject"
},
// eslint 相关。查找并修复JavaScript代码中的问题。
"eslintConfig": {
"extends": "react-app"
},
// 编译后的源码支持的浏览器。不用动
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
}, "devDependencies": {
// 用于支持 es6 中装饰器的语法
"@babel/plugin-proposal-decorators": "^7.10.5",
"anywhere": "^1.5.0",
"bx-tooltip": "^0.1.6",
// 新的 react-app-rewired@2.x 版本的关系,你还需要安装 customize-cra
"customize-cra": "^1.0.0",
// http 代理中间件
"http-proxy-middleware": "0.19.2",
"less": "^3.12.2",
"less-loader": "^7.1.0",
"mockjs": "^1.1.0",
// 一个对 create-react-app 进行自定义配置的社区解决方案
"react-app-rewired": "^2.1.6"
}
}

笔者安装如下软件包:

// ui
$ npm i antd
// 状态管理
$ npm i mobx mobx-react
// http
$ npm i axios
// 路由
$ npm i react-router-dom@5
// icon
$ npm i @ant-design/icons
// 修改配置文件
$ npm i -D react-app-rewired customize-cra
// css 预编译
$ npm i -D less less-loader
// bebel 相关
$ npm i -D @babel/plugin-proposal-decorators@7
// mock 数据
$ npm i -D mockjs@1
// 图表
$ npm i bizcharts@3
$ npm i @antv/data-set
// 路由相关
$ npm i history@4
// js 工具库
$ npm i lodash
// 日期
$ npm i moment
// 数字
$ npm i numeral

Tip:如果安装失败可以这样:

  • 每次安装一个包
  • 切换安装包的版本
  • 再次尝试,有时候第二遍就成功
  • 回家尝试,公司安装失败,家里可能安装成功

至此,对比 spug 和 myspug 的 package.json,有如下差异以及一些未完成项:

  • myspug 没有jquery、ace-builds、react-ace、enroute、xterm、xterm-addon-fit,因为笔者不需要。
  • bx-tooltip 视后面需求是否安装
  • scripts,用于启动项目或编译项目。spug 中使用的是 react-app-rewired,而 myspug 使用的是 react-scripts。下文配置。
  • http-proxy-middleware 未安装,代理相关。下文安装并配置
  • eslintConfig 配置,eslint 相关。两者几乎相同,不管它。
  • browserslist 配置,编译后的源码支持的浏览器。两者相同,不管它。

antd 按需引入 css

详情请看 这里

spug 中使用的是 react-app-rewired,而 myspug 使用的是 react-scripts。

react-app-rewired 是一个对 create-react-app 进行自定义配置的社区解决方案。

react-app-rewired 的引入是作为 antd 按需引入 css 解决方案的一部分。

步骤如下:

  • 安装 react-app-rewired 和 customize-cra(上文已安装)
  • 安装 babel-plugin-import
  • 修改 package.json,通过 react-app-rewired 来启动、打包和测试
/* 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",
}
  • 项目根目录创建一个 config-overrides.js(内容请看链接) 用于修改默认配置
  • 修改 App.js 用于验证 antd 样式按需引入是否生效
// E:\myspug\src\App.js
import { Button } from 'antd'; export default function App() {
return (
<div className="App">
<Button type="primary">Primary Button</Button>
</div >
);
}
  • 最后启动服务 npm run start,浏览器访问 http://localhost:3000/,看见一个蓝色按钮说明成功。

Tip: 笔者遇到如下报错,经尝试发现点击antd.css(@import '~antd/dist/antd.css';)报错,怀疑包下载有问题,最后卸载 antd,再次安装 antd@4即可。

Compiled with problems:X

ERROR in ./src/App.js 3:0-34

Module not found: Error: Can't resolve 'antd/es/button/style/css' in 'E:\myspug\src'

代理

详细介绍 这里

代理后续或许会用得到,我们先配置它。

Tip:笔者这版的react脚手架默认已有 http-proxy-middleware(http 代理中间件),所以我们无需重复下载

步骤如下:

  • 新建 setupProxy.js 用于配置
// src/setupProxy.js

const { createProxyMiddleware } = require('http-proxy-middleware');

module.exports = function (app) {
app.use(
// 将原来的 proxy 改为 createProxyMiddleware
createProxyMiddleware(
'/pengjiali',
{
target: 'https://www.cnblogs.com/',
changeOrigin: true
}
)
)
}
  • 创建一个组件(HelloWorld.js)并在 App.js 中引入
const axios = require('axios');

export default function HelloWorld() {
axios.get('/pengjiali/p/14561119.html')
.then(function (response) {
// handle success
console.log(response.data);
}).catch(function (error) {
// handle error
console.log(error);
}) return <div>hello world2!</div>
}
  • 重启服务,控制台输出博文内容,说明代理生效。

Tip:初次运行 require('axios') 报错,将 axios 卸载,安装和 spug 中相同的版本 npm i axios@0 即可。

babel

例如 es11 中有 BigInt、可选链操作符( ?. )、空值合并操作符(??),spug 是否会将 ?. 编译,在低版本浏览器中运行呢?

在 spug 中 package.json 中与 babel 相关的单词只有 @babel/plugin-proposal-decorators(后续讲状态管理 mobx 时一起介绍),也就是用于支持装饰器。

由于后台系统通常可以指定浏览器版本,笔者就不展开。

Tip:感兴趣的朋友可以自行提取 spug 项目的 webapck 配置查看。这个过程是不可逆的。

其他章节请看:

react 高效高质量搭建后台系统 系列

react 高效高质量搭建后台系统 系列 —— 脚手架搭建的更多相关文章

  1. 使用vue1.0+es6+vue-cli+webpack+iview-ui+jQuery 撸一套高质量的后台管理系统

    首先按照vue.js官网的指令安装: 1.本地安装好node.js 2.根据官方命令行工具 详情 这样一个官方的脚手架工具就已经搭建好了:但是有一点需要注意的是由于现在按照官方的搭建方法是搭建vue2 ...

  2. 建站集成软件包 XAMPP搭建后台系统与微信小程序开发

    下载安装XAMPP软件,运行Apache和MySQL 查看项目文件放在哪个位置可以正常运行 然后访问localhost即可 下载weiphp官网的weiapp(专为微信小程序开发使用)放在htdocs ...

  3. 编写高质量的Python代码系列(八)之部署

    Python提供了一些工具,使我们可以把软件部署到不同的环境中.它也提供了一些模块,令开发者可以把程序编写的更加健壮.本章讲解如何使用Python调试.优化并测试程序,以提升其质量与性能. 第五十四条 ...

  4. 编写高质量的Python代码系列(一)之用Pythonic方式来思考

    Python开发者用Pythonic这个形容词来描述具有特定风格的代码.这种风格是大家在使用Python语言进行编程并相互协作的过程中逐渐形成的习惯.那么,如何以改风格完成常见的Python编程工作呢 ...

  5. nodejs 从helloworld到高质量的后台服务server的一点思考

    ---恢复内容开始--- 新公司用的nodejs作为app和网站的后台服务server,所以最近对nodejs一直在学习,加上之前简单的学习了一点,看了两天后台接口源码,所以就直接上手干活了,下面是我 ...

  6. 编写高质量的Python代码系列(七)之协作开发

    如果多个人要开发同一个Python程序,那就得仔细商量代码的写法了.即使你是一个人开发,也需要理解其他人所写的模块.本节讲解多人协作开发Python程序时所用的标准工具及最佳做法. 第四十九条:为每个 ...

  7. 编写高质量的Python代码系列(六)之内置模块

    Python预装了许多写程序时会用到的重要模块.这些标准软件包与通常意义上的Python语言联系得非常精密,我们可以将其当成语言规范的一部分.本节将会讲解基本的内置模块. 第四十二条:用functoo ...

  8. 编写高质量的Python代码系列(五)之并发与并行

    用Python可以很容易就能写出并发程序,这种程序可以在同一时间做许多间不同的事情.我们也可以通过系统调用.子进程(subprocess)及C语言扩展来实现并行处理. 第三十六条: 用subproce ...

  9. 编写高质量的Python代码系列(四)之元类及属性

    元类(metaclass)及动态属性(dynamic attribute)都是很强大的Python特性,然后他们也可能导致及其古怪.及其突然的行为.本节讲解这些机制的常见用法,以确保各位程序员写出来的 ...

  10. 编写高质量的Python代码系列(三)之类与继承

    用Python进行编程时,通常需要编写心累,并定义这些类应该如何通过其接口及继承体系与外界交互.本节讲解如何使用类和继承来表达对象所以更具备的行为. 第二十二条:尽量用辅助类来维护程序的状态,而不要用 ...

随机推荐

  1. 洛谷P3243 [HNOI2015]菜肴制作 (拓扑排序/贪心)

    这道题的贪心思路可真是很难证明啊...... 对于<i,j>的限制(i必须在j之前),容易想到topsort,每次在入度为0的点中选取最小的.但这种正向找是错误的,题目要求的是小的节点尽量 ...

  2. ASP.NET Core :缓存系列(四):内存缓存 MemoryCache

    System.Runtime.Caching/MemoryCache ICacheEntry 接口中的属性:具体设置过期时间 可以参考:微软文档ICacheEntry 接口 缓存基本使用 (一) 绝对 ...

  3. 实例分析Scheduled Thread Pool Executor与Timer的区别

    摘要:JDK 1.5开始提供Scheduled Thread PoolExecutor类,Scheduled Thread Pool Executor类继承Thread Pool Executor类重 ...

  4. 【算法】Tarjan

    参考资料: 图论相关概念 - OI WIKI | 强连通分量 - OI WIKI 初探tarjan算法 | Tarjan,你真的了解吗 一.概念 • 子图: 对一张图 \(G=(V,E)\),若存在另 ...

  5. el-form-item label中的字体样式设置格式

    1.设置前的代码 <el-form-item label="管理员密码" prop="password" > <el-input type=& ...

  6. python环境安装(pyhon和pycharm)

    一.python安装 在地址栏输入https://www.python.org/进入python官网, 点击windows后会出现各种可供下载的历史版本, 安装包下载后,双击运行 点击下一步 勾选下面 ...

  7. Web自动化---解决登录页面随机验证码问题

    一.抛出问题 在日常的测试工作中,遇到了这样一个登录页面,如下图: 像我们之前做过UI自动化的同学就知道,自动输入账号和密码,这个简单,但是怎么样来识别验证码呢?验证码的形式有多种,有纯数字的,纯字母 ...

  8. 如何使用vscode快速配置C语言环境(简单实用)

    需要用到的工具: VSCode(Visual Studio Code) 一.首先打开官网链接,然后根据自己的电脑选择合适的安装程序进行下载. 二.在安装时默认点击下一步,最后记得勾选上添加path到系 ...

  9. 通过jmeter,将数据库数据查询出来并打印

    1. 连接数据库 1.1 添加jdbc驱动路径 1.2 JDBC Connection Configuration    1.3 JDBC Request 2. 查询数据库数据并打印 2.1 定义变量 ...

  10. DNS 解析 prefeath

    本文将详细介绍DNS预解析prefetch的主要内容 概述 DNS(Domain Name System, 域名系统),是域名和IP地址相互映射的一个分布式数据库.DNS 查询就是将域名转换成 IP ...