博客 / 詳情

返回

VUE2的小段源碼分析

關於前端視圖更新

前言

接到分享任務後一直比較頭疼,不知道分享什麼內容,能夠把此次分享做的比較好。後來偶然在網上看到一篇文章,非常有啓發性,引導我做出了本次的內容

代碼地址:(https://codepen.io/collection/DkxpbE)

代碼寫的很精妙,短短一百多行代碼,還原出來VUE響應式的核心思想。而我花了很長的時間去閲讀這段代碼,感慨我和尤雨溪之間的前端水平還是有不少差距的。

image.png
(雷軍:詩一樣的代碼)

分析

vue2在mount(準備階段)時通過watchEffect(副作用)判斷是否初次生成

image.png

是的話就生成DOM解構並通過JS更新到H5中(虛擬DOM)

image.png

否的話就判斷前後兩次傳入的代碼,分別判斷和更新tag類型,傳入的props,判斷children(子組件)。並把不同的部分重新渲染。

image.png
image.png

vue2使用Object.defineProperty,通過set劫持數據,使用dep.notify()通知對應watcher(上文的watchEffect),watcher調用_update更新視圖

image.png

Dep中負責生成虛擬DOM刷新頁面的的Effect(副作用函數)在什麼時候監聽進去的呢,答案是在首屏加載的時候。Dep和Watcher是一對多的關係,可以同時監聽多組watchEffect數據

image.png

一個較為完整的流程圖

image.png

總結和展望

官方文檔中提到VUE3的object攔截器Object.defineProperty已經替換成了Proxy。在幾個小試驗之後,我發現Proxy是Object.defineProperty的外層封裝,相當於我攔截了你的攔截。網上找了一下資料,發現對比defineProperty優點可能是能攔截數組,新增了delete方法,還有更高的自由度。

上文可以解釋為什麼VUE2我們在子組件中修改傳入的obj,會觸發父組件的重新渲染,其實是觸發了監聽在父組件上的date的set劫持。

可以推測出VUE3中傳入子組件的object變成了一份深拷貝的複製品,就不會再觸發這個問題了,react同理。(單向數據流思想)

寫完這些,感覺對前端框架的理解又深入了,感覺做出自己的前端框架也不是不可能。當然,客觀的來説這次討論的只是前端框架的一小部分原理,其外還有大量的優化和功能沒有涉及,實際上只是拋磚引玉,希望能發散出更多對前端框架的思考。

項目代碼

https://github.com/Alan1034/vue-update

參考文章

https://mp.weixin.qq.com/s/Dopiz0jgqJiSbhLOLzkQbA
https://www.cnblogs.com/datiangou/p/10144883.html
https://www.cnblogs.com/weblff/p/14144414.html

謝謝觀看
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.