使用 create-react-app 构建React工程化项目
这里你需要了解一下creat-react-app脚手架的搭建过程。搜一下吧
这一步主要是下载cra
1.create-react-app概述
- 简介:create-react-app:基于webpack搭建一套脚手架
- 脚手架:默认把webpack打包规则处理好了,基础项目结构也创建好了
- 后面命令都是yarn,故可以了解一下yarn
1.1 react的版本
V16:用的多
V17:应该是底层升级,与16看不出来太多差别
V18:新版本、机制语法都升级了(默认安装)
1.2 初识create-react-app
1.2.1 安装create-react-app
全局安装
$ npm i create-react-app -g 「mac需要加sudo」
基于脚手架创建项目「项目名称需要符合npm包规范」:使用“数字、小写、_” 
| 12
 3
 
 | $ npx create-react-app xxx` # xxx是你自定义的项目名$ cd my-app`
 $ npm start
 
 | 
1.2.2 安装后的文件目录
安装完毕,接下来就阅读一下文件目录
| 12
 3
 4
 5
 6
 7
 8
 
 | |- node_modules  包含安装的模块|- public  页面模板和IconLogo
 |- favicon.ico
 |- index.html
 |- src  我们编写程序的地方
 |- index.jsx  程序入口「jsx后缀名可以让文件支持jsx语法」
 |- package.json
 |- ...
 
 | 
1.2.3 从package.json认识基本结构
create-react-app是一个集成了很多内容的脚手架,从package.json,我们可以了解它的基本信息
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 
 | {
 ...
 "dependencies": {
 ...
 "react": "^18.2.0",
 "react-dom": "^18.2.0",
 "react-scripts": "5.0.1",
 "web-vitals": "^2.1.4"
 },
 "scripts": {
 "start": "react-scripts start",
 "build": "react-scripts build",
 "test": "react-scripts test",
 "eject": "react-scripts eject"
 },
 "eslintConfig": {
 "extends": [
 "react-app",
 "react-app/jest"
 ]
 },
 "browserslist": {
 
 
 "production": [
 ">0.2%",
 "not dead",
 "not op_mini all"
 ],
 "development": [
 "last 1 chrome version",
 "last 1 firefox version",
 "last 1 safari version"
 ]
 }
 }
 
 | 
2.暴露webpack配置项(非必须)
前置知识,学webpack
这里因为要深入学习故暴露配置项
2.1认识暴露后的文件目录
默认情况下,会把webpack配置项隐藏到node_modules中,如果想修改,则需要暴露配置项$ yarn eject
注意事项
1、一旦暴漏后,无法还原
2、 会提醒你先把代码提交到git区,避免暴露后覆盖原始代码(必须上传代码)
3、这里需要用一个空的git库,建议先创建一个新的库,然后git add .、git commit -m(不需要上传到远端)
暴露后多了config文件夹(webpack配置)、scripts文件夹(对应下文scripts中的内容,执行相关命令的入口文件)
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 
 | 
 
 {
 "dependencies":{
 
 
 
 ...
 },
 "scripts": {
 "start": "node scripts/start.js",
 "build": "node scripts/build.js",
 "test": "node scripts/test.js"
 
 
 },
 
 "jest": {
 
 },
 "babel": {
 "presets": [
 "react-app"
 ]
 }
 }
 
 
 |- scripts
 |- start.js
 |- build.js
 |- ...
 |- config
 |- webpack.config.js
 |- paths.js
 |- ...
 
 | 
2.1.1 QUER一些疑惑:
cra为什么没有区分开发依赖,和生产依赖?
2.2真实项目中常用的一些修改操作
简单演示了如果配置less的流程,并不是目前开发必要的。sass和less按喜好来。当然文章是less。
2.2.1配置less
2.2.1.1 安装命令行:
| 12
 
 | $ yarn add less less-loader@8  #安装8版本,为了兼容。(不确定你看的时候兼容了没)$ yarn remove sass-loader  #卸载sass
 
 | 
