Open lgwebdream opened 4 years ago
1)背景
2)实现原理
旧版 React 通过递归的方式进行渲染,使用的是 JS 引擎自身的函数调用栈,它会一直执行到栈空为止。而Fiber实现了自己的组件调用栈,它以链表的形式遍历组件树,可以灵活的暂停、继续和丢弃执行的任务。实现方式是使用了浏览器的requestIdleCallback这一 API。 Fiber 其实指的是一种数据结构,它可以用一个纯 JS 对象来表示:
const fiber = {
stateNode, // 节点实例
child, // 子节点
sibling, // 兄弟节点
return, // 父节点
}
Component -> Element -> Fiber -> DOM 中间哪来的 VDOM,不存在根据 VDOM 生成 Fiber 一说。
Component -> Element -> Fiber -> DOM 中间哪来的 VDOM,不存在根据 VDOM 生成 Fiber 一说。 @sweetliquid 感谢提出提出建议
Fiber tree 是React 在 render 第一次渲染时,会通过 React.createElement 创建一颗 Element 树,可以称之为 Virtual DOM Tree,由于要记录上下文信息,加入了 Fiber,每一个 Element 会对应一个 Fiber Node,将 Fiber Node 链接起来的结构成为 Fiber Tree。Fiber Tree 一个重要的特点是链表结构,将递归遍历编程循环遍历,然后配合 requestIdleCallback API, 实现任务拆分、中断与恢复。
fiber就是一种数据结构,fiber将递归操使用内存来模拟,从而在react pre-commit阶段可以随时打断和恢复,在commit阶段一次性执行完成,所有的effect和hooks,以及任务优先级都是挂在fiber节点上这个优先级其实就是一个expireTime,在expireTime之内的effect都会合并成一个patch一次性更新。剩下的就是diff算法,diff算法和vue的diff类似,采用右移策略看似比vue的低效,但是实际项目中有多少比例的移动操作呢?vue的diff是不管三七二十一都求最长有序序列这个不要时间的吗?
Component -> Element -> Fiber -> DOM 中间哪来的 VDOM,不存在根据 VDOM 生成 Fiber 一说。 @sweetliquid 感谢提出提出建议
Fiber tree 是React 在 render 第一次渲染时,会通过 React.createElement 创建一颗 Element 树,可以称之为 Virtual DOM Tree,由于要记录上下文信息,加入了 Fiber,每一个 Element 会对应一个 Fiber Node,将 Fiber Node 链接起来的结构成为 Fiber Tree。Fiber Tree 一个重要的特点是链表结构,将递归遍历编程循环遍历,然后配合 requestIdleCallback API, 实现任务拆分、中断与恢复。
React里管Virtual DOM叫React Element吧
欢迎在下方发表您的优质见解