王逸嘉 馮彥
1. 上海大學(xué)附屬南通醫(yī)院(南通市第六人民醫(yī)院) 江蘇 南通 226000;2. 江蘇商貿(mào)職業(yè)學(xué)院 江蘇 南通 226000
在如今的WEB開發(fā)中,前端在系統(tǒng)中承擔(dān)了更多的工作,頁面中的交互設(shè)計和數(shù)據(jù)處理日趨復(fù)雜。原本的MVC模式的前端框架已經(jīng)不能滿足當(dāng)今開發(fā)人員的開發(fā)需求,相繼出現(xiàn)了MVP、MVVM[1]模式的前端框架來滿足日趨復(fù)雜的View層的開發(fā)需求。其中,采用MVVM的Vue.js[2]開發(fā)框架發(fā)展迅猛,靈活易用和高性能的優(yōu)點使其已經(jīng)成為企業(yè)級前端開發(fā)中不可或缺的重要工具。如今,Vue.js3.0已經(jīng)被廣泛使用,本文在介紹和分析Vue.js最新特性的基礎(chǔ)上探究前端框架發(fā)展方向和趨勢。
Vue.js是目前非常流行的MVVM前端框架,可以用于快速搭建用戶界面,它采用數(shù)據(jù)驅(qū)動和組件化的思想設(shè)計,為開發(fā)者提供了獨特的響應(yīng)機制以及靈活的、模塊化的開發(fā)環(huán)境。同時,Vue.js還擁有極為豐富和活躍的生態(tài)環(huán)境[3],使其在狀態(tài)管理、路由管理、依賴管理、服務(wù)端渲染和前端工程化等方面都具備日益強大的能力。下面總結(jié)目前Vue.js比較突出的優(yōu)點。
2.1.1 方便的數(shù)據(jù)響應(yīng)機制。在過去,前端開發(fā)者在數(shù)據(jù)發(fā)生改變時,需要在JavaScript代碼中書寫大量的DOM操作語句,這樣的做法不僅容易出現(xiàn)性能問題也使得開發(fā)中的代碼量急劇上升。Vue.js中的數(shù)據(jù)響應(yīng)機制,當(dāng)數(shù)據(jù)發(fā)生變化時,會自動根據(jù)變化的數(shù)據(jù)渲染頁面,使開發(fā)人員能夠?qū)⒆⒁饬性跇I(yè)務(wù)邏輯的開發(fā)中,極大提升了效率。
2.1.2 虛擬DOM的引入。虛擬DOM概念是為了解決現(xiàn)代WEB開發(fā)中對DOM的頻繁操作而產(chǎn)生的性能問題。虛擬DOM機制可以將多次的DOM操作先進行保存,然后一次性對真實的DOM樹進行更新,從而降低了操作DOM的次數(shù),有效減少了瀏覽器性能的損失。Vue.js中引入了虛擬DOM機制與數(shù)據(jù)響應(yīng)機制配合,提供了高性能的頁面渲染表現(xiàn)。
2.1.3 對HTML模板的支持。HTML是前端開發(fā)者的基礎(chǔ)標(biāo)記語言,在Vue.js中引入HTML模板可以讓開發(fā)者的學(xué)習(xí)成本急劇降低,Vue.js讓HTML模板具備虛擬DOM的能力,使得開發(fā)者已有的WEB應(yīng)用也能快速擁有Vue.js的數(shù)據(jù)響應(yīng)機制。
目前的前端開發(fā)框架正朝著更快、更輕、更易于維護的方向發(fā)展。因此,Vue.js3.0版本進行了大量優(yōu)化和重構(gòu),在性能、靈活性、以及模塊化等諸多方面進行了大量改進。以下分析Vue.js3.0版本中比較重要的最新特性,并選擇性與舊版本實現(xiàn)方法進行比較。
Composition API是Vue.js3.0重新設(shè)計的組件API,允許開發(fā)者使用JavaScript原聲的函數(shù)來描述組件中的可用資源,靈活地組合組件邏輯[4-5]。而在當(dāng)前的版本中,Vue.js使用的是Options API進行組件化開發(fā),在開發(fā)中,開發(fā)者需要在組件中添加可選的屬性進行組件的設(shè)計。Options API存在著一些問題,最為突出的是具有復(fù)雜層級的多個組件的邏輯和重用問題。
3.1.1 mixins的使用問題。開發(fā)者通常會使用mixins直接引入一些資源到組件中,這在開發(fā)中十分常見,這些新引入的資源有可能會導(dǎo)致屬性的命名沖突,也會因為其中自帶的某些行為而擾亂當(dāng)前組件的邏輯。
3.1.2 作用域插槽的使用問題。作用域插槽和mixins都有數(shù)據(jù)來源不明確的問題,而且只能在模板中的組件作用域內(nèi)使用引入的數(shù)據(jù)或資源。
3.1.3 高階組件的使用問題。在使用組件進行開發(fā)時,開發(fā)者會將一些可以復(fù)用的屬性和方法封裝到父級組件當(dāng)中來提高開發(fā)效率。在項目中,多個組件間的關(guān)系會變得十分復(fù)雜,會導(dǎo)致子組件渲染的時候也會加載一些高階組件中不必要的一些資源,導(dǎo)致性能的浪費。
在Vue.js2.x版本中響應(yīng)機制使用的是基于Object.defineProperty的觀察者模式[6],其原理是對Vue實例中data屬性下的數(shù)據(jù)使用Object.defineProperty創(chuàng)建對象訪問器:getter和setter,從而實現(xiàn)對數(shù)據(jù)變化的響應(yīng)機制。但是,這種方式存在非常明顯的缺點。
3.2.1 無法監(jiān)測數(shù)組下標(biāo)發(fā)生的變化。例如開發(fā)者在開發(fā)中直接使用操作數(shù)組下標(biāo)的形式對數(shù)組進行添加元素操作時,系統(tǒng)無法監(jiān)測到數(shù)據(jù)變化,視圖層也不會隨之更新。
3.2.2 只能對對象的屬性進行監(jiān)測。在Vue.js2.x版本中,Vue.js的響應(yīng)式機制只能監(jiān)測對象的屬性變化,而對于復(fù)雜的對象,例如對象的某些屬性也是一個對象,則需要使用遞歸的方法去遍歷對象更深層次的屬性。
代碼中使用基于Object.defineProperty的觀察者模式,當(dāng)修改對象data中某個對象類型屬性的屬性值時,需要在observer方法中進行多次遍歷,直到傳入defineReactive方法中的value參數(shù)不再是一個對象。
在Vue.js3.0版本中,采用了基于Proxy(代理)的觀察者模式。Proxy類似于一種“攔截器”,當(dāng)外部需要訪問目標(biāo)對象時,需要經(jīng)過Proxy進行代理,而在這個過程中,Proxy可以對數(shù)據(jù)的基本操作進行自定義[7]。例如在設(shè)置對象屬性前進行驗證、讀取對象數(shù)據(jù)時進行一些對象的格式化工作以及擴展原有的構(gòu)造函數(shù)。同時,Proxy也解決了以上提到的使用Object.defineProperty這種方式的兩個缺點,Proxy可以實現(xiàn)對整個對象的劫持監(jiān)測,也能夠監(jiān)測到直接操作數(shù)組下標(biāo)進行的數(shù)組更新。
Tree-shaking原本是JavaScript模塊打包器Rollup.js的重要特性。它能夠在開發(fā)中避免不必要的模塊引入,減少最終打包到生產(chǎn)環(huán)境的代碼包的體積。在Vue.js3.0中全局API將能夠使用Tree-shaking。在Vue.js2.x版本中,無論需求是什么,都需要導(dǎo)入Vue.js的核心模塊。
而在目前公布的的Vue.js3.0預(yù)覽版源代碼中,通過使用Tree-shaking特性可以指定當(dāng)前需要導(dǎo)入的模塊,且打包到生產(chǎn)環(huán)境時,只會打包代碼中聲明導(dǎo)入的模塊。
只有導(dǎo)入的nextTick和observable模塊會被打包到生產(chǎn)環(huán)境,這種特性更利于開發(fā)者開發(fā)出更小更輕的WEB應(yīng)用[8]。
Vue.js3.0版本全面提高了可維護性,這種提升是從多方面進行的,包括調(diào)試工具的升級、編譯器的重寫以及更加模塊化的包結(jié)構(gòu)等。可維護性的提升對于Vue.js的發(fā)展有非常重要的意義,將會使得讓Vue.js在未來獲得更多前端開發(fā)者的歡迎。以下介紹Vue.js可維護性提升的幾個重要改進:
3.4.1 全面提升的模塊化體驗。在Vue.js3.0代碼中,可以看到大部分模塊進行了重新解耦,使得每個模塊都可以獨立運行,極大降低了各個包之間的耦合程度。解耦后的包被放在框架中的packages文件夾下。這種提升給予了開發(fā)者更大的靈活性和自由度,開發(fā)者可以深入分析源碼,對模塊進行定制和二次開發(fā)。
3.4.2 編譯器重寫。Vue.js2.x版本中,運行時的錯誤提示準(zhǔn)確度和可讀性一直為人詬病。在Vue.js3.0版本中,對編譯器進行了重寫,提高了錯誤提示的準(zhǔn)確度。另外,編譯器重寫后,對于IDE的支持會更加優(yōu)秀,性能也得到了提升。
3.4.3 對TypeScript的支持。由于JavaScript不是強類型語言,在輸入操作時容易輸入錯誤的數(shù)據(jù),通常開發(fā)人員會使用flow和TypeScript兩種方案,而flow對于開發(fā)人員的水平要求較高,使用較為復(fù)雜,多人協(xié)作和團隊開發(fā)時也會產(chǎn)生一些困難。TypeScript是JavaScript的超集,對于前端人員學(xué)習(xí)成本較低,Vue.js3.0版本目前已經(jīng)支持了TypeScript。
Vue.js作為目前非常流行的前端框架,其新版本的特性蘊含了前端框架升級趨勢以及前端領(lǐng)域的發(fā)展方向,值得關(guān)注。事實上,Vue.js新版本許多方面的升級,也借鑒了React,js和Angular.js的特性,使得Vue.js的新特性會更加具有代表性[9]。從Vue.js3.0版本的代碼中,作者總結(jié)出前端框架的幾個發(fā)展趨勢:
根據(jù)以上對于Vue.js的新特性的分析,其中最突出的改進是對于性能表現(xiàn)的提升,Proxy機制和Composition API都為性能的提升做出了貢獻,另外Tree-shaking特性的引入不僅使得打包到生產(chǎn)環(huán)境的源碼包體積減小,同樣也為性能的提升爭取到了更大空間。目前,主流的前端框架大多使用MVVM的開發(fā)模式,而MVVM開發(fā)模式對視圖的頻繁更新容易引起性能問題,所以目前主流的前端框架都把性能的提升作為更新的重點之一。
目前前端主流框架之間并沒有實現(xiàn)很好的合作或兼容,但是它們之間的升級和優(yōu)化的方向上十分相似,在許多問題的處理上也使用了相同的解決方案。如2.x版本的Vue.js的寫法就與React.js十分相似,同時它們也都使用虛擬DOM、響應(yīng)式機制以及組件化開發(fā)方式。從長遠發(fā)展來看,前端的主流框架將會朝著標(biāo)準(zhǔn)化統(tǒng)一化的方向發(fā)展,開發(fā)者的學(xué)習(xí)成本和開發(fā)效率都會更高。
如今前端項目的高復(fù)雜度使得前端技術(shù)也獲得了長足發(fā)展,特別是前后端分離的應(yīng)用結(jié)構(gòu)的流行,前端開發(fā)已經(jīng)是一項成熟的軟件工程,隨之配套的開發(fā)、測試、部署工具也日益成熟。在開發(fā)工作中,前端工程化包括了框架選型,開發(fā)流程設(shè)計、代碼規(guī)范制定,項目構(gòu)建和發(fā)布運維等。當(dāng)前主流的前端框架都有著非常豐富的生態(tài)系統(tǒng),隨著使用的開發(fā)者的增多,大部分框架都已經(jīng)形成了一套穩(wěn)定的、成體系的前端工程化方案,前端工程化的發(fā)展也將會更加的深化。
Vue.js的新特性在目前前端框架的發(fā)展趨勢中是具有代表性的變化和升級,從這些新特性中很容易發(fā)現(xiàn)前端領(lǐng)域正朝著輕量化和更高性能的方向發(fā)展,同時也更加人性化。Vue.js新特性在項目可維護性上做出的努力以及賦予開發(fā)者更多的靈活性和自由度都體現(xiàn)了前端框架對于開發(fā)者更多的關(guān)注。
目前來著,前端框架之間各自的發(fā)展方向日益趨同,如果在未來可以實現(xiàn)更多合作甚至遵循統(tǒng)一標(biāo)準(zhǔn)進行開發(fā),前端的開發(fā)效率將會實現(xiàn)飛躍。