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

Vue3為什么這么快

 更新時間:2020年09月23日 10:51:37   作者:一條小咸咸魚  
這篇文章主要介紹了Vue3為什么這么快,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

總所周知,程序員追求的就是一個字:快!(當然不是什么都追求快的,有些事情快起來是不行滴)

昨天Vue3.0正式發(fā)布了,激動的心,顫抖的手,摸了摸我的頭發(fā),嗯~還好。

據(jù)說Vue3.0相比Vue2.x在性能上提升了1.2~2倍,為啥他就這么快呢?

vue3.0做了以下事情

  • diff算法優(yōu)化
  • 靜態(tài)提升(hoistStatic)
  • 事件偵聽器緩存(cacheHandlers)
  • SSR優(yōu)化(看心情更新)

diff算法優(yōu)化

Vue2.x的diff算法

vue2.x的diff算法叫做全量比較,顧名思義,就是當數(shù)據(jù)改變的時候,會從頭到尾的進行vDom對比,即使有些內(nèi)容是永恒固定不變的。

Vue3.0的diff算法

vue3.0的diff算法有個叫靜態(tài)標記(PatchFlag)的小玩意,啥是靜態(tài)標記呢?
簡單點說,就是如果你的內(nèi)容會變,我會給你一個flag,下次數(shù)據(jù)更新的時候我直接來對比你,我就不對比那些沒有標記的了

export function render(_ctx, _cache, $props, $setup, $data, $options) {
 return (_openBlock(), _createBlock("div", null, [
  _createVNode("p", null, "'HelloWorld'"),
  _createVNode("p", null, _toDisplayString(_ctx.msg), 1 /* TEXT */)
                        //上面這個1就是靜態(tài)標記
 ]))
}

那么肯定有人又會問了,為啥是個1呢?

TEXT = 1 // 動態(tài)文本節(jié)點
CLASS=1<<1,1 // 2//動態(tài)class
STYLE=1<<2,// 4 //動態(tài)style
PROPS=1<<3,// 8 //動態(tài)屬性,但不包含類名和樣式
FULLPR0PS=1<<4,// 16 //具有動態(tài)key屬性,當key改變時,需要進行完整的diff比較。
HYDRATE_ EVENTS = 1 << 5,// 32 //帶有監(jiān)聽事件的節(jié)點
STABLE FRAGMENT = 1 << 6, // 64 //一個不會改變子節(jié)點順序的fragment
KEYED_ FRAGMENT = 1 << 7, // 128 //帶有key屬性的fragment 或部分子字節(jié)有key
UNKEYED FRAGMENT = 1<< 8, // 256 //子節(jié)點沒有key 的fragment
NEED PATCH = 1 << 9, // 512 //一個節(jié)點只會進行非props比較
DYNAMIC_SLOTS = 1 << 10 // 1024 // 動態(tài)slot
HOISTED = -1 // 靜態(tài)節(jié)點
// 指示在diff算法中退出優(yōu)化模式
BALL = -2

靜態(tài)提升(hoistStatic)

Vue2.x中無論元素是否參與更新,每次都會重新創(chuàng)建然后渲染
Vue3.0中對不參與更新的元素,會做靜態(tài)提升,只會被創(chuàng)建一次,在渲染時直接復(fù)用即可
還是這段熟悉的代碼,開啟靜態(tài)提升前 

export function render(_ctx, _cache, $props, $setup, $data, $options) {
 return (_openBlock(), _createBlock("div", null, [
  _createVNode("p", null, "'HelloWorld'"),
  _createVNode("p", null, "'HelloWorld'"),
  _createVNode("p", null, _toDisplayString(_ctx.msg), 1 /* TEXT */)
 ]))
}

開啟靜態(tài)提升后編譯結(jié)果 

const _hoisted_1 = /*#__PURE__*/_createVNode("p", null, "'HelloWorld'", -1 /* HOISTED */)
const _hoisted_2 = /*#__PURE__*/_createVNode("p", null, "'HelloWorld'", -1 /* HOISTED */)

export function render(_ctx, _cache, $props, $setup, $data, $options) {
 return (_openBlock(), _createBlock("div", null, [
  _hoisted_1,
  _hoisted_2,
  _createVNode("p", null, _toDisplayString(_ctx.msg), 1 /* TEXT */)
 ]))
}

可以看到開啟了靜態(tài)提升后,直接將那兩個內(nèi)容為helloworld的p標簽聲明在外面了,直接就拿來用了,這么搞的話那肯定會快啊 

事件偵聽器緩存

默認情況下onClick會被視為動態(tài)綁定,所以每次都會去追蹤它的變化
但是因為是同一個函數(shù),所以沒有追蹤變化,直接緩存起來復(fù)用即可
dom結(jié)構(gòu)

