摘要:模板語法的將保持不變。基于的觀察者機制目前,的反應系統是使用的和。為了繼續支持,將發布一個支持舊觀察者機制和新版本的構建。
還有幾個月距離vue2的首次發布就滿3年了,而vue的作者尤雨溪也在去年年末發布了關于vue3.0的計劃,如果不出意外,我們將在今年的某個時間點見證Vue3.0的發布,雖然前幾天在《StateOfJS: 2018年JavaScript生態圈趨勢報告》一文中我們看到目前Vue的使用者比React還少了不少,但在Github上Vue的star數已經超越React,可見用戶對Vue的喜愛,那即將發布的Vue3又有什么新特性呢?我們一起來看看吧!
Vue 3.0 已經在原型設計階段了,而且我們已經實現了一個與 2.0 的特性近乎相等的運行時了。下文中列出的許多條目,要么已經實現了,要么已經確認可實現。那些還未實現或者仍在探索階段的條目會用一個“*”標記性能提升
一句話簡介:更小巧,更快速;支持搖樹優化;支持 Fragments 和跨組件渲染;支持自定義渲染器。
更小巧:這份新的代碼庫在設計之初就考慮到了對“搖樹優化 (tree-shaking)”的友好。那些如內置組件 (
搖樹優化,是一種在打包時去除沒用到的代碼的優化手段,谷歌有一篇教程可以了解下: Reduce JavaScript Payloads with Tree Shaking
更快:在前期的基準測試中,我們看到整體性能有了一倍的提升,包括虛擬DOM的掛載和打補丁(patching,指更新——譯注) 的速度(我們從 Inferno 那里學了好些個技巧過來——Inferno 是目前速度最快的虛擬DOM實現),以及組件實例化速度和數據監測的性能。在 3.0 中,你應用的啟動時間將縮減一半。
支持 Fragments 和 Portal:雖然體積更小了,但 3.0 還將內置對 Fragments (即允許組件擁有多個根節點) 和 Portal (即允許在 DOM 的其他位置進行渲染,而不是組件內部) 的支持。
關于 Portal ,你可以將其理解為跨組件渲染或者異地渲染,vue-portal 是一個第三方實現,可以了解一下;Fragments 特性也有一個第三方庫,但譯者認為這個庫的內部實現不夠完善,叫做 vue-fragments,感興趣可以了解一下。
增強的 slot 機制:所有由編譯器生成的 slot 都將是函數形式,并且在子組件的 render 函數被調用過程中才被調用 (譯注:現在只有 scoped slot 才是函數形式,其渲染的時機也是在父組件的渲染進行時)。這使得 slot 中的依賴項 (即數據——譯注) 將被作為子組件的依賴項,而不是現在的父組件;從而意味著:1)當 slot 的內容發生變動時,只有子組件會被重新渲染;2)當父組件重新渲染時,如果子組件的內容未發生變動,子組件就沒必要重新渲染。這種機制的改變,可以提供更精確的變動探測,也就可以消除沒必要的重渲染。
支持自定義渲染器 (Renderer):這個 API 可以用來創建自定義的渲染器,它將作為“一等公民”出現,到時不再需要 fork 一份 Vue 的代碼來通過修改實現自定義。這個 API 的到來,將使得那些如 Weex 和 NativeScript 的“渲染為原生應用”的項目保持與 Vue 的同步更新變得更加容易。除此之外,還將使得那些為了各種用途而創建自定義渲染器變得極其容易。
編譯器相關的提升 *如果采用的是支持“搖樹優化”的打包器,模板中使用到的那些可選特性,在生成的代碼中將通過 ES 的模塊語法導入;而在打包后的文件中,那些沒用到的可選特性就會被“搖掉”。
由于新的虛擬 DOM 實現所帶來的提升,我們可以執行一些更加高效的編譯耗時優化,如靜態樹提升(static tree hoisting)、靜態屬性提升(static props hoisting);以及為運行時提供一些來自編譯器的提示,以此避開子組件的規范過程 (children normalization);提供 VNode 快速創建路徑; 等等。
我們計劃對解析器進行重寫,以便在對模板進行編譯發生錯誤時,可以提供錯誤發生的位置信息;除此之外還可以帶來對模板的 source map 支持;還可以支持第三方工具如 eslint-plugin-vue 和 IDE 的語言服務 (language services) 特性。
API 變動一句話介紹:除渲染函數 API 和 scoped-slot 語法之外,其余均保持不變或者將通過另外構建一個兼容包來兼容 2.x。
模板語法的 99% 將保持不變。除了 scoped slot 語法可能會有一些微調之外,我們還沒有任何其他針對模板的變動計劃。
3.0 版本將原生地支持基于 class 的組件,而且無需借助任何編譯及各種 stage 階段的特性,以此提供良好的編寫體驗。許多現有的 (組件) 配置項將有對應的合理的 class 版本的 API。各種 stage 階段的特性,如 class 的靜態字段和裝飾器 (decorator) 等仍然可以選擇性地使用,以此增強編寫體驗。另外,整體的 API 在設計時也將考慮 TypeScript 的類型推斷特性。3.x 的代碼庫本身將用 TypeScript 來編寫,并提供增強的 TypeScript 支持。(就是說,TypeScript 的使用與否仍然是整體可選的)
2.x 系列的基于對象的組件格式仍將受支持,不過會在內部將其轉換為一個相應的 class。
仍然支持 Mixins。*
為了避免在安裝插件時造成對 Vue 的運行時的修改,頂層 API 可能會做一個大的翻修。到時,插件的作用域將只局限到具體的一個組件樹,使得對那些依賴于某些具體插件的組件的測試變得容易,也會使得在同一個頁面中掛載多個使用不同插件——但使用同一個 Vue 運行時——的 Vue 應用變為可能。*
函數式組件將支持純函數的書寫形式——不過,這樣的話異步組件就需要通過一個輔助性函數來顯式地創建了。
變動最大的部分將是渲染函數 (render) 中的虛擬DOM的格式。我們現在正在收集主流的第三方庫的作者們的反饋,在對這些變動有了更多的信心之后,我們還會將更多的細節曝光;雖然變動較大,但是只要你沒在你的應用中重度使用手寫的渲染函數 (不是指 JSX),那么變動之后的升級應該會比較容易。
代碼重構一句話介紹:更優良的內部模塊解耦;TypeScript;更易于貢獻的代碼庫。
在從零開始編寫 3.0 之初,“達到更加清晰和更易維護的架構,特別是為了讓代碼的貢獻變得容易”就是我們的目標。為了對復雜性進行隔離,我們將一些內部功能拆分為了多個多帶帶的包。例如,observer 模塊將成為一個多帶帶的包,擁有自己對外的 API 和自己的測試用例;不過請注意,這不會對框架級的 API 造成影響——你不需要另外手動從多個包里導入許多小件小件的模塊就可以使用 Vue,相反 Vue 的最終包會事先裝配好這些內部包。
另外,代碼庫現在改為了用 TypeScript 編寫;雖然這會使得“熟練TypeScript”成為對新代碼庫進行貢獻的一個前置要求,不過我們相信有類型信息配合 IDE 的支持,對于一個新的貢獻者來說,要做出有意義的貢獻,實際上反而會更加容易。
將 observer 和 scheduler 解耦為分開的兩個包后,我們還可以拿一些替代的實現對這兩個包進行置換試驗。例如,我們可以實現一個兼容 IE11、API 也相同的 observer;或者實現另外一種利用 requestIdleCallback 來在長耗時的更新中產出工作成果到瀏覽器的 scheduler。
隨著虛擬 DOM 重寫,我們可以期待更多的 編譯時(compile-time)提示來減少 運行時(runtime)開銷。重寫將包括更有效的代碼來創建虛擬節點。
優化插槽生成(Optimized Slots Generation)在當前的 Vue 版本中,當父組件重新渲染時,其子組件也必須重新渲染(11月20日更新:這句話是不嚴謹的,非常容易產生誤導,我覺得有必要說明一下: 2.0 組件的重新渲染就是組件粒度的,除非修改的數據是子組件的 props,才會觸發子組件的重新渲染。引用自:https://juejin.im/pin/5bf28dd...)。 使用 Vue 3 ,可以多帶帶重新渲染父組件和子組件。
使用靜態樹提升,這意味著 Vue 3 的編譯器將能夠檢測到什么是靜態組件,然后將其提升,從而降低了渲染成本。它將能夠跳過未整個樹結構打補丁的過程。
此外,我們可以期待靜態屬性提升,其中 Vue 3 將跳過不會改變節點的打補丁過程。
目前,Vue 的反應系統是使用 Object.defineProperty 的 getter 和 setter。 但是,Vue 3 將使用 ES2015 Proxy 作為其觀察者機制。 這消除了以前存在的警告,使速度加倍,并節省了一半的內存開銷。
為了繼續支持 IE11,Vue 3 將發布一個支持舊觀察者機制和新 Proxy 版本的構建。
兼容 IE 11 *一句話介紹:IE 11 將受到支持,但將會是另外構建一個版本 (build) 的形式支持,不過這個版本會存在與 Vue 2.x 響應式機制所存在的同樣的局限。
新的代碼庫目前只針對主流瀏覽器,而且我們假定他們都支持 ES2015。但是,哎,我們也知道在可預見的未來還有很多用戶仍然需要支持 IE11。除了 Proxy 外,大多數 ES2015 的特性都可以用轉譯或者墊片的方式在 IE11 中使用。我們的計劃是另外多帶帶實現一個具有同樣 API 的替代性 observer,不過是基于老式的 Object.defineProperty API;然后再通過多帶帶構建一個使用這個實現的 Vue 3.x 版本 (build) 進行發布,不過這個多帶帶的版本還是會有 Vue 2.x 在變動探測方面所存在的問題,所以它其實并不是一個完全兼容 3.x 的一個版本。我們也意識到這會給第三方庫的作者們帶來某些不便,因為他們需要考慮兩個不同版本之間的兼容性問題,不過當我們真的推進到那個階段時,那時我們肯定會確保提供一份清晰的指導。
監測機制一句話介紹:更加全面、精準、高效;更具可調試性的響應跟蹤;以及可用來創建響應式對象的 API。
3.0 將帶來一個基于 Proxy 的 observer 實現,它可以提供覆蓋語言 (JavaScript——譯注) 全范圍的響應式能力,消除了當前 Vue 2 系列中基于 Object.defineProperty 所存在的一些局限,如:
對屬性的添加、刪除動作的監測
對數組基于下標的修改、對于 .length 修改的監測
對 Map、Set、WeakMap 和 WeakSet 的支持
另外這個新的 observer 還有以下特性:
公開的用于創建 observable (即響應式對象——譯注) 的 API。這為小型到中型的應用提供了一種輕量級的、極其簡單的跨組件狀態管理解決方案。(譯注:在這之前我們可以通過另外 new Vue({data : {...}}) 來創建這里所謂的 observable;另外,其實 vuex 內部也是用這種方式來實現的)
默認為惰性監測(Lazy Observation)。在 2.x 版本中,任何響應式數據,不管它的大小如何,都會在啟動的時候被監測。如果你的數據量很大的話,在應用啟動的時候,這就可能造成可觀的性能消耗。而在 3.x 版本中,只有應用的初始可見部分所用到的數據會被監測,更不用說這種監測方案本身其實也是更加快的。
更精準的變動通知。舉個例子:在 2.x 系列中,通過 Vue.set 強制添加一個新的屬性,將導致所有依賴于這個對象的 watch 函數都會被執行一次;而在 3.x 中,只有依賴于這個具體屬性的 watch 函數會被通知到。
不可變監測對象(Immutable observable):我們可以創建一個對象的“不可變”版本,以此來阻止對他的修改——包括他的嵌套屬性,除非系統內部臨時解除了這個限制。這種機制可以用來凍結傳遞到組件屬性上的對象和處在 mutation 范圍外的 Vuex 狀態樹。
更良好的可調試能力:通過使用新增的 renderTracked 和 renderTriggered 鉤子,我們可以精確地追蹤到一個組件發生重渲染的觸發時機和完成時機,及其原因。
發布時間不必太過擔心,至少還能緩半年。
參考來源:
Plans for the Next Iteration of Vue.js
[[譯] 尤雨溪:Vue 3.0 計劃](https://juejin.im/post/5bb719...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/100959.html
摘要:到底什么時候發布據報道,人們普遍預計微軟將在今年月推出,但根據最新的傳言,我們可能在一兩周內知道具體時間。這些文件雖然沒有提到具體日期,但表明了微軟的目標是在月份推出正式版。win11到底什么時候發布?據MSPoweruser報道,人們普遍預計微軟將在今年10月推出windows11,但根據最新的傳言,我們可能在一兩周內知道具體時間。據Windows Central的Zac Bowden稱,...
摘要:微軟正式版將于月日推出了最近,微軟在多個渠道宣布將在月日推出全新的正式版,屆時所有所有符合條件的設備將會陸續獲得免費升級,在系統設置的更新中就可以直接升級安裝。微軟win11正式版將于10月5日推出了!最近,微軟在多個渠道宣布將在 10 月 5 日推出全新的 Windows 11 正式版,屆時所有所有符合條件的設備將會陸續獲得 Windows 11 免費升級,在系統設置的 Windows 更...
摘要:寫在前面深入系列共計篇已經正式完結,這是一個旨在幫助大家,其實也是幫助自己捋順底層知識的系列。深入系列自月日發布第一篇文章,到月日發布最后一篇,感謝各位朋友的收藏點贊,鼓勵指正。 寫在前面 JavaScript 深入系列共計 15 篇已經正式完結,這是一個旨在幫助大家,其實也是幫助自己捋順 JavaScript 底層知識的系列。重點講解了如原型、作用域、執行上下文、變量對象、this、...
閱讀 3114·2021-11-23 09:51
閱讀 1974·2021-09-09 09:32
閱讀 1084·2019-08-30 15:53
閱讀 2957·2019-08-30 11:19
閱讀 2464·2019-08-29 14:15
閱讀 1432·2019-08-29 13:52
閱讀 553·2019-08-29 12:46
閱讀 2818·2019-08-26 12:18