Skip to content
目录

Store 实现机制详解

Store 是 Redux 的唯一真相源getStatedispatchsubscribe 三个核心 API 都在 createStore(及 enhancer 链)里闭合实现。

源码:packages/redux/src/createStore.ts


1. createStore 产出什么

API作用
getState()返回当前 state 引用(只读约定)
dispatch(action)走 reducer → 新 state → 通知 listener
subscribe(listener)注册监听;返回 unsubscribe
replaceReducer热替换 reducer(工具/测试)

可选:@@INIT 等内置 action 完成首次 state 计算。


2. 内部状态(概念)

  • currentState:当前树。
  • currentReducer:根 reducer(常为 combineReducers 结果)。
  • listeners:订阅者数组或类似结构。
  • isDispatching:防止 dispatch 重入(listener 里再 dispatch 会报错)。

无 React 依赖;Store 可在 Node、测试、中间件里独立使用。


3. dispatch 流程

mermaid
flowchart LR
  A[dispatch action] --> B{plain object?}
  B -->|| E[抛错 / 交给 middleware]
  B -->|| C[currentReducer]
  C --> D[新 state]
  D --> F[Object.is 比较]
  F -->|| G[依次 listener]
  F -->|不变| H[通常仍通知见版本与中间件]

要点:

  1. 同步:一次 dispatch 内 reducer 跑完才通知(异步靠 middleware)。
  2. 纯 reducer:副作用不在 reducer 内(设计规则见 08)。
  3. 中间件applyMiddleware 在外层改写 dispatch(见 04)。

4. subscribe 语义

  • Listener 无参数(Redux 设计:避免暴露 getState 时机争议);需要新 state 请自行 getState()
  • 通知在 dispatch 完成后同步 调用。
  • 与 React 连接由 react-redux 完成,不在 core 包内。

5. Store Enhancer

createStore(reducer, preloadedState, enhancer)enhancer 形如 (createStore) => (reducer, preloadedState) => store,用于:

  • applyMiddleware(最常见)
  • DevTools、持久化等扩展

组合顺序:多个 enhancer 从右到左折叠(与 middleware 洋葱不同,需单独记)。


6. 与 Zustand 对照

Redux StoreZustand
更新入口dispatch(action)set / setState
形状reducer 决定用户对象
订阅subscribe 无参subscribe(listener) 带 state

7. 阅读路径

  1. createStore.tsdispatch / subscribe
  2. combineReducers.ts — 根 reducer 形态
  3. applyMiddleware.ts — 如何包装 dispatch

总结

Store = 闭包里的 state + reducer + 监听器;所有架构图里的单向箭头最终都落在 dispatch 这一条同步管道上。

MIT License.