VUE 2.0 碎碎念

前言

一個多月前,抽空看了一下 Vue 2.0 的源碼,看源碼最好的方式還是先搜下相關文章,把握整體脈絡之后,再看一些細節。先列一下我看源碼時候參考的一些文章:

這幾篇文章都寫得很好,但也有一些缺點。其中《vue源碼解析系列》雖然講得比較深入,但想要讀懂,必須對源碼有一定了解;而其他兩篇文章雖然易懂,但是又不夠深入。

所以我又參照了 Vue 源碼,實現了一個簡易的 miniVue

原本計劃在這個基礎上,寫一篇《一步步實現 miniVue》的文章,但是后來因為工作忙的原因,一直沒有動筆。

所以現在先寫一篇碎碎念,記下一些 Vue 設計上的黑魔法,以及個人對 Vue 2.0 代碼的一些觀點,算是一篇草稿吧。

正文

  1. Vue 設計上用了許多黑魔法,其中最廣為人知的就是利用 JavaScript 中的 getter,setter 實現一套雙向綁定機制。雖然這一套機制非常精巧,但是這種對原生語言的 hack 也導致了代碼的不容易理解。比如對一個對象的訪問,可能也會導致 watcher.addDep 的觸發,而這是在代碼層面上很難察覺的,而這種地方,也很容易引入 bug。
  2. 但還是不得不說,Observer-Watcher 中的代碼,是 Vue 里面寫得最漂亮的代碼之一(另一個是 patch)。其中 watcher 里面,利用 deps,newDeps 兩個數組,實現了 update Deps 的功能,具體的代碼在 Watcher.addDep 中。雖然只有幾行代碼,但是卻使用了垃圾回收的原理,非常優雅。
  3. Patch 是 Vue 實現虛擬 DOM 的一個重要部分,如果有看過源碼注釋的話,就會發現這個 patch 實際上是基于另一個項目修改而來的。Patch 里面的 updateChildren 是最重要的函數,巧妙且大膽地動態去修改 Vnode數組(同時也修改了 Vnode),從而讓 diff 和 patch 同時完成。相比之下,React 的實現就沒有那么巧妙了,只是簡單地用了最基本的 diff 套路,對 vNode 進行靜態分析(當然這只是很久之前我所看到的 React 版本,可能現在已經改變了實現方式)。
  4. 在閱讀 React 和 Vue 的源碼時,都需要分清一個比較容易混淆的概念,那就是 Component 和 componentInstance,這兩者之間的關系就和面向對象中的 Class 和 Object 的關系類似。Vue 的 Component機制原理上和 React 是一樣的。其中在 Vue 中,Vue.component 實際上是 Vue 的一個子類,這也算是一個設計比較巧妙的地方吧,不過也是情理之中。
  5. computed 的實現算是把 Observer-Watcher 用到了極致,其中的關鍵在于理解 createComputedGetter 函數,通過 watcher.depend() 將綁定在 watcher 中的 deps 都綁定到 Dep.target 中。雖然代碼量很少,但是這段代碼依然很難理解,這也算是檢驗是否真正理解 Observer-Watcher 機制的一個判斷方法吧。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,321評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,559評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,442評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,835評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,581評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,922評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,931評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,096評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,639評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,374評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,591評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,104評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,789評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,196評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,524評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,322評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,554評論 2 379

推薦閱讀更多精彩內容