vue 3.0 性能提升點(diǎn)預(yù)覽

年關(guān)將近竿滨,業(yè)務(wù)較忙于游,基本都是凌晨1-2點(diǎn)下班,早上10點(diǎn)半就上班了倾剿,一直沒(méi)有多余的時(shí)間學(xué)習(xí)蚌成,今天周日就抽空來(lái)回顧一下 11月24號(hào)在杭州 舉辦vueConf大會(huì)的視頻凛捏,然后總結(jié)一下vuejs作者 尤雨溪對(duì)vue3.0最新進(jìn)展的介紹坯癣。

作者一開(kāi)始就提到了vue3.0的新特性

  1. 更快
  2. 更小
  3. 更易于維護(hù)
  4. 更好的多端渲染支持
  5. 新功能

下面就依次舉具體例子介紹:

模板編譯和virtual DOM runtime 性能方面的優(yōu)化

1最欠、思想:編譯時(shí)的優(yōu)化來(lái)減少運(yùn)行時(shí)的開(kāi)銷(xiāo)窒所;如runtime時(shí)diff的靜態(tài)內(nèi)容直接在編譯時(shí)就確定好吵取,這樣每次在virtual DOM diff時(shí)就直接跳過(guò)這一段靜態(tài)內(nèi)容

我們知道vue的性能主要是消耗在virtual DOM diff這塊皮官,作者也明確指出這一塊的優(yōu)化還有很多空間, 所以3.0版本的virtual DOM是完全重構(gòu)的捺氢,在更多的細(xì)節(jié)方面下功夫以致于初始渲染/更新提速達(dá)100%

// 如下面的模板
<template>
  <comp></comp>
  <div>
    <span></span>
  </div>
</template>

// 編譯成渲染函數(shù)

render() {
const Comp = resolveComponent('Comp', this)
return crateFragment([
  createComponetVNode(Comp, null, null, 0 /* no children */),
  createElementVNode('div', null, [
    createElementVNode('span', null, null, 0 /* no children */)
  ], 2 /* single vnode child */)
], 8 /* mutiple non-keyed children */)
}

上面的代碼說(shuō)明了經(jīng)過(guò)渲染函數(shù)生成的代碼里面可以做一些優(yōu)化

  1. 模板里面有組件悠反,也有原生HTML標(biāo)簽斋否,我們可以在編譯時(shí)直接做判斷茵臭,如果它是組件就生成對(duì)應(yīng)的virtual DOM 代碼, 如果它是原生HTML標(biāo)簽就直接生成對(duì)應(yīng)的virtual DOM代碼舅世,這樣就不用每次在運(yùn)行時(shí)去做判斷旦委,這就是所謂的component fast path雏亚。
  2. 同時(shí)在生成的virtual DOM里面的函數(shù)調(diào)用要盡可能的形狀一致缨硝,就是說(shuō)生成的函數(shù)參數(shù)個(gè)數(shù)要一致评凝,這樣就可以讓js引擎去優(yōu)化追葡,這是比較底層的優(yōu)化方法。
  3. 同樣在代碼里面還可以生成一些hint(提示),直接生成一個(gè)數(shù)字告訴它這個(gè)div里面有幾個(gè)節(jié)點(diǎn)宜肉,這樣就省去了很多運(yùn)行時(shí)成本匀钧。

優(yōu)化slots的生成

<Comp>
  <div>{{hello}}</div>
</Comp>

模板編譯后:
render(){
  return h(Comp, null, {
    default: () => [h('div', this.hello)]
  }, 6 /* compiler generated slots */)
}

