Vue3的效率提升主要表現(xiàn)在哪些方面示例解析
靜態(tài)提升
- 在Vue2中,每次渲染時都會重新創(chuàng)建VNode節(jié)點(diǎn),即使是靜態(tài)節(jié)點(diǎn)也會被重新創(chuàng)建。這會導(dǎo)致一些不必要的性能損耗。
- 而在Vue3中,引入了靜態(tài)提升的概念,它會將靜態(tài)節(jié)點(diǎn)在編譯階段提升為常量,避免了重復(fù)創(chuàng)建的開銷。
對于下面的這些情況靜態(tài)節(jié)點(diǎn)會被提升
- 元素節(jié)點(diǎn)
- 沒有綁定動態(tài)內(nèi)容
下面是一個Vue2和Vue3的編譯結(jié)果對比示例:
// Vue2的靜態(tài)節(jié)點(diǎn) render(){ return createVNode("h1", null, "Hello World") // ... } // Vue3的靜態(tài)節(jié)點(diǎn) const hoisted = createVNode("h1", null, "Hello World") function render(){ // 直接使用 hoisted 即可 }
通過將靜態(tài)節(jié)點(diǎn)提升為常量,Vue3避免了在每次渲染時重新創(chuàng)建靜態(tài)節(jié)點(diǎn)的開銷,從而提高了渲染性能。
預(yù)字符串化
預(yù)字符串化(Pre-stringification)是一種優(yōu)化技術(shù),用于處理大量靜態(tài)內(nèi)容。它可以將靜態(tài)內(nèi)容在編譯時轉(zhuǎn)換為字符串,以減少運(yùn)行時的計(jì)算和處理。
下面是一個示例,展示了如何使用預(yù)字符串化來優(yōu)化Vue 3的編譯結(jié)果:
<template> <div> <h1>{{ title }}</h1> <ul> <li v-for="item in items" :key="item.id"> {{ item.name }} </li> </ul> </div> </template> <script> export default { data() { return { title: '靜態(tài)標(biāo)題', items: [ { id: 1, name: '靜態(tài)項(xiàng)1' }, { id: 2, name: '靜態(tài)項(xiàng)2' }, { id: 3, name: '靜態(tài)項(xiàng)3' } ] }; } }; </script>
在上面的示例中,title> 和 items> 是靜態(tài)數(shù)據(jù),不會在運(yùn)行時發(fā)生變化。在編譯時,Vue 3會將這些靜態(tài)內(nèi)容轉(zhuǎn)換為字符串,以減少運(yùn)行時的計(jì)算和處理。
預(yù)字符串化的結(jié)果如下所示:
const _hoisted_1 = { class: "title" }; const _hoisted_2 = { class: "item" }; return (_ctx) => { return ( _openBlock(), _createBlock("div", null, [ _createVNode("h1", _hoisted_1, _toDisplayString(_ctx.title), 1 /* TEXT */), _createVNode("ul", null, [ (_openBlock(true), _createBlock(_Fragment, null, _renderList(_ctx.items, (item) => { return (_openBlock(), _createBlock("li", _hoisted_2, _toDisplayString(item.name), 1 /* TEXT */)); }), 256 /* UNKEYED_FRAGMENT */)) ]) ]) ); };
在編譯結(jié)果中,我們可以看到 _hoisted_1> 和 _hoisted_2> 這些變量,它們存儲了靜態(tài)內(nèi)容的字符串化結(jié)果。這樣,在運(yùn)行時只需要直接使用這些變量,而不需要進(jìn)行額外的計(jì)算和處理。
通過預(yù)字符串化,Vue 3可以在編譯階段優(yōu)化靜態(tài)內(nèi)容,提高應(yīng)用的性能和效率。
緩存事件處理函數(shù)
在Vue2中,每次渲染時都會重新創(chuàng)建事件處理函數(shù),即使是相同的事件處理邏輯。這會導(dǎo)致一些不必要的性能損耗。而在Vue3中,引入了緩存事件處理函數(shù)的概念,它會將事件處理函數(shù)在編譯階段緩存起來,避免了重復(fù)創(chuàng)建的開銷。
下面是一個Vue2和Vue3的編譯結(jié)果對比示例:
<button @click="count++">plus</button>
// vue2 render(ctx){ return createVNode("button", { onClick: function($event){ ctx.count++; } }) } // vue3 render(ctx, _cache){ return createVNode("button", { onClick: cache[0] || (cache[0] = ($event) => (ctx.count++)) }) }
通過緩存事件處理函數(shù),Vue3避免了在每次渲染時重新創(chuàng)建事件處理函數(shù)的開銷,從而提高了渲染性能。
Block Tree
在Vue2中,模板中的條件渲染和循環(huán)渲染會導(dǎo)致大量的VNode節(jié)點(diǎn)創(chuàng)建和銷毀,這會影響渲染性能。而在Vue3中,引入了Block Tree的概念,它會將條件渲染和循環(huán)渲染的內(nèi)容封裝為一個單獨(dú)的Block,避免了大量的VNode節(jié)點(diǎn)創(chuàng)建和銷毀。
下面是一個Vue2和Vue3的編譯結(jié)果對比示例:
// Vue2的條件渲染 render(){ return this.show ? createVNode("h1", null, "Hello World") : null // ... } // Vue3的Block Tree const _block_1 = this.show ? (openBlock(), createBlock("h1", null, "Hello World")) : null function render(){ return (_block_1) }
通過使用Block Tree,Vue3將條件渲染和循環(huán)渲染的內(nèi)容封裝為一個單獨(dú)的Block,避免了大量的VNode節(jié)點(diǎn)創(chuàng)建和銷毀,從而提高了渲染性能。
另外> 在Vue2中,模板編譯后會生成一個單一的渲染函數(shù),該函數(shù)負(fù)責(zé)處理整個模板的渲染邏輯。這意味著每次更新時,整個模板都會重新渲染,即使其中只有一小部分內(nèi)容發(fā)生了變化。
而在Vue3中,編譯后的模板會被拆分成多個塊(blocks),每個塊對應(yīng)一個節(jié)點(diǎn)或一組節(jié)點(diǎn)。這些塊可以被獨(dú)立地更新和渲染,從而避免了不必要的渲染操作。
下面是一個示例,展示了Vue2和Vue3的編譯結(jié)果的區(qū)別:
// Vue2 function render() { with(this) { return _c('div', { staticClass: "container" }, [ _c('h1', { staticClass: "title" }, [_v("Hello, Vue2!")]), _c('button', { on: { click: handleClick } }, [_v("Click me")]) ]) } } // Vue3 function render(_ctx, _cache) { return (_cache[0] || (_cache[0] = _createBlock("div", { class: "container" }, [ _createVNode("h1", { class: "title" }, "Hello, Vue3!"), _createVNode("button", { onClick: _cache[1] || (_cache[1] = handleClick) }, "Click me") ]))) }
可以看到,Vue3的編譯結(jié)果中使用了_createBlock>和_createVNode>來創(chuàng)建塊和節(jié)點(diǎn)。這些塊和節(jié)點(diǎn)可以被緩存起來,只有在需要更新時才會重新渲染。Vue3能夠更精確地追蹤和更新變化的部分,從而提高了渲染性能。當(dāng)組件的狀態(tài)發(fā)生變化時,只有受影響的塊和節(jié)點(diǎn)會被重新渲染,而不是整個模板。
總結(jié)起來,Vue3的Block Tree在編譯結(jié)果上與Vue2有所不同,它通過拆分模板為多個塊和節(jié)點(diǎn),實(shí)現(xiàn)了更細(xì)粒度的渲染更新,從而提升了性能和效率。
PatchFlag
在Vue2中,每次渲染時都會對整個VNode進(jìn)行比較和更新,即使只有部分內(nèi)容發(fā)生了變化。這會導(dǎo)致一些不必要的性能損耗。而在Vue3中,引入了PatchFlag的概念,它會標(biāo)記VNode中哪些部分發(fā)生了變化,從而只對變化的部分進(jìn)行比較和更新。
下面是一個Vue2和Vue3的編譯結(jié)果對比示例:
// Vue2的渲染 render(){ return createVNode("h1", null, this.message) // ... } // Vue3的PatchFlag const _hoisted_1 = this.message function render(){ return createVNode("h1", null, [_hoisted_1], PatchFlags.TEXT) }
通過使用PatchFlag,Vue3可以標(biāo)記VNode中哪些部分發(fā)生了變化,從而只對變化的部分進(jìn)行比較和更新,避免了不必要的性能損耗。
總結(jié)
Vue3在靜態(tài)提升、預(yù)字符串化、緩存事件處理函數(shù)、Block Tree和PatchFlag等方面都進(jìn)行了優(yōu)化,從而提高了渲染性能。通過將靜態(tài)節(jié)點(diǎn)提升為常量、預(yù)字符串化動態(tài)內(nèi)容、緩存事件處理函數(shù)、使用Block Tree封裝條件渲染和循環(huán)渲染的內(nèi)容,以及使用PatchFlag標(biāo)記變化的部分,Vue3減少了不必要的計(jì)算和比較,從而提升了整體的效率。
以上就是Vue3的效率提升主要表現(xiàn)在哪些方面示例解析的詳細(xì)內(nèi)容,更多關(guān)于Vue3效率提升的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
vue element upload組件 file-list的動態(tài)綁定實(shí)現(xiàn)
這篇文章主要介紹了vue element upload組件 file-list的動態(tài)綁定實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10vue 中 element-ui table合并上下兩行相同數(shù)據(jù)單元格
這篇文章主要介紹了vue 中 element-ui table合并上下兩行相同數(shù)據(jù)單元格,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-12-12vue如何通過props方式在子組件中獲取相應(yīng)的對象
這篇文章主要介紹了vue如何通過props方式在子組件中獲取相應(yīng)的對象,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-04-04詳解如何在Vue項(xiàng)目中發(fā)送jsonp請求
這篇文章主要介紹了詳解如何在Vue項(xiàng)目中發(fā)送jsonp請求,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10Vue項(xiàng)目開發(fā)常見問題和解決方案總結(jié)
這篇文章主要介紹了Vue項(xiàng)目開發(fā)常見問題和解決方案總結(jié),幫助大家更好的利用vue開發(fā),感興趣的朋友可以了解下2020-09-09vue?element-plus圖片預(yù)覽實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于vue?element-plus圖片預(yù)覽實(shí)現(xiàn)的相關(guān)資料,最近的項(xiàng)目中有圖片預(yù)覽的場景,也是踩了一些坑,在這里總結(jié)一下,需要的朋友可以參考下2023-07-07在vue和element-ui的table中實(shí)現(xiàn)分頁復(fù)選功能
這篇文章主要介紹了在vue和element-ui的table中實(shí)現(xiàn)分頁復(fù)選功能,本文代碼結(jié)合圖文的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-12-12