Vue3.0?性能優化及新特性

Vue3.0的六大亮點:

性能

Tree-shaking 支持

Composition API

Fragment、Teleport、Suspense

更好的 TS 支持

自定義渲染API

編譯時對VDom的性能優化

PatchFlag

首先看下面這個案例,模版中有三個P標簽,其中只有最后一個P標簽的TEXT部分是動態的

在之前的VDOM中,如果msg值發生改變,整個模版中的所有元素都需要重新渲染。但在Vue3.0中,在這個模版編譯時,編譯器會在動態標簽末尾加上 /* Text*/ PatchFlag。只能帶patchFlag 的 Node 才被認為是動態的元素,會被追蹤屬性的修改。并且 PatchFlag 會標識動態的屬性類型有哪些,比如這里 的TEXT 表示只有節點中的文字是動態的。

每一個Block中的節點,就算很深,也是直接跟Block一層綁定的,可以直接跳轉到動態節點而不需要逐個逐層遍歷。

既有VDOM的靈活性,又有性能保證。

hoistStatic 靜態節點提升

當使用hoistStatic時,所有 靜態的節點都被提升到render方法之外。這意味著,他們只會在應用啟動的時候被創建一次,而后隨著每次的渲染被不停的復用。

在大型應用中對于內存有很大的優化。

cacheHandler 事件監聽緩存

正常情況下,當綁定一個事件:

<div>

? <p @click="handleClick">靜態代碼</p>

</div>

模版會被編譯為

export function render(_ctx, _cache) {

? return (_openBlock(), _createBlock("div", null, [

? ? _createVNode("p", { onClick: _ctx.handleClick }, "靜態代碼", 8 /* PROPS */, ["onClick"])

? ]))

}

其中事件會每次從全局上下文中獲取。而當開啟了cacheHandler之后

export function render(_ctx, _cache) {

? return (_openBlock(), _createBlock("div", null, [

? ? _createVNode("p", {

? ? ? onClick: _cache[1] || (_cache[1] = ($event, ...args) => (_ctx.handleClick($event, ...args)))

? ? }, "靜態代碼")

? ]))

}

編輯器會為你動態創建一個內聯函數,內聯函數里面再去飲用當前組件上最新的handler。之后編輯器會將內聯函數緩存。每次重新渲染時如果事件處理器沒有變,就會使用緩存中的事件處理而不會重新獲取事件處理器。這個節點就可以被看作是一個靜態的節點。這種優化更大的作用在于當其作用域組件時,之前每次重新渲染都會導致組件的重新渲染,在通過handler緩存之后,不會導致組件的重新渲染了。

SSR 服務端渲染

當開啟SSR了之后,如果我們模版中有一些靜態標簽,這些靜態標簽會被直接轉化成文本。

其中的動態綁定依然是一個單獨的字符串內嵌進去。這個性能肯定比React 轉成VDOM在專為HTML快很多。

StaticNode 靜態節點

剛才提到在SSR中靜態的節點會被轉化為純字符串。如果在客戶端,當靜態節點嵌套足夠多的時候,VUE編譯器也會將VDOM轉化為純字符串的HTML。即 StaticNode。

通過這些操作,我們可以看下,跟vue2比可以快一倍以上,內存占用可以小一倍以上。

Tree Shaking

因為ES6模塊是靜態引用的,所以我們可以在編譯時正確的判斷到底加載了哪些代碼。對代碼全局做一個分析,找到那些沒用被用到的模塊、函數、變量,并把這些去掉。

當使用一個 bundle (webpack etc.)的時候,默認會加上 TreeShaking。Vue 3.0 中沒有被用到的模塊可以不被打包到編譯后的文件中,被 TreeShake 掉。當只有一個HelloWorld的時候 Vue3打包后 13.5kb。所有的組件全部加載進來時是 22.5kb

Composition API

隨著Vue組件的增大,組件內代碼變得越來越難以理解和維護。其中的一些可以復用的代碼很難被抽離出來。同時 Vue2.0還缺少 TS支持。在Vue2中,邏輯概念(功能)被管理在組件中,但是功能和組件并不是一對一關系。一個功能可以被多個組件使用同時一個組件可以有多個功能。在Vue中,一個功能可能需要依賴多個Options(components、props、data、computed、methods及生命周期方法)。

在 Composition API中提供可 setup 方法。以一個有搜索功能和 排序功能組件為例:

<script>

export default {

? ? setup() {

? ?

? ? }

}

function useSearch() {

? ? return {

? ? ...useSearch(),

? ? ...useSorting()

? ? }

}

function useSorting() {

? ?

}

</script>

Vue2 中的代碼復用

Mixin

在Vue2中有幾種方式可以復用代碼,其中之一就是 Mixins。

Mixins可以實現組織功能

容易發生沖突

很難說明依賴關系

代碼不容易復用

Mixin 工廠

可以方便復用

明確的依賴關系

弱命名空間

隱性的屬性添加

Scoped Slots

解決了 Mixin 的問題

增加了層級關系導致更難以理解

很多配置信息

靈活性更少

性能較差

核心 API

reactive

ref

computed

readonly

watchEffect

watch

Lifecycle Hooks

Fragments

Vue3中不在要求模版的跟節點必須是只能有一個節點。跟節點和和render函數返回的可以是純文字、數組、單個節點,如果是數組,會自動轉化為 Fragments。

Teleport

對標 React Portal??梢宰鲆恍╆P于響應式的設計,如果屏幕寬度比較寬的時候,加入某些元素,屏幕變窄后移除。

Suspense

等待嵌套的異步依賴。再把一個嵌套的組件樹渲染到頁面上之前,先在內存中進行渲染,并記錄所有的存在異步依賴的組件。只有所有的異步依賴全部被resolve之后,才會把整個書渲染到dom中。當你的組件中有一個 async的 setup函數,這個組件可以被看作是一個Async Component,只有當這個組件被Resolve之后,再把整個樹渲染出來

async setup()

Async Component

Typescript

Vue3源碼使用 TS重寫,但不意味著vue3的項目也要使用TS。但Vue3會對 TS有更好的支持

支持 TSX

支持 Class component

代碼會變大一些

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,546評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,570評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,505評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,017評論 1 313
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,786評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,219評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,287評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,438評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,971評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,796評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,995評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,540評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,230評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,918評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,697評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374