使用 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包规范」:使用“数字、小写、_”
1 2 3
| $ npx create-react-app xxx` # xxx是你自定义的项目名 $ cd my-app` $ npm start
|
1.2.2 安装后的文件目录
安装完毕,接下来就阅读一下文件目录
1 2 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,我们可以了解它的基本信息
1 2 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中的内容,执行相关命令的入口文件)
1 2 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 安装命令行:
1 2
| $ 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
1 2 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文件用于测试
1 2 3 4 5 6 7 8
| @B:lightblue;
html, body { height: 100%; background: @B; }
|
然后导入index.jsx
1 2 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目录
1 2 3 4 5 6 7 8
| resolve: { ... alias: { '@': path.appSrc, ... } }
|
2.2.3 配置预览域名
可以修改端口号,有两种方式
1 2 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
1 2 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
中加入
1 2 3
| import 'react-app-polyfill/ie9'; import 'react-app-polyfill/ie11'; import 'react-app-polyfill/stable';
|
1 2 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
测试一下效果
其余的一些优化配置、响应式布局的配置等,实战中再去处理!!