React18原理: 核心包结构与两大工作循环

React核心包结构

1 ) react

  • react基础包,只提供定义 react组件(ReactElement)的必要函数

  • 一般来说需要和渲染器(react-dom,react-native)一同使用

  • 在编写react应用的代码时, 大部分都是调用此包的api

  • 比如, 我们定义组件的时候,就是它提供的

    js 复制代码
    class Demo extends React.Component {
      render() {
        return <h1>Hello</h1>
      }
    }

2 ) react-dom

  • react渲染器之一,是react与web平台连接的桥梁(可以在浏览器和nodejs环境中使用)
  • 因为react它不仅可以在浏览器中进行渲染,比如说react-native,它可以去渲染移动端的一些内容
  • react-dom 是在浏览器的环境中提供的渲染器
  • react-dom 的作用
    • 将 react-reconciler 中的运行结果输出到web界面上
  • 在编写react应用的代码时,大多数场景下,能用到此包的就是一个入口函数
    • ReactDOM.render(<App/>, document.getElementById('root')
  • 其余使用的api, 基本是react包提供的

3 ) react-reconciler

  • react得以运行的核心包(综合协调react-dom,react,schedu1er各包之间的调用与配合)
  • 管理react应用状态的输入和结果的输出
  • 将输入信号最终转换成输出信号传递给渲染器
    • 接受输入(scheduleUpdateOnFiber), 将fiber树生成逻辑封装到一个回调函数中(涉及fiber树形结构,fiber.updateQueue列,调和算法等)
    • 把此回调函数(performSyncWorkOnRoot或performConcurrentWorkOnRoot)送入scheduler进行调度
    • scheduler会控制回调函数执行的时机,回调函数执行完成后得到全新的fiber树
  • 再调用渲染器(如react-dom,react-native等)将fiber树形结构最终反映到界面上
  • 总结而言,react-reconciler 这个包它的核心是生成任务,这个生成任务是基于fiber的

4 ) scheduler

  • scheduler时调度器, 实际上它的核心就是react的fiber架构下的时间分片
  • 最核心的作用,就是对这个时间分片上面的一个管理,如何去执行我们的这个分片的任务
  • 调度机制的核心实现,控制由react-reconciler送入的回调函数的执行时机
  • 在 ConCurrent 模式下可以实现任务分片
  • 在编写react应用的代码时,几乎不会直接用到此包提供的api.
  • 核心任务就是执行回调(回调函数由react-reconciler提供)
  • 通过控制回调函数的执行时机,来达到任务分片的目的,实现可中断渲染(ConCurrent模式下才有此特性)
  • 所以,scheduler 它是决定执行什么任务,什么任务先执行,而 生成任务和执行任务都是 react-reconciler 来做的

React工作循环

  • react中的工作循环,这是它的一个最顶层的一个流程图,在这张图里面,有两个核心的大循环
  • 第一大循环是 react-reconciler 提供的,它的核心是构建fiber树,生成任务
  • 第二大循环是 scheduler 提供的, 它的核心是任务调度(处理任务的优先级)
  • react的原理实际上就是两大工作循环
相关推荐
universe_0110 分钟前
day25|学习前端js
前端·笔记
Zuckjet15 分钟前
V8 引擎的性能魔法:JSON 序列化的 2 倍速度提升之路
前端·chrome·v8
MrSkye15 分钟前
🔥React 新手必看!useRef 竟然不能触发 onChange?原来是这个原因!
前端·react.js·面试
wayman_he_何大民22 分钟前
初识机器学习算法 - AUM时间序列分析
前端·人工智能
juejin_cn23 分钟前
前端使用模糊搜索fuse.js和拼音搜索pinyin-match提升搜索体验
前端
....4921 小时前
Vue3 + Element Plus 实现可搜索、可折叠、可拖拽的部门树组件
前端·javascript·vue.js
teeeeeeemo1 小时前
如何做HTTP优化
前端·网络·笔记·网络协议·http
范范之交1 小时前
JavaScript基础语法two
开发语言·前端·javascript
界面开发小八哥2 小时前
DevExtreme Angular UI控件更新:引入全新严格类型配置组件
前端·ui·界面控件·angular.js·devexpress
bitbitDown2 小时前
重构缓存时踩的坑:注释了三行没用的代码却导致白屏
前端·javascript·vue.js