2.2.1.2 配置
 vscode折叠代码块(方便看)
折叠所有 Ctrl+K+0(零)
展开所有 Ctrl+K+J
配置对应less的内容,其实就是把sass名改为less
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 
 | 
 const lessRegex = /\.less$/;
 const lessModuleRegex = /\.module\.less$/;
 
 
 
 {
 test: lessRegex,
 exclude: lessModuleRegex,
 use: getStyleLoaders(
 ...
 'less-loader'
 )
 },
 {
 test: lessModuleRegex,
 use: getStyleLoaders(
 ...
 'less-loader'
 ),
 }
 
 | 
注意是改两次,一个lessRegex,一个lessModuleRegex
2.2.1.3写入一个less文件用于测试
| 12
 3
 4
 5
 6
 7
 8
 
 | @B:lightblue;
 
 html,
 body {
 height: 100%;
 background: @B;
 }
 
 | 
然后导入index.jsx
| 12
 3
 4
 5
 6
 7
 8
 9
 
 | import React from 'react';
 import ReactDOM from 'react-dom/client';
 import './index.less';
 
 const root = ReactDOM.createRoot(document.getElementById('root'));
 root.render(
 <div>zono 无敌</div>
 );
 
 | 
待其他配置完之后测试
2.2.2 配置别名
配置一个别名,这样以后@就能直接访问src目录
| 12
 3
 4
 5
 6
 7
 8
 
 | resolve: {
 ...
 alias: {
 '@': path.appSrc,
 ...
 }
 }
 
 | 
2.2.3 配置预览域名
可以修改端口号,有两种方式
| 12
 3
 4
 5
 6
 7
 
 | 
 const HOST = process.env.HOST || '127.0.0.1';
 
 
 
 
 
 | 
2.2.3.1 QUER一点疑惑
QUER:为什么localhost下使用cross-env设置的POST不生效
这是因为在webpackDevServer.config.js中,会对host进行判断,如果是localhost,就会使用默认的端口(生成的答案待解决)
2.2.4 配置跨域代理
我们可以看见paths.proxySetup中指定了读取跨域文件的位置(在paths.proxySetup中搜索paths.proxySetup),也就是src/setupProxy.js
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 
 | 
 
 
 
 
 const { createProxyMiddleware } = require('http-proxy-middleware');
 module.exports = function (app) {
 app.use(
 createProxyMiddleware("/api", {
 target: "http://127.0.0.1:7100",
 changeOrigin: true,
 ws: true,
 pathRewrite: { "^/api": "" }
 })
 );
 };
 
 
 
 
 const createProxyMiddleware = require("http-proxy-middleware");
 module.exports = function (app) {
 app.use(
 createProxyMiddleware("/jian", {
 target: "https://www.jianshu.com/asimov/",
 changeOrigin: true,
 pathRewrite: {
 "^/jian": "",
 },
 })
 );
 };
 
 
 | 
测试
也能配置到package.json中,但因为json的原因,只能配置一个
2.2.4.1 QUER一些疑惑:
别尝试这个了,配置后会有跨域问题,我还不会解决
TODO 学习node中间件
2.2.5配置浏览器兼容(可选)
解决老版本浏览器兼容
修改兼容后对postcss-loader、babel-loader生效,但对ES6内置API不兼容
可以用@babel/polyfill,但脚手架中不需要我们来自己安装,因为有react-app-poly(看package.json)
在index.jsx中加入
| 12
 3
 
 | import 'react-app-polyfill/ie9';import 'react-app-polyfill/ie11';
 import 'react-app-polyfill/stable';
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 
 | 
 "browserslist": {
 "production": [
 ">0.2%",
 "not dead",
 "not op_mini all"
 ],
 "development": [
 "last 1 chrome version",
 "last 1 firefox version",
 "last 1 safari version"
 ]
 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 
ps:每次配置都可以yarn start测试一下效果
其余的一些优化配置、响应式布局的配置等,实战中再去处理!!