同樣看上面的代碼,vue2.x版本的slot每次hello更新都要先更新父組件之斯,然后父組件生成新的slot,這就是關(guān)聯(lián)更新,也就是說(shuō)為了更新一個(gè)hello就觸發(fā)了兩個(gè)組件更新酿炸。新的solts生成機(jī)制里面,所有的slot跟scope slot一樣統(tǒng)一生成一個(gè)函數(shù)扁眯,這個(gè)函數(shù)等于可以說(shuō)是一個(gè)lazy的函數(shù),當(dāng)你把函數(shù)傳給子組件的時(shí)候,由子組件來(lái)決定什么時(shí)候調(diào)用者函數(shù)绣版,當(dāng)子組件來(lái)調(diào)用這個(gè)函數(shù)的時(shí)候胶台,就是說(shuō)這個(gè)函數(shù)是子組件的依賴而不是父組件的依賴了,當(dāng)hello變動(dòng)時(shí),子組件調(diào)用這個(gè)函數(shù)杂抽,這樣只有子組件重新渲染概作,這樣的話就把父組件和子組件的依賴徹底分開(kāi)了,這樣在整個(gè)應(yīng)用中就可以得到一個(gè)組件級(jí)別的依賴收集默怨,可以進(jìn)一步避免不必要的重新渲染,不用你像react那樣去操心去手動(dòng)優(yōu)化過(guò)度重繪這個(gè)問(wèn)題骤素。

靜態(tài)內(nèi)容提取

<div class='static'>
  <span>static</span>
</div>

在模板中有許多這種不會(huì)變的靜態(tài)內(nèi)容匙睹,可以在編譯時(shí)直接緩存起來(lái),每次virtual DOM更新時(shí)直接忽略這部分內(nèi)容济竹,也省去了diff的時(shí)間

內(nèi)聯(lián)事件函數(shù)提取

// 2.x的寫(xiě)法會(huì)造成子組件不必要的重渲
<comp @click='count++'></comp>

// 3.0的改進(jìn)點(diǎn)
<comp @clcik='count++'></comp>
import { getBoundMethod } from 'vue'
function __fn1() {
  this.count++
}
render(){
  return h(comp, {
    onEvent: getBoundMethod(__fn1, this)
  })
}

上面的代碼在每次渲染函數(shù)執(zhí)行時(shí)都會(huì)生成一個(gè)新的內(nèi)斂函數(shù)痕檬,而導(dǎo)致子組件的不必要更新,所以送浊,目前在用vuejs2.x版本在寫(xiě)代碼時(shí)盡量綁定具體函數(shù)名而不是用內(nèi)斂的寫(xiě)法梦谜。那么3.0的改進(jìn)點(diǎn)就是把這些內(nèi)斂函數(shù)抽出來(lái)在內(nèi)部維護(hù);所以在3.0你可以放心用內(nèi)斂寫(xiě)法而不用擔(dān)心造成不需要的子組件重渲。

基于Proxy的新數(shù)據(jù)監(jiān)聽(tīng)系統(tǒng)唁桩,全語(yǔ)言特性支持 + 更好的性能

  1. 對(duì)象屬性的增加 / 刪除
  2. 數(shù)組 index / length 更改
  3. Map, Set, WeakMap, WeakSet
  4. classes

