Preface
現(xiàn)在都9012了疫衩,還談redux源碼壮莹,是不是太晚了翅帜?回答是,但又不是命满,畢竟不寫出來(lái)只會(huì)是更晚涝滴。
當(dāng)前版本為
redux@4.0.1
,可能會(huì)根據(jù)版本不同存在些許差異胶台,不過(guò)不影響歼疮。
Directory
src
|---- utils
| |---- actionTypes.js
| |---- isPlainObject.js
| |---- warning.js
|---- applyMiddle.js
|---- bindActionCreator.js
|---- combineReducers.js
|---- compose.js
|---- createStore.js
|---- index.js
Analysis
utils
actionTypes.js
actionTypes.js
保存了redux
中的一些私有action類型,根據(jù)名稱也很好理解诈唬,這里就不過(guò)多贅述了韩脏。
const randomString = () =>
Math.random()
.toString(36)
.substring(7)
.split('')
.join('.')
const ActionTypes = {
INIT: `@@redux/INIT${randomString()}`,
REPLACE: `@@redux/REPLACE${randomString()}`,
PROBE_UNKNOWN_ACTION: () => `@@redux/PROBE_UNKNOWN_ACTION${randomString()}`
}
export default ActionTypes
isPlainObject.js
isPlainObject.js
用于判斷是否是一個(gè)簡(jiǎn)單對(duì)象,這里簡(jiǎn)單的意思是指是否是單純的object
铸磅,如數(shù)組赡矢、函數(shù)等就不是,主要依靠的是Object.getPrototypeOf
獲取當(dāng)前對(duì)象的原型阅仔,通過(guò)當(dāng)前對(duì)象的直接原型和最終原型(即object
)相比較判斷是否是簡(jiǎn)單對(duì)象吹散。
export default function isPlainObject(obj) {
if (typeof obj !== 'object' || obj === null) return false
let proto = obj
while (Object.getPrototypeOf(proto) !== null) {
proto = Object.getPrototypeOf(proto)
}
return Object.getPrototypeOf(obj) === proto
}
warning.js
warning.js
用于提供一個(gè)顯示警告信息的通用方法,接受一條錯(cuò)誤信息八酒,如果支持console.error
則會(huì)先使用這條命令打印警告信息空民,再拋出一個(gè)Error,不過(guò)會(huì)在方法中被catch
掉羞迷,沒(méi)有其他操作界轩。
export default function warning(message) {
if (typeof console !== 'undefined' && typeof console.error === 'function') {
console.error(message)
}
try {
throw new Error(message)
} catch (e) {}
}
index.js
index.js
是redux的入口文件,主要負(fù)責(zé)判斷當(dāng)前是否是正確的生產(chǎn)環(huán)境版本衔瓮,以及最主要的:向用戶提供api耸棒,如基本的createStore
就是在這里導(dǎo)出給用戶的。
import createStore from './createStore'
import combineReducers from './combineReducers'
import bindActionCreators from './bindActionCreators'
import applyMiddleware from './applyMiddleware'
import compose from './compose'
import warning from './utils/warning'
import __DO_NOT_USE__ActionTypes from './utils/actionTypes'
// ... 此處省略了判斷環(huán)境以及版本的警告提示
export {
createStore,
combineReducers,
bindActionCreators,
applyMiddleware,
compose,
__DO_NOT_USE__ActionTypes
}
All
index
compose
applyMiddleware
bindActionCreators
combineReducers
createStore