第一章 JSX(React18源码解析一)

333 阅读2分钟

第一章 JSX(React18源码解析一)
第二章 实现Virtual DOM(React18源码解析二)
第三章 根节点关联根Fiber(React18源码解析三)
第四章 初始化UpdateQueue、添加update(React18源码解析四)
第五章 实现时间切片函数和拷贝Fiber(React18源码解析五)
第六章 构建FiberTree(React18源码解析六)
第七章 commit(React18源码解析七)
第八章 React中的事件(React18源码解析八)
第九章 useReducer、useState(React18源码解析九)
第十章 React的dom diff(React18源码解析十)
第十一章 React的Effect(React18源码解析十一)
第十二章 React的同步、并发渲染(React18源码解析十二)
第十三章 React高优打断低优、饥饿问题(React18源码解析十三)

一.React是什么

  • React是用于构建用户界面的js库
  • 可通过组件化的方式快速构建Web应用

二.JSX是什么

  • JSX是js的扩展,html和交互逻辑的结合,便于UI展示
  • babel可展示JSX通过plugin-transfrom-react-jsx转换后的代码 image.png
  • AST Explorer可展示JSX调用@babel/parser转换后的AST(抽象语法树),以json的形式存在 image.png

三.babel转换jsx

  • React16之前的转换方式(@babel/plugin-transform-react-jsx的classic模式)
const babel = require("@babel/core");
const sourceCode = `
<h1>
    hello<span style={{ color: "red" }}>world</span>
</h1>
`

/*老的编译方式*/
const result = babel.transform(sourceCode, {
  plugins: [["@babel/plugin-transform-react-jsx", { runtime: "classic" }]]
})
console.log(result.code);

/*打印*/
// React.createElement("h1", null,
//   "hello",
//   React.createElement("span", { style: { color: "red" } },
//     "world"
//   )
// );
  • React16之后的转化方式(@babel/plugin-transform-react-jsx的automatic模式)
const babel = require("@babel/core");
const sourceCode = `
<h1>
    hello<span style={{ color: "red" }}>world</span>
</h1>
`
const result = babel.transform(sourceCode, {
  plugins: [["@babel/plugin-transform-react-jsx", { runtime: "automatic" }]]
})

console.log(result.code);

/*打印*/
// import { jsx as _jsx } from "react/jsx-runtime";
// import { jsxs as _jsxs } from "react/jsx-runtime";
// _jsxs("h1", {
//   children: [
//     "hello",
//     _jsx("span", {
//       style: { color: "red" },
//       children: "world"
//     })
//   ]
// });

四.Virtual DOM

  • JSX=>Virtual DOM转换图 image.png
  • Virtual DOM(虚拟DOM)
    在上文可知,jsx经过@babel/core transform后编译成React.createElement或_jsx函数调用,函数返回Virtual DOM
  • Virtual DOM和AST的区别
    AST,各个parser parse后的结构虽不同,但都是语法的JSON形式的忠实反映,Virtual DOM,是AST经过处理后方便后面DOM Diff的JSON