react 源码解析

132 阅读1分钟

react 16.8以后采用时间切片的方式解决页面卡顿,JS执行可中断

16.8以前采用的是递归的方式 JS 执行不可中断

渲染方式不同

16.8以前 ReactDOM.render(<App/>, rootElement);

16.8以后 ReactDOM.createRoot(rootElement).render(<App/>)

CPU 卡顿:

  1. JS执行导致的页面卡顿 60HZ  1s/60 =16.6ms (浏览器渲染频率是60HZ,即要求1帧的时间为1s/60 = 16.67ms,浏览器显示页面的时候,要处理js逻辑,还要做渲染,每个执行片段不能超过16.67ms), 通过时间切片的方式将 Js 切割成一个一个片段,解决JS长尾执行引起的卡顿。解决非阻塞渲染

  2. JS线程 GUI线程 render

IO卡顿

Suspense 兜底 ,callBack 异步可中断的更新

快速响应   同步 --- 异步   long task --- 可中断

React 架构对比 15->16

React15 

Reconciler 协调器  找到更新的组件 
this.setState  foreUpdate
1. render jsx -> VDOM
2. VDOM 跟上次更新前的vDOM 对比 diff
3. 找到待更新的节点
4. 将更新的内容传给renderer
Renderer 渲染器,将更新的组件渲染到页面
宿主 H5 reactDOM  native reactNative
renderer 是区分环境

React16

requestIdleCallback 空闲时使用 --  fiber
1. Scheduler 调度器 任务排序 排优先级 Reconciler 环境无关
2. Reconciler 协调器 找到更新的组件 递归-->异步可中断
3. Renderer渲染 同步 DOM
1 - 2
3- 4
5-6
拿到前一段时间更新的所有内容 在同步渲染到DOM 上
#Fiber
状态更新的机制,可恢复到上次中断的上下文
双缓存 内存中绘制出此次更新的fiber DOM

 JSX :调用jsx,解析jsx 书写的dom 结构

React 执行

render

fiber 树  ---> render 树

深度遍历优先 beginworl completework