
Redux 源码共读 -- 1
如果 如果 如果 如果
发布日期:2021-05-10 06:02:34
浏览次数:24
分类:精选文章
本文共 1714 字,大约阅读时间需要 5 分钟。
Redux 源码共读-1
在学习 Redux 之前,我们先来看下源码的目录结构:
Redux 的源码分为两大部分:utils
和 src
。在 utils
下有三个文件,而在 src
下有六个文件。数量不算多,我们先从 utils
下的文件开始。
一、Utils
1. actionTypes.ts
Redux 定义了一系列动作类型,每个动作类型都带有一个唯一的标识符。初始的标识符由函数 randomString()
生成,这个函数通过将随机的 36 位数字和字母生成一个 7 位的随机字符串。每次生成的标识符都带有 @@redux
的前缀。
2. warning.ts
这是一个警告函数,用于在开发环境中对 Redux 的潜在问题发出警告。函数首先判断是否存在 console
标识符并且 console.error
是可执行的。如果条件满足,它会输出警告信息。增加了额外的异常抛出机制,以确保警告信息在不支持 console
的情况下也能被处理。
3. isPlainObject.ts
这个函数用于判断一个对象是否是“简单对象”。简单对象是指其原型链最终指向 Object.prototype
。通过检查对象的原型链,我们可以确定是否是简单对象。这个函数主要用于 Redux 的数据类型检查和操作。
二、src
1. index.ts
这是 Redux 的主入口文件。文件中只有一个判断函数 isCrushed
,用于检测 Redux 是否在开发环境下被压缩。函数检查以下两种条件:
- 是否在开发环境(
process.env.NODE.DEV
不等于 'product')。 - 函数名是否正好为 'isCrushed'。
如果两个条件不都满足,则会调用 warning()
函数发出警告。
2. createStore.ts
这是 Redux 的核心部分,是一个用于创建 Redux 状态仓库的函数。它接收三个参数:
reducer
:状态的更新函数。preloadedState
:预加载的状态,通常比较少使用。enhancer
:增强器,用来扩展 Redux 的功能。
4个关键判断:
preloadedState
和 enhancer
都是函数,或者 enhancer
是函数且第三个参数也是函数,则发出警告,提示用户将增强器的数据放到一个函数中传递。preloadedState
是函数且 enhancer
未传递,则将 enhancer
赋值为 preloadedState
,并将 preloadedState
设为 undefined
。enhancer
不是一个函数,则发出警告,并立即返回。reducer
不是一个函数,则发出警告。5个赋值和初始化:
- 还原
reducer
和preloadedState
,并创建一个空的监听列表。 - 创建深拷贝的监听列表,用于防止在 dispatch 操作中多次修改。
- 添加锁机制,确保 Redux 进行操作时其他操作无法同时进行。
6个方法:
getState()
:返回当前状态。需要注意的是,它不会深拷贝当前状态,直接返回。dispatch(action)
:处理动作。首先检查动作是否是简单对象、是否有类型、以及是否处于锁定状态。处理完后,返回动作本身。ensureCanMutateNextListeners()
:确保接下来可以修改监听列表,主要为了防止在 dispatch 操作中重复调用 subscribe 和 unsubscribe。subscribe(listener)
:注册一个监听器。首先检查是否是函数,若不是则发出警告。同时也检查是否处于锁定状态。replaceReducer(nextReducer)
:替换 reducer。同样检查下一个 reducer 是否是函数。observable()
:暂时没有具体说明,但可能与 Redux 的可观测性相关。
1个操作:
- 调用
dispatch({ type: ActionTypes.INIT })
,初始化仓库数据源。
下一篇文章请点此移至: [ Redux 源码共读-2 ]
发表评论
最新留言
感谢大佬
[***.8.128.20]2025年04月30日 00时02分53秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
webpack新手教程2021
2019-03-14
AAX 首席商务官 Michael Wong:安全可信的市场环境将促进增量市场发展
2019-03-14
什么是证券型代币?
2019-03-14
Android中获取并设置屏幕亮度
2019-03-14
Windows抓包工具-Fiddler
2019-03-14
Swift中使用DispatchGroup分组管理异步任务
2019-03-14
21-JS中常见的函数
2019-03-14
19-认识bootstrap
2019-03-14
为什么要使用UTF-8?
2019-03-14
Android多线程与双缓冲
2019-03-14
MVVM_Template
2019-03-14
{spring.cloud.client.ipAddress}
2019-03-14
栈上内存溢出漏洞利用之Return Address
2019-03-14
Bugku CTF web29(Web)
2019-03-14
网络+图片加载框架(英文版)
2019-03-14
扣非净利润连续三年亏损,四维图新如何熬过“转型阵痛期”?
2019-03-14
前台报Invalid Host/Origin Header错误
2019-03-14
IE浏览器中input的placeholder不显示
2019-03-14
【CSP - S T1】格雷码
2019-03-14
Python imageio方法示例
2019-03-14