9月30日,尤雨溪在medium個(gè)人博客上發(fā)布了vue3.0的開發(fā)思路,國(guó)內(nèi)有翻譯的版本,見文章最后的參考鏈接。3.0帶了了很大的變化,他講了一些改進(jìn)的思路以及整個(gè)開發(fā)流程的規(guī)劃。
vue3.0的改進(jìn)思路
vue最主要的特點(diǎn)就是響應(yīng)式機(jī)制、模板、以及對(duì)象式的組件聲明語(yǔ)法,而3.0對(duì)這三部分都做了更改。
1. 響應(yīng)式
2.x的響應(yīng)式是基于Object.defineProperty實(shí)現(xiàn)的代理,兼容主流瀏覽器和ie9以上的ie瀏覽器,能夠監(jiān)聽數(shù)據(jù)對(duì)象的變化,但是監(jiān)聽不到對(duì)象屬性的增刪、數(shù)組元素和長(zhǎng)度的變化,同時(shí)會(huì)在vue初始化的時(shí)候把所有的Observer都建立好,才能觀察到數(shù)據(jù)對(duì)象屬性的變化。
針對(duì)上面的問題,3.0進(jìn)行了革命性的變更,采用了ES2015的Proxy來(lái)代替Object.defineProperty,可以做到監(jiān)聽對(duì)象屬性的增刪和數(shù)組元素和長(zhǎng)度的修改,還可以監(jiān)聽Map、Set、WeakSet、WeakMap,同時(shí)還實(shí)現(xiàn)了惰性的監(jiān)聽,不會(huì)在初始化的時(shí)候創(chuàng)建所有的Observer,而是會(huì)在用到的時(shí)候才去監(jiān)聽。但是,雖然主流的瀏覽器都支持Proxy,ie系列卻還是不兼容,所以針對(duì)ie11,vue3.0決定做單獨(dú)的適配,暴露出來(lái)的api一樣,但是底層實(shí)現(xiàn)還是Object.defineProperty,這樣導(dǎo)致了ie11還是有2.x的問題。但是絕大部分情況下,3.0帶來(lái)的好處已經(jīng)能夠體驗(yàn)到了。
響應(yīng)式方面,vue3.0做了實(shí)現(xiàn)機(jī)制的變更,采用ES2015的Proxy,不但解決了vue2.x中的問題,還是得性能有了進(jìn)一步提升。雖然有一些兼容問題,但是通過(guò)適配的方式解決掉了。此外,還暴露了observable的api來(lái)創(chuàng)建響應(yīng)式對(duì)象,可以替代掉event bus,來(lái)做一些跨組件的通信。
2.模板
模板方面沒有大的變更,只改了作用域插槽,2.x的機(jī)制導(dǎo)致作用域插槽變了,父組件會(huì)重新渲染,而3.0把作用于插槽改成了函數(shù)的方式,這樣只會(huì)影響子組件的重新渲染,提升了渲染的性能。
同時(shí),對(duì)于render函數(shù)的方面,vue3.0也會(huì)進(jìn)行一系列更改來(lái)方便習(xí)慣直接使用api來(lái)生成vdom的開發(fā)者。
3. 對(duì)象式的組件聲明方式
vue2.x中的組件是通過(guò)聲明的方式傳入一系列option,和TypeScript的結(jié)合需要通過(guò)一些裝飾器的方式來(lái)做,雖然能實(shí)現(xiàn)功能,但是比較麻煩。
3.0修改了組件的聲明方式,改成了類式的寫法,這樣使得和TypeScript的結(jié)合變得很容易。
此外,vue的源碼也改用了TypeScript來(lái)寫。其實(shí)當(dāng)代碼的功能復(fù)雜之后,必須有一個(gè)靜態(tài)類型系統(tǒng)來(lái)做一些輔助管理,如React使用的Flow,Angular使用的TypeScript。現(xiàn)在vue3.0也全面改用TypeScript來(lái)重寫了,更是使得對(duì)外暴露的api更容易結(jié)合TypeScript。靜態(tài)類型系統(tǒng)對(duì)于復(fù)雜代碼的維護(hù)確實(shí)很有必要。
其他的一些東西
vue3.0的改變是全面的,上面只涉及到主要的3個(gè)方面,還有一些其他的更改:
- 支持自定義渲染器,從而使得weex可以通過(guò)自定義渲染器的方式來(lái)擴(kuò)展,而不是直接fork源碼來(lái)改的方式。
- 支持Fragment(多個(gè)根節(jié)點(diǎn))和Protal(在dom其他部分渲染組建內(nèi)容)組件,針對(duì)一些特殊的場(chǎng)景做了處理。
- 基于treeshaking優(yōu)化,提供了更多的內(nèi)置功能。
vue3.0的開發(fā)流程規(guī)劃
vue的開發(fā)思路是公開的,尤雨溪說(shuō)主要的特性會(huì)聽取一些主要庫(kù)的開發(fā)者的反饋,有比較確定的方案以后公布RFC收集公眾的反饋意見,之后才進(jìn)入開發(fā),同時(shí)會(huì)同步生態(tài)內(nèi)相關(guān)的庫(kù)和工具的更新。
雖然vue不如react和angular那樣有大公司維護(hù),但是借助開源的力量,整個(gè)流程都是開源社區(qū)參與的,這樣vue的穩(wěn)定程度和開發(fā)思路自然也就不會(huì)有什么大的問題。
總結(jié)
vue3.0對(duì)vue的主要3個(gè)特點(diǎn):響應(yīng)式、模板、對(duì)象式的組件聲明方式,進(jìn)行了全面的更改,底層的實(shí)現(xiàn)和上層的api都有了明顯的變化,基于Proxy重新實(shí)現(xiàn)了響應(yīng)式,基于treeshaking內(nèi)置了更多功能,提供了類式的組件聲明方式。而且源碼全部用typescript重寫。以及進(jìn)行了一系列的性能優(yōu)化。
尤雨溪說(shuō),大概19年左右就可以見到vue3.0,非常期待這個(gè)全面改革的版本 。