浅谈react-fiber
浅谈React Fiber
一、出现的缘由
在页面元素很多,且需要频繁刷新的场景下,React 15 会出现掉帧的现象。请看以下例子:
其根本原因,是大量的同步计算任务阻塞了浏览器的 UI 渲染。
默认情况下,JS 运算、页面布局和页面绘制都是运行在浏览器的主线程当中,他们之间是互斥的关系。如果 JS 运算持续占用主线程,页面就没法得到及时的更新。
当我们调用setState
更新页面的时候,React 会遍历应用的所有节点,计算出差异,然后再更新 UI。整个过程是一气呵成,不能被打断的。如果页面元素很多,整个过程占用的时机就可能超过 16 毫秒,就容易出现掉帧的现象。
针对这一问题,React 团队从框架层面对 web 页面的运行机制做了优化,得到很好的效果。
所以,React Fiber简单来说就是一个从React v16开始引入的新协调引擎,用来实现Virtual DOM的增量渲染。
说人话:就是一种比线程还要细粒度的处理机制、一种能让React视图更新过程变得更加流畅顺滑的处理手法。
二、底层实现
出现掉帧的原因是因为 React 的前任 Reconciler —— Stack Reconciler,这种通过栈的方式实现任务调度的方式导致的。
Stack 这种架构的特点就是,所有任务都按顺序的压入了栈中,而执行的时候无法确认当前的任务是否会耗去过长的脚本运行时间,使得这 16ms 里浏览器能做的事不可控,甚至让 fetch data 这类实时意义很大的任务要等很久才能执行。
而对于fiber来说:
把耗时长的更新任务拆解成一个个小的任务分片,每执行完一个小的任务分片,都归还一次主线程,看看有没有什么其他紧急任务要做。如果在归还主线程时恰巧发现有紧急任务,那么会马上停掉当前更新任务,转而让主线程去做紧急任务,等主线程做完紧急任务,再重新做更新任务。(注意⚠️:是重新!不是从上次被打断的点继续);如果没有紧急任务,才敢唯唯诺诺地继续做接下来的任务分片。
如此一来,我们想要的就是:
- 让该先行的逻辑先行——排任务优先级
- 让浏览器能尽量在每一帧中都可以进行页面绘制——想办法让 JavaScript 的执行不影响到绘制任务
解决方法:
- 优先级:我们给每类任务定义不同的优先级,来决定谁先上车(进 16ms),假设就是如下这种形式:
const FetchTask = {tag: 'sideEffect',priority: 'high'
}const ComputeTask = {tag: 'compute',priority: 'middle'
}const DomTask = {tag: 'dom-update',priority: 'low'
}
然后,为了
- 合理布置逻辑的运行
- 尽量不阻塞浏览器的绘制,最大限度的减少的掉帧的可能
fiber就是发挥作用了。
fiber设计原则
我们提炼一下官方给出的一些相关内容,大致可得:
更新 UI 是一件相当耗时的事情,而并不是每一次更新都需要立即的呈现出来;过多的执行 UI 的更新可能引起掉帧,影响用户体验;
不同类型的 UI 更新应该有不同的优先级,比如,相比把数据呈现到界面上,连续的动画具有更高的绘制优先权,一旦数据更新占用了过长的时间,就会导致动画掉帧,而 React 则做了一些事情来使得数据更新操作可以延迟执行,不打断动画的发挥
React 使用 pull-based 的方式来使得计算在必要的时候才执行
React 这个名字取得很差,应该叫 Schedule
浅谈react-fiber相关推荐
- 浅谈 React Fiber
2016 年都已经透露出来的概念,这都 9102 年了,我才开始写 Fiber 的文章,表示惭愧呀.不过现在好的是关于 Fiber 的资料已经很丰富了,在写文章的时候参考资料比较多,比较容易深刻的理解 ...
- 浅谈 React 生命周期
浅谈 React 生命周期 浅谈 React 生命周期 旧版的生命周期 新版的生命周期 详解各个生命周期函数 constructor getDerivedStateFromProps render c ...
- 【转】浅谈React、Flux 与 Redux
本文转自<浅谈React.Flux 与 Redux>,转载请注明出处. React React 是一个 View 层的框架,用来渲染视图,它主要做几件事情: 组件化 利用 props 形成 ...
- 浅谈react和vue
浅谈React 和 Vue 相同之处: React 和 Vue 有许多相似之处,它们都有: · 使用 Virtual DOM · 提供了响应式 (Reactive) 和组件化 ...
- 浅谈React虚拟DOM
为什么要使用虚拟DOM 因为浏览器的DOM渲染是非常消耗性能的,很低效,我们使用虚拟DOM是为了提高DOM的渲染性能: 什么是虚拟DOM 虚拟DOM就是把真实的DOM树通过createElement转 ...
- Java防止Xss注入json_浅谈 React 中的 XSS 攻击
作者:陈吉 转发链接:https://mp.weixin.qq.com/s/HweEFh78WXLawyQr_Vsl5g 前言 前端一般会面临 XSS 这样的安全风险,但随着 React 等现代前端框 ...
- 【转载】浅谈React编程思想
React是Facebook推出的面向视图层开发的一个框架,用于解决大型应用,包括如何很好地管理DOM结构,是构建大型,快速Web app的首选方式. React使用JavaScript来构建用户界面 ...
- 浅谈react hook ( ref)
import React ,{useRef,useState,PureComponent} from "react"; import ReactDOM from "rea ...
- 浅谈React和VDom关系
组件化 组件的封装 组件的复用 组件的封装 视图 数据 视图和数据之间的变化逻辑 import React, {Component} from 'react';export default class ...
- 浅谈React与jQuery的思维差异
为什么越来越多的互联网公司都在转向React.js去开发前端组件,除了性能因素外,很大一部分原因是因为用jQuery去写很复杂的DOM操作,后期代码会变得越来越难维护.现在大部分的 Web APP 都 ...
最新文章
- python视频抽帧 后 前端javascript如何显示_使用OpenCV编写一个可以定时抽帧的脚本...
- Java Persistence API中的FetchType LAZY和EAGER之间的区别?
- 《统一沟通-微软-实战》-3-部署-Exchange 2010-4-基本配置
- python使用函数的优点-Python函数的特点
- stm32 fatfs fopen err_disk__小型文件系统FatFS和LittleFS对比和区别
- 《配置管理最佳实践》——1.2 从哪里开始
- layui移动端适配_移动端适配方案
- 面向对象的理解及相关概念(封装,继承,多态)
- 萝卜魂军曹机器人_【BANDAI】萝卜魂 全金属狂潮TSR RK-92 野蛮人 沙色
- 被平均(统计平均)的陷阱
- js进阶 10-4 jquery中基础选择器有哪些
- 8.2、磁盘、目录和文件计算
- python程序设计实践教程答案江苏_《Python程序设计》习题与答案python教材答案
- JAVA获取sjis文件乱码_下载文件时,文件名乱码。 | 学步园
- 5.3 使用数据结构对真实世界建模
- iptables 报错 MASQUERADE':No such file or directory
- JTextArea:文本域组件
- c:forEach--------------JSTL
- 服务器部署jdk,tomcat环境及腾讯云域名解析
- 微电子跨专业考计算机,2018考研:盲目跨专业可能遇到的四个问题
热门文章
- 浅谈 React Fiber