介绍
最近读起了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
|
|