一、安装
$ create-react-app [Project name]
二、核心依赖
react:react 核心
react-dom:用于开发渲染web 应用;
react-scripts:封装webpack服务;
"start": "react-scripts start","build": "react-scripts build","test": "react-scripts test","eject": "react-scripts eject"
react-native:用于开发渲染 App 应用;
三、暴露配置文件
$ yarn eject
新增文件
- config 文件夹:react框架webpack的配置
- scripts 文件夹:项目运行的构建脚本文件
配置修改
1、解决严格模式eslint报错
"babel": {"presets": [["babel-preset-react-app",false],"babel-preset-react-app/prod"]}
常见配置修改
alias: {'@': paths.appSrc,
const DEFAULT_PORT = parseInt(process.env.PORT, 10) || 3000;
const HOST = process.env.HOST || '0.0.0.0';
const DEFAULT_PORT = parseInt(process.env.PORT, 10) || 9527;
const HOST = process.env.HOST || '127.0.0.1';
- 修改浏览器兼容:
package.json
==>browserslist
方式一:在入口文件之间引入该依赖包;
方式二:使用提供的react-app-polyfill(react对上面依赖包的重写)
devServer: {port: 8080, proxy: {"/api": { target: "http://localhost:9000", 目标服务器},},}
const { createProxyMiddleware } = require('http-proxy-middleware')
module.exports = function (app) {app.use(createProxyMiddleware('/jian', {target: 'https://www.jianshu.com/asimov',changeOrigin: true,ws: true,pathRewrite: { '^/jian': '' },}));app.use(createProxyMiddleware('/zhi', {target: 'https://news-at.zhihu.com/api/4',changeOrigin: true,ws: true,pathRewrite: { '^/zhi': '' },}));
}
四、MVC和MVVM
react 思想
MVC:model数据 (state)> view视图 > controller 控制器 > model数据
vue 思想
MVVM:model数据 > viewModel 数据视图监听层 > view视图 > vm
双向驱动:
五、jsx
胡子语法{}:必须是js表达式;
- number/string:原样输出,其他基本类型显示为空;
- 对象:数组纯数字可以,其他报错
- 行内样式:style={{fontSize:“12px”}};驼峰命名;
- 类名:className=“box”
- 常用写法:
- 三元运算符(判断);
- Array.map()(循环)返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值;不会改变原始数组;
底层机制
-
第一步:将jsx语法
编译成虚拟DOMvirtual DOM
-
第二步:首次渲染将整个虚拟DOM渲染成真实DOM;
-
第三步:后续数据改变,通过dom-diff
算法进行新老虚拟dom
对比,以最少的修改操作真实DOM打补丁;
-
相比原生dom操作,多了首次生成虚拟dom的时间;
-
后续页面修改就比原生快了,所以框架用于页面交互的项目,静态页面没必要用;
编译插件
babel-preset-react-app
- 此插件,将
jsx
标签内容解析为React.createElement([元素标签名],[属性对象],[元素子节点]...)
createElement()
方法执行后生成一个对象:即虚拟DOM={}
,也有人称之为:JSX对象、JSX元素、ReactChild对象等
- 可在Babel官网在线解析生成;