第 5 期 - Redux 源码解析与核心 API 详述
摘要
本文讲述 Redux 的历史背景、在不同场景下的应用、原理、核心 API、项目特点、技术细节、生态和学习资源等内容,对 Redux 进行了全面解析。
1. 项目背景
Redux 的出现与 Flux 架构相关,是为解决基于事件触发的状态管理的局限性。在 2015 年起的不同阶段,它被用于解决 prop 穿透、缓存服务器状态等问题。随着技术发展,如 React 16.3 的 Context API 出现,以及 Graphql API 相关工具的兴起,Redux 在某些场景下的使用有了替代方案,但它也在不断更新,最新版为 2023 年的 v5.0.1。
2. 解决问题与应用场景
开发人员要明确应用中的问题以选择合适工具,有时可不用 Redux 但应用其思想。Redux 可与多种视图库一起使用,适用于客户端复杂数据管理、从服务器请求并缓存数据状态、组件树庞大需共享状态、组件修改全局或其他组件状态等场景,在项目使用 Graphql 等专业化场景不太适合。
3. 核心概念
3.1. 编程概念
- Redux 没有强制要求不变性、可序列化性和纯函数,但有相关最佳实践。
- 不变性:状态创建后不可变,更新通过返回新对象完成。
- 纯函数:像 reducer 函数是纯函数,给定相同输入有相同输出且无副作用。
- Normalization:将复杂数据结构转换为更一致平坦的形式,可避免冗余、简化状态管理和提高性能,Redux Toolkit 的 createEntityAdapter 可帮助实现。
- 可序列化:状态树应是 JSON 可表示的形式,一些不可序列化对象不应作为状态一部分。
- Selector:用于从 Redux store 选择数据的纯函数,可组合状态片段。
- Thunks 和 Sagas:Thunks 是执行异步操作的中间件,允许在 action creator 写同步或异步逻辑;Sagas 是处理副作用的模式,用于网络请求、定时任务等并可取消操作。
3.2. 项目特点
- 技术亮点:闭包运用频繁、有切面编程思想、易于管理状态数据、修改数据过程可监控、可在多种框架实现通用、更新逻辑与应用程序其余部分分离。
- 技术扩展与限制:开发人员可区分 Redux 实际和预期工作方式,但它是最小库,在技术层面要求和强制执行内容少,如 action 对象有格式要求、state 描述有限制、处理 state 数据逻辑应是纯函数。
- 技术误区:Redux 著名的三大原则并非实现的固定规则,而是使用意图声明。
4. 原理总结
应用的全局 state 在 createStore 函数上下文定义,更改 state 通过 dispatch 一个 action,action 的 type 字段匹配开发人员自定义逻辑,reducer 函数根据 action 修改 state,dispatch 函数调用 reducer 并更新 state 后通知订阅者。Redux 默认只支持同步,异步任务需中间件支持,store 是核心内容,还有其他 API 用于扩展功能。
5. 项目 API
5.1. 顶级暴露的 API
- createStore:是 Redux 功能的核心,传入 reducer 函数创建 store 实例对象,包含 getState、subscribe、dispatch 等方法,内部有 state 定义、dispatch 逻辑、订阅通知等功能,还有精简源代码和流程图展示,且可处理多种参数情况。
- combineReducers:用于合并开发人员定义的多个 reducer 函数,将多个 reducer 返回的子 state 对象添加到全局 state 对象。
- applyMiddleware:是增强器,用于增强 dispatch 函数功能,使 Redux 支持异步逻辑,中间件按顺序执行,可用 compose 函数连接中间件。
5.2. Store 暴露的 API
- getState:返回 state 数据,外部通过此方法获取 state,在 dispatch 执行时不能调用。
- dispatch:修改 state 的唯一方法,接受 action 对象,action 包含 type 字段用于匹配 reducer 修改规则,还可包含其他数据用于更新 state,调用 reducer 并循环调用订阅回调函数。
- subscribe:用于订阅 store 数据变化,内部保存回调函数,在 state 修改后执行,有取消订阅功能。
- replaceReducer:用于替换 store 当前使用的 reducer 来计算 state。
6. 项目生态
- Redux:核心体积小。
- @reduxjs/toolkit:官方推荐编写 Redux 逻辑的方法,构建了最佳实践,简化编写逻辑和设置存储过程。
- React - Redux:是 React 和 Redux 之间的桥梁,方便 React 组件访问和操作 Redux 状态。
- Redux Devtool:chrome 插件,用于调试 Redux 逻辑、观察数据变化和流转。
- 插件系统:通过中间件形式实现扩展,用户可实现增强器。
7. 学习资源
包括 Redux Fundamentals tutorial(自下而上教程)、Redux Essentials tutorial(自上而下教程)以及一些大佬分享学习调试源码的思路和超详细的 Redux 源码解析等参考资料。
扩展阅读
Made by 捣鼓键盘的小麦 / © 2025 Front Talk 版权所有