Redux 源码共读 -- 1
发布日期:2021-05-10 06:02:34 浏览次数:24 分类:精选文章

本文共 1714 字,大约阅读时间需要 5 分钟。

Redux 源码共读-1

在学习 Redux 之前,我们先来看下源码的目录结构:

Redux 的源码分为两大部分:utilssrc。在 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个关键判断:
  • 如果 preloadedStateenhancer 都是函数,或者 enhancer 是函数且第三个参数也是函数,则发出警告,提示用户将增强器的数据放到一个函数中传递。
  • 如果 preloadedState 是函数且 enhancer 未传递,则将 enhancer 赋值为 preloadedState,并将 preloadedState 设为 undefined
  • 如果 enhancer 不是一个函数,则发出警告,并立即返回。
  • 如果 reducer 不是一个函数,则发出警告。
  • 5个赋值和初始化:
    • 还原 reducerpreloadedState,并创建一个空的监听列表。
    • 创建深拷贝的监听列表,用于防止在 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 ]

    上一篇:使用 nodeJs 实现 js/ts 文件翻译功能
    下一篇:Redux 源码共读 -- 2

    发表评论

    最新留言

    感谢大佬
    [***.8.128.20]2025年04月30日 00时02分53秒