我們知道2.x的數(shù)據(jù)監(jiān)聽(tīng)系統(tǒng)是基于Object.defineproperty()這個(gè)方法來(lái)進(jìn)行g(shù)et 闭树、set攔截處理的,新的數(shù)據(jù)監(jiān)聽(tīng)系統(tǒng)將會(huì)用Proxy來(lái)做荒澡。因?yàn)镻roxy自帶lazy特性报辱,不會(huì)一開(kāi)始就把所有定義在data函數(shù)中的數(shù)據(jù)進(jìn)行綁定監(jiān)聽(tīng),它會(huì)‘按需’來(lái)實(shí)現(xiàn)數(shù)據(jù)監(jiān)聽(tīng)单山,當(dāng)你有大量數(shù)據(jù)在初始化時(shí)碍现,性能會(huì)有一個(gè)大大的提升,作者實(shí)測(cè)提升將近一倍米奸。全語(yǔ)言特性支持是指支持?jǐn)?shù)組的index昼接、length的更改也能進(jìn)行監(jiān)聽(tīng)從而進(jìn)行響應(yīng)式數(shù)據(jù)綁定,在2.x的版本中悴晰,我們?cè)赿ata中定義一個(gè)數(shù)組list慢睡,在模板中去v-for遍歷渲染,當(dāng)我們?cè)诓僮鲿r(shí)去更改list[index]的內(nèi)容是不會(huì)被監(jiān)聽(tīng)到的膨疏,更改list.length也不會(huì)被監(jiān)聽(tīng)到一睁,我們需要通過(guò)另外的方法,如Vue.$set(list,index,value)佃却。至于 Map, Set, WeakMap, WeakSet者吁,這些數(shù)據(jù)類(lèi)型在2.0中也沒(méi)有支持,同樣在寫(xiě)vue組件時(shí)我們一般用export default {} 饲帅,以對(duì)象的形式去寫(xiě)的复凳,3.0會(huì)支持class的寫(xiě)法,像react的組件就是class寫(xiě)法灶泵。

所有的這些性能優(yōu)化加起來(lái)就達(dá)到了一個(gè)效果:速度提升一倍育八,內(nèi)存占用減半!

更小

vue的runtime將會(huì)變得更小赦邻,現(xiàn)在2.x也不大髓棋,gzip后20+kb。但是呢惶洲,它還可以變得更邪瓷!怎么做恬吕?沒(méi)錯(cuò)就是:tree-shaking签则。3.0的代碼組織結(jié)構(gòu)更加便于tree-shaking,讓我們沒(méi)有用到的代碼在最后編譯的時(shí)候把它扔掉铐料。如一些內(nèi)置組件transition渐裂,component豺旬,一些指令v-model, v-for, 還有一些內(nèi)置工具函數(shù) asyncCompenet等,這些都可以做成按需引入柒凉!作者介紹在所有這些不相干的代碼去掉之后族阅,gzip之后只有10kb+!!!

更易于維護(hù)

這點(diǎn)其實(shí)說(shuō)針對(duì)vue開(kāi)發(fā)團(tuán)隊(duì)而言的,同樣對(duì)于想要看vue源碼的同學(xué)也是友好的扛拨。首先vue3.0的代碼從flow遷移到typescript上了耘分,用typescript完全重寫(xiě)了。我感覺(jué)未來(lái)用typescript寫(xiě)庫(kù)或者框架是一種趨勢(shì)的感覺(jué)绑警。所以typescript學(xué)起來(lái)啊求泰,老鐵們。當(dāng)然這對(duì)于用戶代碼沒(méi)有任何影響计盒,你以前用es6寫(xiě)vue渴频,也可以繼續(xù)用,只不過(guò)對(duì)typescript寫(xiě)vue項(xiàng)目的同學(xué)更加友好了北启。代碼重構(gòu)提現(xiàn)在以下幾點(diǎn):

  1. 內(nèi)部模塊解耦
  2. 編譯器重構(gòu)卜朗,插件化設(shè)計(jì)

更好的多端渲染支持

目前國(guó)內(nèi)的小程序一大堆,這確實(shí)給開(kāi)發(fā)者帶來(lái)很大的不必要學(xué)習(xí)成本咕村,微信搞一個(gè)场钉,支付寶搞一個(gè),然后你百度又來(lái)一個(gè)快應(yīng)用啥的懈涛。vue3.0將會(huì)提供一個(gè)custom render API: createRender逛万。 createRender函數(shù)更好的支持開(kāi)發(fā)者去用vue語(yǔ)法去寫(xiě)支持多端的代碼,讓你learn once, write more批钠!

