如何 0 成本启动全员 AI 技能提升?戳> 了解详情
写点什么

深入了解 React 新引擎:React Fiber

  • 2017-05-09
  • 本文字数:1080 字

    阅读完需:约 4 分钟

Facebook 正在以流行的 JavaScript 框架 React 为基础开发一个全新的架构。这个名为 React Fiber 的全新设计改变了检测变更的方法和时机,借此可改进浏览器端和其他渲染设备的响应速度。

这一全新架构最初已于2016 年7 月公开发布,其中蕴含着过去多年来Facebook 不断改进的工作成果。该架构可向后兼容,彻底重写了React 的协调(Reconciliation)算法。该过程可用于确定出现变更的具体时间,并将变更传递给渲染器。

实际上该团队在单线程JavaScript 引擎的基础上构建了一种可划分优先级的协作式任务调度器。在最初的协调算法(现已更名为 Stack Reconciler )中,Virtual DOM diff 会一次性处理整个组件树:

重点在于,Stack Reconciler 始终会一次性地同步处理整个组件树。Stack Reconciler 无法暂停,因此如果更新较为深入并且可用 CPU 时间有限,这种做法并非最优化的。

与之相对的 Fiber Reconciler 则有着截然不同的目标:

  • 能够将可中断的任务拆分成块。
  • 能够对进程中的工作划分优先级、重新设定基址(Rebase)、恢复。
  • 能够在父子之间来回反复,借此为 React 的 Layout 提供支持。
  • 能够通过 render() 返回多个元素。
  • 为错误边界提供了更好的支持。

简单来说,此时不在需要等待变更传播到整个组件树,React Fiber 可以知道如何时不时暂停一下,检查是否有其他更重要的更新。这种调度能力主要基于 requestIdleCallback 的使用,而这是一种 W3C 候选推荐标准

在 React Conf 2017 大会上,Lin Clark 通过名为 React Fiber 简介的演讲循序渐进介绍了新协调器的独到之处。

大部分情况下,开发者无需担心代码的适配问题,但也有少量应用依赖以特定顺序进行的生命周期钩子(Lifecycle hook)。由于顺序已经无法保证,因此可能会遇到一些问题。

“为确保这一特性不会影响应用”,Clark 称:“Fiber 团队正在制定更为平缓的升级路径”。

Dan Abramov写到,React 团队认为大部分 React 应用不会因为第 16 版而遇到问题:

React 16(正在开发中)是一次革新,但也使用了相同的公开 API。对于 Facebook 所使用的超过 30,000 个(!)组件,其中只有少量需要改动,并且这少数组件主要被一些已经不再支持或没有正式记录在案的行为所使用。因此可以说完全可以保证 99.9% 的兼容性。这也让我们确信 React 16 基本上也可以直接适用于你的代码。

Fiber 将在 React 16 中首次登场,第 16 版不仅包含新的协调引擎,而且提供了可串联使用的全新渲染器(例如 ReactDOM、React Native)。同时 isfiberreadyyet.com 提供了测试套件的最新结果。截至撰写本文时,已顺利通过了 92.2% 的测试。

阅读英文原文 React Fiber: A Closer Look at the New Engine of React

2017-05-09 19:003741
用户头像

发布了 283 篇内容, 共 121.3 次阅读, 收获喜欢 63 次。

关注

评论

发布
暂无评论
发现更多内容

架构师训练营第 1 期 - 第 12 周 - 学习总结

wgl

「架构师训练营第 1 期」

【计算机内功修炼】三:一文彻底理解IO多路复用

码农的荒岛求生

epoll

区块链的前世今生(1)

抗哥

牛啤了!阿里技术官整理的这份《Java面试手册5000题》已经成功让数百名社招生“圆梦BATJ”

Java 编程 面试

架构师第 4 课作业及学习总结

小诗

「架构师训练营第 1 期」

资深大牛带你了解源码!阿里内部Android笔记火爆IT圈,醍醐灌顶!

欢喜学安卓

android 程序员 面试 移动开发

技术人小故事-团队愿景篇-第1段

Ian哥

28天写作

架构师训练营 1 期 - 第 十四周总结(vaik)

行之

「架构师训练营第 1 期」

jstat使用实用教程

JavaPub

Java JVM

SafePoint 与 Stop The World 全解(基于OpenJDK 11版本)

AI乔治

Java 架构 jdk JVM

手把手教你如何巧用Github的Action功能

flutter android 持续集成

谬误词典:置信度

lidaobing

随机漫步的傻瓜 28天写作 谬误词典

【Node.js】静态页面和简单的路由

德育处主任

大前端 Node 28天写作

意识会在哪个早晨降落——「幻想短篇1/28」

道伟

28天写作

SpringBoot系列1——概述和快速入门

程序员的时光

springboot 七日更 28天写作

28天瞎写的第二百一二天:一次删库没跑路的故事

树上

28天写作 删库

网络工程师职业指南

架构师第 3 课作业及学习总结

小诗

「架构师训练营第 1 期」

缓存穿透,缓存击穿,缓存雪崩

en

redis 缓存穿透 缓存击穿 缓存并发

芯片破壁者(二十四):1987战役启示录

脑极体

腾讯T3面试官透露!360°深入了解Flutter,聪明人已经收藏了!

欢喜学安卓

android 程序员 面试 移动开发

写在再次学习python之前-why篇

赵开忠

Python 28天写作

职业成长就是一个逐渐“变帅”的过程

L3C老司机

架构师训练营第 1 期 - 第 12 周 - 命题作业

wgl

架构师训练营第 1 期

CSS10 - 盒子模型&常用无序列表样式

Mr.Cactus

html/css

kill -9 导致 kafka 重启失败的惨痛经历!

AI乔治

Java kafka 架构

记一次JVM OOM 实战优化

AI乔治

Java 架构 JVM OOM

MySQL中的哥哥表、妹妹字段,是什么鬼?

Java MySQL 数据库

【薪火计划】08 - 非暴力沟通

码上生长

管理 28天写作

LeetCode题解:17. 电话号码的字母组合,BFS,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

生产环境全链路压测建设历程 24:FAQ 5、6负载均衡、如何不影响正常业务?

数列科技杨德华

28天写作

深入了解React新引擎:React Fiber_JavaScript_David Iffland_InfoQ精选文章