React16源码解析(ReactDOM)

Posted by Leo Eatle on 2018-08-05

前言

上篇文章中看完了React库的react部分,这次我们来看React是如何将React框架渲染成DOM的。

ReactDOM.js

ReactDOM.js是react-dom这个库的入口,我们最关心的当然是reactDOM.render这个方法的实现,在这个文件里面搜索render,我们很快发现其实调用的是一个legacyRenderSubtreeIntoContainer方法,之所以带上了legacy,想必是16版本的更新使得这个方法是暂时的做法,很有可能之后会废除。但是在16之前的确是这么调用的,除了名字发生了改变。

这个方法带上了forceHydrate参数,如果是服务端渲染出来的,就可以用hydrate方式来将React相关功能插入到服务端渲染的页面中,hydraterender方法cons唯一的区别就是forceHydrate = true

在第一次渲染根组件的时候调用的方法比较特殊,是legacyCreateRootFromDOMContainer方法,而这里面是DOMRenderer.createContainer(container, isAsync, hydrate),想必ReactRoot这个class是我们要仔细研究的对象。
container就是我们要挂载的根节点。一路找下去,我们会发现这个DOMRenderer引用了react-reconciler这个库,这就开始涉及到Fiber的部分了。同时也说明,只要实现相关的接口,这个DOMRenderer也可以是其他库,这就保证了使用的渲染器和具体平台的渲染实现保持独立性,我可以用ReactDOM+Fiber,也可以React Native+Fiber,也可以ReactDOM+Transaction(React15的事务机制)

Fiber相关的我放在另外一篇,这里我们只要知道ReactDOM只是通过Fiber提供的接口,完成最后要去渲染到真实DOM的一系列事情,以及对于浏览器事件的统一处理就够了。而虚拟DOM的更新机制、differ算法这些,都是依靠Fiber来实现的。