介绍
最近读起了React源码,React实现太过巧妙,底层有许多有用的工具类,了解这些工具类的常用使用方法,在读源码的时候可以更好更快的理解。
Flow
Flow 是 Facebook 宣布推出一个开源的 JavaScript 静态类型检查器,旨在发现 JS 程序中的类型错误,以提高程序员的效率和代码质量。React源码使用了Flow。
参考网址: https://flowtype.org/
PooledClass
简介
PooledClass是React的基本类库,见字如面,用于将常用类做一个缓冲池,将常用类的实例缓存在内存中,省略其实例化和释放的开销。
用法
|
|
源码分析
https://github.com/facebook/react/blob/15-stable/src/shared/utils/PooledClass.js
addPoolingTo()方法有两个参数,CopyConstructor为类的构造器,是一个function对象;pooler负责类的初始化,默认为下文的oneArgumentPooler。addPoolingTo()给这个function对象添加了instancePool用于缓存实例;poolSize用于指示缓存池大小;getPooled()用于取出实例;release()用于放回实例。
oneArgumentPooler()对应getPooled(),从缓存池中取出实例并初始化,如果缓存池为空,则使用new新建一个实例并初始化。 除此之外还有twoArgumentPooler、threeArgumentPooler、fourArgumentPooler函数,对应有多个构造函数的情况。尽管他们可以用一个通用的方法实现,但是这样需要访问arguments对象。standardReleaser()对应release(),执行实例的destructor()后,如果缓存池未满则将实例放入缓存池。
CallbackQueue
简介
CallbackQueue用于批量存储回调函数,并在合适的时候触发。是一个伪事件模块,用于记录那些等待着被通知的组件,当组件的DOM代表可用的时候将会被通知。
用法
|
|
源码解析
https://github.com/facebook/react/blob/15-stable/src/renderers/shared/utils/CallbackQueue.js
CallbackQueue包含三个成员属性,_callbacks、_contexts、_arg,分别储存回调的函数、作用域、参数。
enqueue(callback, context):将一个回调函数及其作用域压入数组。notifyAll():依次触发所有回调函数,使用对应的作用域,使用_arg作为参数。调用完成后清空回调队列,Array.length = 0;用于清空队列数组,避免内存泄露。checkpoint(): 获取一个检查点,返回队列长度。rollback(len): 恢复检查点对应状态,参数为队列长度。reset(): 重置队列,将回调队列及其作用域_callbacks、_contexts清空,但是不会清空_arg。
最后一行module.exports = PooledClass.addPoolingTo(CallbackQueue);,给CallbackQueue做了线程池处理。
|
|
Transaction
简介
Transaction是React的一个亮点。Transaction创造了一个可以包裹任何方法的黑盒,使得在调用方法的之前和之后,可以保持一些不变量(即使在方法的调用过程中抛出了异常),在任何需要实例化一个transaction的地方,都可以在构造时提供处理这些不变量的实施函数。Transaction类自身会提供一个附加的invariant,使得transaction实例已经处于运行过程中时不会再次运行。通常构造一个Transaction的单例然后多次重用,可用于包裹几个不同的方法。wrapper非常简单,只需要实现两个方法initialize()和close()。
在执行perform(method)之前,每个wrapper的initialize()会依次执行并记录返回值,在执行perform(method)之后,每个wrapper的close()会依次执行,之前记录的返回值会作为close()的参数。
wrappers (injected at creation time)
+ +
| |
+-----------------|--------|--------------+
| v | |
| +---------------+ | |
| +--| wrapper1 |---|----+ |
| | +---------------+ v | |
| | +-------------+ | |
| | +----| wrapper2 |--------+ |
| | | +-------------+ | | |
| | | | | |
| v v v v | wrapper
| +---+ +---+ +---------+ +---+ +---+ | invariants
perform(anyMethod) | | | | | | | | | | | | maintained
+----------------->|-|---|-|---|-->|anyMethod|---|---|-|---|-|-------->
| | | | | | | | | | | |
| | | | | | | | | | | |
| | | | | | | | | | | |
| +---+ +---+ +---------+ +---+ +---+ |
| initialize close |
+-----------------------------------------+
用法
|
|
源码分析
https://github.com/facebook/react/blob/15-stable/src/renderers/shared/utils/Transaction.js
|
|