<div>
 <button @click = 'onClick'>點我</button>
</div>

開啟事件偵聽器緩存之前: 

export const render = /*#__PURE__*/_withId(function render(_ctx, _cache, $props, $setup, $data, $options) {
 return (_openBlock(), _createBlock("div", null, [
  _createVNode("button", { onClick: _ctx.onClick }, "點我", 8 /* PROPS */, ["onClick"])
                       // PROPS=1<<3,// 8 //動態(tài)屬性,但不包含類名和樣式
 ]))
})

這里有一個8,表示著這個節(jié)點有了靜態(tài)標記,有靜態(tài)標記就會進行diff算法對比差異,所以會浪費時間

開啟事件偵聽器緩存之后: 

export function render(_ctx, _cache, $props, $setup, $data, $options) {
 return (_openBlock(), _createBlock("div", null, [
  _createVNode("button", {
   onClick: _cache[1] || (_cache[1] = (...args) => (_ctx.onClick(...args)))
  }, "點我")
 ]))
}

可以發(fā)現(xiàn),開啟事件偵聽器緩存后,沒有靜態(tài)標記了,這就快了好多嘛

到此這篇關(guān)于Vue3為什么這么快的文章就介紹到這了,更多相關(guān)Vue3 快內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Vue-cli 創(chuàng)建的項目如何跨域請求

    詳解Vue-cli 創(chuàng)建的項目如何跨域請求

    本篇文章主要介紹了詳解Vue-cli 創(chuàng)建的項目如何跨域請求 ,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • vue中transition組件在項目中運用小結(jié)

    vue中transition組件在項目中運用小結(jié)

    這篇文章主要介紹了vue中transition組件在項目中運用,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • vue spa應(yīng)用中的路由緩存問題與解決方案

    vue spa應(yīng)用中的路由緩存問題與解決方案

    這篇文章主要介紹了vue spa應(yīng)用中的路由緩存問題與解決方案,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • vue.js實現(xiàn)的綁定class操作示例

    vue.js實現(xiàn)的綁定class操作示例

    這篇文章主要介紹了vue.js實現(xiàn)的綁定class操作,結(jié)合實例形式分析了vue.js綁定class常見的3種操作技巧,需要的朋友可以參考下
    2018-07-07
  • Vue.js中自定義Markdown插件實現(xiàn)References解析(推薦)

    Vue.js中自定義Markdown插件實現(xiàn)References解析(推薦)

    本文主要寫的是,如何編寫一個插件來解析<references>標簽,并將其轉(zhuǎn)換為HTML,這種方法可以應(yīng)用于其他自定義標簽和功能,為Vue.js應(yīng)用程序中的Markdown渲染提供了極大的靈活性,感興趣的朋友跟隨小編一起看看吧
    2024-07-07
  • vue3中處理不同數(shù)據(jù)結(jié)構(gòu)JSON的實現(xiàn)

    vue3中處理不同數(shù)據(jù)結(jié)構(gòu)JSON的實現(xiàn)

    本文主要介紹了vue3中處理不同數(shù)據(jù)結(jié)構(gòu)JSON的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • elementui?Select選擇器嵌套tree實現(xiàn)TreeSelect方式

    elementui?Select選擇器嵌套tree實現(xiàn)TreeSelect方式

    這篇文章主要介紹了elementui?Select選擇器嵌套tree實現(xiàn)TreeSelect方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • VUE在線調(diào)用阿里Iconfont圖標庫的方法

    VUE在線調(diào)用阿里Iconfont圖標庫的方法

    這篇文章主要介紹了VUE在線調(diào)用阿里Iconfont圖標庫的方法,內(nèi)容是圍繞VUE前端和阿里Iconfont圖標庫展開的,經(jīng)歷了從網(wǎng)站上東拼西湊圖標的時代,大概是15~16年左右我開始解除阿里Iconfont圖標庫,剛開始就只會下載圖標使用,需要的朋友可以參考下
    2021-10-10
  • vuex存儲token示例

    vuex存儲token示例

    今天小編就為大家分享一篇vuex存儲token示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • $router.push()中通過path跳轉(zhuǎn)和通過name跳轉(zhuǎn)區(qū)別解析

    $router.push()中通過path跳轉(zhuǎn)和通過name跳轉(zhuǎn)區(qū)別解析

    今天在路由跳轉(zhuǎn)傳參時發(fā)現(xiàn)params傳參接收到的總是為空,才發(fā)現(xiàn)通過path和name傳參是有區(qū)別的,這篇文章主要介紹了$router.push()中通過path跳轉(zhuǎn)和通過name跳轉(zhuǎn)有什么區(qū)別,需要的朋友可以參考下
    2023-11-11

最新評論