欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Vue3的效率提升主要表現(xiàn)在哪些方面示例解析

 更新時間:2023年12月06日 10:56:26   作者:俊剛  
Vue3帶來了許多性能優(yōu)化和效率提升的特性,本文將重點(diǎn)討論Vue3在靜態(tài)提升、預(yù)字符串化、緩存事件處理函數(shù)、Block?Tree和PatchFlag方面的改進(jìn),我們將通過對比Vue2和Vue3的編譯結(jié)果來說明這些方面的效率提升

靜態(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)

    這篇文章主要介紹了vue element upload組件 file-list的動態(tài)綁定實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Vue組件間數(shù)據(jù)傳遞的方式(3種)

    Vue組件間數(shù)據(jù)傳遞的方式(3種)

    這篇文章主要介紹了Vue組件間數(shù)據(jù)傳遞的方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • vue 中 element-ui table合并上下兩行相同數(shù)據(jù)單元格

    vue 中 element-ui table合并上下兩行相同數(shù)據(jù)單元格

    這篇文章主要介紹了vue 中 element-ui table合并上下兩行相同數(shù)據(jù)單元格,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-12-12
  • vue設(shè)置一開始進(jìn)入的頁面教程

    vue設(shè)置一開始進(jìn)入的頁面教程

    今天小編就為大家分享一篇vue設(shè)置一開始進(jìn)入的頁面教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-10-10
  • vue如何通過props方式在子組件中獲取相應(yīng)的對象

    vue如何通過props方式在子組件中獲取相應(yīng)的對象

    這篇文章主要介紹了vue如何通過props方式在子組件中獲取相應(yīng)的對象,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • 詳解如何在Vue項(xiàng)目中發(fā)送jsonp請求

    詳解如何在Vue項(xiàng)目中發(fā)送jsonp請求

    這篇文章主要介紹了詳解如何在Vue項(xiàng)目中發(fā)送jsonp請求,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Vue項(xiàng)目開發(fā)常見問題和解決方案總結(jié)

    Vue項(xiàng)目開發(fā)常見問題和解決方案總結(jié)

    這篇文章主要介紹了Vue項(xiàng)目開發(fā)常見問題和解決方案總結(jié),幫助大家更好的利用vue開發(fā),感興趣的朋友可以了解下
    2020-09-09
  • vue?element-plus圖片預(yù)覽實(shí)現(xiàn)方法

    vue?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如何動態(tài)實(shí)時的顯示時間淺析

    vue如何動態(tài)實(shí)時的顯示時間淺析

    這篇文章主要給大家介紹了關(guān)于vue如何動態(tài)實(shí)時的顯示時間,以及vue時間戳 獲取本地時間實(shí)時更新的相關(guān)資料,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • 在vue和element-ui的table中實(shí)現(xiàn)分頁復(fù)選功能

    在vue和element-ui的table中實(shí)現(xiàn)分頁復(fù)選功能

    這篇文章主要介紹了在vue和element-ui的table中實(shí)現(xiàn)分頁復(fù)選功能,本文代碼結(jié)合圖文的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-12-12

最新評論