其他

  1. 更好的錯(cuò)誤堆棧信息提示
  2. vue hooks 大概率取代mixins
  3. time slicing support,把js代碼切成一塊塊去執(zhí)行宇植,避免大規(guī)模計(jì)算導(dǎo)致瀏覽器長(zhǎng)時(shí)間處于block狀態(tài)。這是一個(gè)非常好的優(yōu)化埋心,類(lèi)似于節(jié)流的概念指郁,每一幀只做16-17ms的事情。
  4. ie支持拷呆,會(huì)有一個(gè)專(zhuān)門(mén)的版本自動(dòng)降級(jí)為用Object.defineproperty()的get 闲坎、set攔截處理的數(shù)據(jù),并對(duì)一些新的ie不支持的用法做出警告茬斧。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末箫柳,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子啥供,更是在濱河造成了極大的恐慌,老刑警劉巖库糠,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伙狐,死亡現(xiàn)場(chǎng)離奇詭異涮毫,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)贷屎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)罢防,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人唉侄,你說(shuō)我怎么就攤上這事咒吐。” “怎么了属划?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵恬叹,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我同眯,道長(zhǎng)绽昼,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任须蜗,我火速辦了婚禮硅确,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘明肮。我一直安慰自己菱农,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布柿估。 她就那樣靜靜地躺著循未,像睡著了一般。 火紅的嫁衣襯著肌膚如雪官份。 梳的紋絲不亂的頭發(fā)上只厘,一...
    開(kāi)封第一講書(shū)人閱讀 51,604評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音舅巷,去河邊找鬼羔味。 笑死,一個(gè)胖子當(dāng)著我的面吹牛钠右,可吹牛的內(nèi)容都是我干的赋元。 我是一名探鬼主播,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼飒房,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼搁凸!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起狠毯,我...
    開(kāi)封第一講書(shū)人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤护糖,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后嚼松,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體嫡良,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡锰扶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了寝受。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坷牛。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖很澄,靈堂內(nèi)的尸體忽然破棺而出京闰,到底是詐尸還是另有隱情,我是刑警寧澤甩苛,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布蹂楣,位于F島的核電站,受9級(jí)特大地震影響浪藻,放射性物質(zhì)發(fā)生泄漏捐迫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一爱葵、第九天 我趴在偏房一處隱蔽的房頂上張望施戴。 院中可真熱鬧,春花似錦萌丈、人聲如沸赞哗。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)肪笋。三九已至,卻和暖如春度迂,著一層夾襖步出監(jiān)牢的瞬間藤乙,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工惭墓, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留坛梁,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓腊凶,卻偏偏與公主長(zhǎng)得像划咐,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子钧萍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 前幾天想學(xué)學(xué)Vue中怎么編寫(xiě)可復(fù)用的組件褐缠,提到要對(duì)Vue的render函數(shù)有所了解》缡荩可仔細(xì)一想队魏,對(duì)于Vue的ren...
    kangaroo_v閱讀 116,063評(píng)論 13 171
  • 幾個(gè)重要的概念:需求的價(jià)格彈性:需求變化的百分比除以價(jià)格變化的百分比;機(jī)會(huì)成本:是指決策過(guò)程中面臨多項(xiàng)選擇万搔,當(dāng)中被...
    organnn閱讀 223評(píng)論 0 1
  • 大家好胡桨,我是易效能的陶婭俐载,也是孩子們口中的丫丫老師。上期節(jié)目里呢登失,我跟大家分析了孩子拖拉磨蹭背后的原因,從...
    開(kāi)心0601閱讀 264評(píng)論 0 0
  • 《花開(kāi)的聲音》 作者:黑潭白龍朗誦:月兒彎彎 光陰宛若須眉男子 總青睞如花的容顏 停不下追逐的腳步 花蕊仿佛癡情的...
    堅(jiān)子polaris閱讀 238評(píng)論 2 7
  • (五)最簡(jiǎn)單的springMVC后臺(tái)程序 這一小節(jié)挖炬,我們會(huì)搭建一個(gè)最簡(jiǎn)單的springMVC后臺(tái)服務(wù)程序揽浙,初步了解...
    Mark_Du閱讀 5,302評(píng)論 3 3