真正的代碼解析html
網上有不少關於「vuex源碼解析」的文章。但可能筆者水平有限,總以爲這些文章不太直觀。vue
部分文章只是在按順序逐個js文件進行介紹,並無根據程序的運行邏輯介紹,也沒有與官方文檔進行對應。git
只有當真正理解了源碼之後才恍然大悟,哦!原來文章是這個意思。github
但這時文章已經失去了幫助理解源碼,幫助解析的意義。vuex
本文經過如下方式幫助閱讀,理解源碼chrome
給出數據結構,並介紹各數據的意義。npm
拋出結論,即給出源碼的總體運行原理。json
按照程序運行邏輯進行介紹,摒棄常規逐個文件進行介紹的方法。按照邏輯順序進行介紹。segmentfault
對應官網的介紹文章進行介紹。數組
儘可能圖文豐富,穿插表情包,讓學習過程更愉悅些。
經過以上的方式,帶着總體印象去看源碼,逐步進行驗證,加深理解。不用一頭霧水地猜源碼。
但願能經過系列文章
能將vuex源碼邏輯講清楚,幫助你們理解源碼。
讓你們瞭解vuex的實現機制,使用起來更踏實,打破顧慮。
也但願藉此消除你們對源碼的恐懼,養成閱讀源碼的習慣。
正如前面所說,須要事先了解下文給出的「變量介紹」,「運行原理」。起碼要有個印象,後續講解中,能帶着結論,不斷去印證。
按順序閱讀,因爲代碼解析是根據程序運行邏輯進行介紹的,先後相互關聯,因此須要按照順序閱讀
但當內容較爲複雜,嵌套太深時,會拆分出來說。能夠先點擊連接,跳轉到細則中看完,再回到主邏輯繼續閱讀
本文講得比較細,可能略顯繁瑣,大神請多包涵。理解能力強的同窗,能夠選擇性跳過。
雖然本文用不到,但可能有些同窗想要本身打斷點,打日誌查看實際運行過程,因此在此進行介紹
辦法很簡單,修改 vuex 庫的索引源便可。例如修改示例中的 example->counter->store.js 文件
import Vue from 'vue'
// import Vuex from 'vuex'
import Vuex from '../../src/index'
複製代碼
原理是,將本來對庫的文件(build以後,被壓縮過的)索引,改爲對vuex源文件的索引
'../../src/index'
是/src/index.js
文件,即vuex源碼的入口文件
修改後,參考 package.json 的說明,在目錄下運行命令行npm run dev
,便可執行示例程序
在源碼後打的日誌或者斷點,就能在示例中執行
經過變量 _modules 變量保存配置項模塊樹(其數據結構與配置項的數據結構相同,至關於配置文件的拷貝,只是對數據進行了些處理)
經過 state 變量保存與 _modules 模塊樹相同結構的 state 結構樹,只是內容比較純粹,全是state變量。
moduleA:{
...,
state:{a:'a'},
modules:{
moduleB:{
...,
state:{b:'b'},
modules:{
moduleC:{
state:{c:'c'},
}
}
}
}
}
複製代碼
經過 _actions,_mutations,getters 數組保存全部模塊配置中的 action, mutation,getter函數
調用 commit,dispatch,getter 時,從上面定義的容器中,找到同名的數組,順序調用裏面的函數
數據綁定的效果,經過 Vue 的 watch,computed 特性完成
總的來講,除了module和state使用了樹結構,其餘的都經過數組變量容器保存,須要用到的時候,再從裏面拿。和咱們簡單地經過全局變量保存沒太大的區別。只是作出了規範。
用得比較多的,出現比較頻繁的變量,預先介紹一下
【_committing】提交狀態
【_actions】action 函數數組對象容器
【_mutations】 mutation 函數數組對象容器
【_wrappedGetters】
【_modules】模塊樹,經過樹結構,保存配置文件內容
【store】存儲對象
【path】模塊層級數組
moduleA:{ // 對應path爲[]
...,
modules:{
moduleB:{ // 對應path爲['A']
...,
modules:{
moduleC:{} // 對應path爲['A','B']
}
}
}
}
複製代碼
文章持續輸出中,源碼註釋還未徹底整理,純當閱讀筆記,大神請勿較真
不給錢,點個贊也行啊~