1. fiber架构要解决的问题是什么?
在fiber架构之前 React是基于【堆栈的递归调和算法】(dom diff)
所谓基于堆栈,就是说正常的函数调用,直到函数逐个调用完成,中间没有停顿,一气呵成
原始版本的伪代码是怎么样的, updateDomTree 函数递归地遍历了整个组件树,直到所有的子组件都完成调和。由于 JavaScript 是单线程的,这意味着在调和过程中,其他任务(如动画、用户交互等)将被阻塞。
function updateDomTree(parent, children) {
// 遍历子组件
for (let i = 0; i < children.length; i++) {
const child = children[i];
// 创建或更新 DOM 节点
updateDOMNode(parent, child);
// 递归调和子组件的子组件
if (child.children && child.children.length > 0) {
updateDomTree(child, child.children);
}
}
}
// 更新整个组件树updateDomTree(root, root.children);
这种算法在进行虚拟DOM比较时可能会阻塞主线程,导致页面渲染卡顿,用户体验不佳。
为了解决这个问题,于是有了Fiber架构。
2. fiber架构解决问题的思路?
浏览器做的事情是很多的,但是这里存在一个问题,问题就是为了实现流畅的用户体验,浏览器需要在每秒约 60 帧的速率下完成这些任务。这意味着每一帧只有大约 16.7 毫秒的时间来执行所有操作,所以当我们一个函数调用栈持续时间过长的时候,会给用户卡顿的感觉。
那么既然浏览器会做很多事情,那就有轻重缓急,什么是着急的事情呢?就是那些不处理就会降低用户体验的事情,比如我点击一个按钮没有反应,动画卡顿等等这些都是难以接受的。
要想利用浏览器的空余时间来工作,有一个前提要求,那就是任务是一个个独立的任务。而我们引入Fiber架构的原因,就是为了将我们原本一气呵成的堆栈调用进行拆分,拆分成一个个可以独立运行的任务,充分利用浏览器的工作机制,提升性能。
3.fiber架构的定义
Fiber架构是React为了解决性能问题和提升调度能力而引入的一种新的内部实现机制.它主要通过重新组织渲染过程,使React可以更有效地执行渲染任务。