React 16 Fiber源码速览

本文的写作有一部分没有完成,打算针对React 16.3再对本文进行修改,请大家留意 React 16在近期发布了。除了将备受争议的BSD+Patents协议改为MIT协议之外,React 16还带来了许多新特性,比如: 允许在render函数中返回节点数组和字符串。 render() { // 再也不用在外面套一个父节点了 return [ // 别忘了加上key <li key="A">First item</li>, <li key="B">Second item</li>, <li key="C">Third item</li>, ]; } 提供更好的错误处理。 支持自定义DOM属性。 但最关键的一点还是: 没错,React 16是一次重写,在保持API不变的情况下,将核心架构改为了代号为Fiber的异步渲染架构。新架构带来了的变化有: 体积减小 服务端渲染速度大幅提升 更responsive的界面 一次预谋已久的重写 Fiber这个架构并不是突然冒出来的。Facebook的工程师在设计React之初就设想未来的UI渲染会是异步的。从setState()的设计和React内部的事务机制可以看出这点。 在去年,React的开发者Andrew Clark在社区中放出了Fiber架构的一个文档。描述了Fiber架构的基本信息。同时表示Facebook的工程师正在实现这个新架构。今年3月的React Conf 2017上,Lin Clark做了A Cartoon Intro to Fiber这个分享,介绍了Fiber架构的工作原理。今年9月,Fiber架构随着React 16正式发布。Fiber架构的代码放在原来的React仓库之中,并且可以通过运行时的判断来切换新老架构,方便测试和部署。因此Fiber的开发是一个渐进的过程。这个网站实时展示了Fiber通过的测试用例,随着所有用例的通过,Fiber也正式发布了。有趣的是,在React 16发布之前,Fiber架构的React就已经运行在Facebook的产品中了。FB的工程师表示看到新架构在线上产品运行起来,是很激动人心的。具体的情况可以看这篇博客:React 16: A look inside an API-compatible rewrite of our frontend UI library。 Fiber概念简介 本文的题目是React 16 Fiber源码速览,所以关注的主要是Fiber相关的代码。在分析源码之前,首先介绍一些基本概念。 推荐看上文中提到的A Cartoon Intro to Fiber。这个分享比较系统和形象解释了Fiber架构的工程流程,并且使用了React源码中的术语。有助于理解Fiber的概念和源码。下文中的配图也来自这个分享。 reconciler VS renderer Reconciler就是我们所说的Virtul DOM,用于计算新老View的差异。React 16之前的reconciler叫Stack reconciler。Fiber是React的新reconciler。Renderer则是和平台相关的代码,负责将View的变化渲染到不同的平台上,DOM、Canvas、Native、VR、WebGL等等平台都有自己的renderer。我们可以看出reconciler是React的核心代码,是各个平台共用的。因此这次React的reconciler更新到Fiber架构是一次重量级的核心架构的更换。...

September 28, 2017