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