lgwebdream / FE-Interview

🔥🔥🔥 前端面试,独有前端面试题详解,前端面试刷题必备,1000+前端面试真题,Html、Css、JavaScript、Vue、React、Node、TypeScript、Webpack、算法、网络与安全、浏览器
https://lgwebdream.github.io/FE-Interview/
Other
6.86k stars 895 forks source link

第 27 题:说一下 react-fiber #33

Open lgwebdream opened 4 years ago

lgwebdream commented 4 years ago

欢迎在下方发表您的优质见解

Genzhen commented 4 years ago

1)背景

2)实现原理

旧版 React 通过递归的方式进行渲染,使用的是 JS 引擎自身的函数调用栈,它会一直执行到栈空为止。而Fiber实现了自己的组件调用栈,它以链表的形式遍历组件树,可以灵活的暂停、继续和丢弃执行的任务。实现方式是使用了浏览器的requestIdleCallback这一 API。 Fiber 其实指的是一种数据结构,它可以用一个纯 JS 对象来表示:

const fiber = {
    stateNode,    // 节点实例
    child,        // 子节点
    sibling,      // 兄弟节点
    return,       // 父节点
}
sweetliquid commented 4 years ago

Component -> Element -> Fiber -> DOM 中间哪来的 VDOM,不存在根据 VDOM 生成 Fiber 一说。

Genzhen commented 4 years ago

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, 实现任务拆分、中断与恢复。

qzruncode commented 3 years ago

fiber就是一种数据结构,fiber将递归操使用内存来模拟,从而在react pre-commit阶段可以随时打断和恢复,在commit阶段一次性执行完成,所有的effect和hooks,以及任务优先级都是挂在fiber节点上这个优先级其实就是一个expireTime,在expireTime之内的effect都会合并成一个patch一次性更新。剩下的就是diff算法,diff算法和vue的diff类似,采用右移策略看似比vue的低效,但是实际项目中有多少比例的移动操作呢?vue的diff是不管三七二十一都求最长有序序列这个不要时间的吗?

fernandoxu commented 3 years ago

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吧