『 文章首發於GitHub Blog 』
說明
本文所分析的Redux版本為3.7.2
分析直接寫在了註釋裡,放在了GitHub上 —> 倉庫地址
分析程式碼時通過檢視Github blame,參考了Redux的issue及PR來分析各個函式的意圖而不僅是從程式碼層面分析函式的作用,並且分析了很多細節層面上寫法的原因,比如:
-
dispatch: (...args) => dispatch(…args)
為什麼不只傳遞一個action
? -
listener
的呼叫為什麼從forEach
改成了for
? -
為什麼在
reducer
的呼叫過程中不允許dispatch(action)
?…
水平有限,有寫的不好或不對的地方請指出,歡迎留issue交流?
檔案結構
Redux的檔案結構並不複雜,每個檔案就是一個對外匯出的函式,依賴很少,分析起來也比較容易,只要會用Redux基本上都能看懂本文。
這是Redux的目錄結構:
.
├── applyMiddleware.js 將middleware串聯起來生成一個更強大的dispatch函式,就是中介軟體的本質作用
├── bindActionCreators.js 把action creators轉成擁有同名keys的物件
├── combineReducers.js 將多個reducer組合起來,每一個reducer獨立管理自己對應的state
├── compose.js 將middleware從右向左依次呼叫,函數語言程式設計中的常用方法,被applyMiddleware呼叫
├── createStore.js 最核心功能,建立一個store,包括實現了subscribe, unsubscribe, dispatch及state的儲存
├── index.js 對外export
└── utils 一些小的輔助函式供其他的函式呼叫
├── actionTypes.js redux內建的action,用來初始化initialState
├── isPlainObject.js 用來判斷是否為單純物件
└── warning.js 報錯提示
複製程式碼
原始碼分析
直接寫在程式碼的註釋裡了,在每個函式上方也有大段的官方註釋來解釋每個函式的作用,中文翻譯可以見Redux 中文文件
推薦原始碼的閱讀順序為:
index.js -> creatStore.js -> applyMiddleware.js (compose.js) -> combineReducers.js -> bindActionCreators.js
複製程式碼