1.什么是虛擬dom桥狡?
虛擬dom本質(zhì)上就是一個普通的JS對象,用于描述視圖的界面結(jié)構(gòu)
在vue中颅围,每個組件都有一個render函數(shù)伟葫,每個render函數(shù)都會返回一個虛擬dom樹,這也就意味著每個組件都對應(yīng)一棵虛擬DOM樹
2.為什么需要虛擬dom院促?
在vue中筏养,渲染視圖會調(diào)用render函數(shù),這種渲染不僅發(fā)生在組件創(chuàng)建時常拓,同時發(fā)生在視圖依賴的數(shù)據(jù)更新時渐溶。如果在渲染時,直接使用真實DOM弄抬,由于真實DOM的創(chuàng)建茎辐、更新、插入等操作會帶來大量的性能損耗掂恕,從而就會極大的降低渲染效率拖陆。
因此,vue在渲染時懊亡,使用虛擬dom來替代真實dom慕蔚,主要為解決渲染效率的問題。
3. 虛擬dom是如何轉(zhuǎn)換為真實dom的斋配?
在一個組件實例首次被渲染時孔飒,它先生成虛擬dom樹,然后根據(jù)虛擬dom樹創(chuàng)建真實dom艰争,并把真實dom掛載到頁面中合適的位置坏瞄,此時,每個虛擬dom便會對應(yīng)一個真實的dom甩卓。
如果一個組件受響應(yīng)式數(shù)據(jù)變化的影響鸠匀,需要重新渲染時,它仍然會重新調(diào)用render函數(shù)逾柿,創(chuàng)建出一個新的虛擬dom樹缀棍,用新樹和舊樹對比,通過對比机错,vue會找到最小更新量爬范,然后更新必要的虛擬dom節(jié)點,最后弱匪,這些更新過的虛擬節(jié)點青瀑,會去修改它們對應(yīng)的真實dom
這樣一來,就保證了對真實dom達(dá)到最小的改動。
4.模板和虛擬dom的關(guān)系
vue框架中有一個compile模塊斥难,它主要負(fù)責(zé)將模板轉(zhuǎn)換為render函數(shù)枝嘶,而render函數(shù)調(diào)用后將得到虛擬dom。
編譯的過程分兩步:
將模板字符串轉(zhuǎn)換成為AST
將AST轉(zhuǎn)換為render函數(shù)
如果使用傳統(tǒng)的引入方式哑诊,則編譯時間發(fā)生在組件第一次加載時群扶,這稱之為運行時編譯。
如果是在vue-cli的默認(rèn)配置下镀裤,編譯發(fā)生在打包時竞阐,這稱之為模板預(yù)編譯。
編譯是一個極其耗費性能的操作淹禾,預(yù)編譯可以有效的提高運行時的性能,而且茴扁,由于運行的時候已不需要編譯铃岔,vue-cli在打包時會排除掉vue中的compile模塊,以減少打包體積
模板的存在峭火,僅僅是為了讓開發(fā)人員更加方便的書寫界面代碼
vue最終運行的時候毁习,最終需要的是render函數(shù),而不是模板卖丸,因此纺且,模板中的各種語法,在虛擬dom中都是不存在的稍浆,它們都會變成虛擬dom的配置