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

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

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

靜態(tài)提升

  • 在Vue2中,每次渲染時(shí)都會(huì)重新創(chuàng)建VNode節(jié)點(diǎn),即使是靜態(tài)節(jié)點(diǎn)也會(huì)被重新創(chuàng)建。這會(huì)導(dǎo)致一些不必要的性能損耗。
  • 而在Vue3中,引入了靜態(tài)提升的概念,它會(huì)將靜態(tài)節(jié)點(diǎn)在編譯階段提升為常量,避免了重復(fù)創(chuàng)建的開銷。

對(duì)于下面的這些情況靜態(tài)節(jié)點(diǎn)會(huì)被提升

  • 元素節(jié)點(diǎn)
  • 沒有綁定動(dòng)態(tài)內(nèi)容

下面是一個(gè)Vue2和Vue3的編譯結(jié)果對(duì)比示例:

// 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 即可
}

通過(guò)將靜態(tài)節(jié)點(diǎn)提升為常量,Vue3避免了在每次渲染時(shí)重新創(chuàng)建靜態(tài)節(jié)點(diǎn)的開銷,從而提高了渲染性能。

預(yù)字符串化

預(yù)字符串化(Pre-stringification)是一種優(yōu)化技術(shù),用于處理大量靜態(tài)內(nèi)容。它可以將靜態(tài)內(nèi)容在編譯時(shí)轉(zhuǎn)換為字符串,以減少運(yùn)行時(shí)的計(jì)算和處理。

下面是一個(gè)示例,展示了如何使用預(yù)字符串化來(lái)優(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ù),不會(huì)在運(yùn)行時(shí)發(fā)生變化。在編譯時(shí),Vue 3會(huì)將這些靜態(tài)內(nèi)容轉(zhuǎn)換為字符串,以減少運(yùn)行時(shí)的計(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> 這些變量,它們存儲(chǔ)了靜態(tài)內(nèi)容的字符串化結(jié)果。這樣,在運(yùn)行時(shí)只需要直接使用這些變量,而不需要進(jìn)行額外的計(jì)算和處理。

通過(guò)預(yù)字符串化,Vue 3可以在編譯階段優(yōu)化靜態(tài)內(nèi)容,提高應(yīng)用的性能和效率。

緩存事件處理函數(shù)

在Vue2中,每次渲染時(shí)都會(huì)重新創(chuàng)建事件處理函數(shù),即使是相同的事件處理邏輯。這會(huì)導(dǎo)致一些不必要的性能損耗。而在Vue3中,引入了緩存事件處理函數(shù)的概念,它會(huì)將事件處理函數(shù)在編譯階段緩存起來(lái),避免了重復(fù)創(chuàng)建的開銷。

下面是一個(gè)Vue2和Vue3的編譯結(jié)果對(duì)比示例:

<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++))
  })
}

通過(guò)緩存事件處理函數(shù),Vue3避免了在每次渲染時(shí)重新創(chuàng)建事件處理函數(shù)的開銷,從而提高了渲染性能。

Block Tree

在Vue2中,模板中的條件渲染和循環(huán)渲染會(huì)導(dǎo)致大量的VNode節(jié)點(diǎn)創(chuàng)建和銷毀,這會(huì)影響渲染性能。而在Vue3中,引入了Block Tree的概念,它會(huì)將條件渲染和循環(huán)渲染的內(nèi)容封裝為一個(gè)單獨(dú)的Block,避免了大量的VNode節(jié)點(diǎn)創(chuàng)建和銷毀。

下面是一個(gè)Vue2和Vue3的編譯結(jié)果對(duì)比示例:

// 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)
}

通過(guò)使用Block Tree,Vue3將條件渲染和循環(huán)渲染的內(nèi)容封裝為一個(gè)單獨(dú)的Block,避免了大量的VNode節(jié)點(diǎn)創(chuàng)建和銷毀,從而提高了渲染性能。

另外> 在Vue2中,模板編譯后會(huì)生成一個(gè)單一的渲染函數(shù),該函數(shù)負(fù)責(zé)處理整個(gè)模板的渲染邏輯。這意味著每次更新時(shí),整個(gè)模板都會(huì)重新渲染,即使其中只有一小部分內(nèi)容發(fā)生了變化。

而在Vue3中,編譯后的模板會(huì)被拆分成多個(gè)塊(blocks),每個(gè)塊對(duì)應(yīng)一個(gè)節(jié)點(diǎn)或一組節(jié)點(diǎn)。這些塊可以被獨(dú)立地更新和渲染,從而避免了不必要的渲染操作。

下面是一個(gè)示例,展示了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>來(lái)創(chuàng)建塊和節(jié)點(diǎn)。這些塊和節(jié)點(diǎn)可以被緩存起來(lái),只有在需要更新時(shí)才會(huì)重新渲染。Vue3能夠更精確地追蹤和更新變化的部分,從而提高了渲染性能。當(dāng)組件的狀態(tài)發(fā)生變化時(shí),只有受影響的塊和節(jié)點(diǎn)會(huì)被重新渲染,而不是整個(gè)模板。

總結(jié)起來(lái),Vue3的Block Tree在編譯結(jié)果上與Vue2有所不同,它通過(guò)拆分模板為多個(gè)塊和節(jié)點(diǎn),實(shí)現(xiàn)了更細(xì)粒度的渲染更新,從而提升了性能和效率。

PatchFlag

在Vue2中,每次渲染時(shí)都會(huì)對(duì)整個(gè)VNode進(jìn)行比較和更新,即使只有部分內(nèi)容發(fā)生了變化。這會(huì)導(dǎo)致一些不必要的性能損耗。而在Vue3中,引入了PatchFlag的概念,它會(huì)標(biāo)記VNode中哪些部分發(fā)生了變化,從而只對(duì)變化的部分進(jìn)行比較和更新。

下面是一個(gè)Vue2和Vue3的編譯結(jié)果對(duì)比示例:

// 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)
}

通過(guò)使用PatchFlag,Vue3可以標(biāo)記VNode中哪些部分發(fā)生了變化,從而只對(duì)變化的部分進(jìn)行比較和更新,避免了不必要的性能損耗。

總結(jié)

Vue3在靜態(tài)提升、預(yù)字符串化、緩存事件處理函數(shù)、Block Tree和PatchFlag等方面都進(jìn)行了優(yōu)化,從而提高了渲染性能。通過(guò)將靜態(tài)節(jié)點(diǎn)提升為常量、預(yù)字符串化動(dòng)態(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效率提升的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • vue element upload組件 file-list的動(dòng)態(tài)綁定實(shí)現(xiàn)

    vue element upload組件 file-list的動(dòng)態(tài)綁定實(shí)現(xiàn)

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

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

    這篇文章主要介紹了Vue組件間數(shù)據(jù)傳遞的方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(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ù)單元格,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-12-12
  • vue設(shè)置一開始進(jìn)入的頁(yè)面教程

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

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

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

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

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

    這篇文章主要介紹了詳解如何在Vue項(xiàng)目中發(fā)送jsonp請(qǐng)求,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(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ù)覽的場(chǎng)景,也是踩了一些坑,在這里總結(jié)一下,需要的朋友可以參考下
    2023-07-07
  • vue如何動(dòng)態(tài)實(shí)時(shí)的顯示時(shí)間淺析

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

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

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

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

最新評(píng)論