vue3 到底哪里好?看這一篇就夠了


之前寫的關於 vue3 的文章,好多人吐槽:這些API每次使用都要引入一遍,感覺有點麻煩。

今天我們就來看看 vue3 相比 vue2 的優點有些啥?

為啥有些人說:自從寫了 ts vue3 再也回不到 vue2 啦!

vue3 到底哪里好?有的人回不到 vue2,而有的人去不了vue3!喜歡的點贊收藏,復盤不迷路!

一、Vue3 新增的幾個亮點:

  • Performance:性能優化
  • Tree-shaking :支持搖樹優化
  • Composition API :組合式api
  • 新增組件:Fragment、Teleport、Supense
  • 更好地支持 ts
  • Custom Render API:自定義渲染器

二、性能方面的提升

在性能方面,vue3 相比 vue2 ,性能提升了 1.3 ~ 2 倍左右。我們就來看看它是在哪些方面,如何提升的?

2.1、響應式性能提升

1> diff方法優化

diff 算法是虛擬 DOM 技術的必然產物,它會對新舊 DOM 進行比較,然后將變化的 DOM 更新在真實的 DOM 上。

在 vue2 中,數據發生變化的時候,會生成一個新的 DOM 樹,然后和之前的 DOM 樹進行比較,找到不同的節點然后更新到真實的 DOM 上,比較的過程中,會對沒有發生改變的 DOM 也都會進行比較,就會消耗一定的時間。

在 vue3 中,在創建虛擬 DOM 的時候,會根據 DOM 中的內容添加一個靜態標記,在數據發生改變的時候,就會帶着靜態標記的節點去對比,能夠快速找到變化的 DOM 。

2> 事件偵聽器緩存

默認情況下onClick會被視為動態綁定,所以每次都會追蹤它的變化

但是因為是同一個函數,所以不用追蹤變化,直接緩存起來復用即可

3> ssr渲染

當存在大量靜態內容時,這些內容會被當做純字符串推進一個 buffer 內,即使存在動態綁定,也會通過模板插值潛入進去,這樣會比虛擬 DOM 渲染快得多。

2.2、代碼體積方面

打包大小減少41%。

vue3 移除了一些不常用的 API,如:inline-template、filter 等,使用 tree-shaking。

Tree Shaking 搖樹優化,指的就是當我們引入一個模塊的時候,不引入這個模塊的所有代碼,只引入我們需要的代碼。

在 vue2 中,很多函數都掛載到全局 Vue 對象上,如:nextTick、set 函數等,雖然我們不常用,但打包時只要引入 Vue 這些全局函數會打包進 bundle 中。而 vue3 中,引入tree-shaking,所有的 API 都通過 ES6 模塊化的方式引入,這樣就能夠讓 webpack 或 rollup 等打包工具在打包時,就會自動對沒有用到的 API 進行剔除,最小化 bundle 體積。

初次渲染快55%, 更新渲染快133%。組件選擇了按需引入,使得打包后的體積也更小了,所以項目運行的時候速度更快,更順暢了!

2.3、編譯被優化

1> 靜態提升

在 vue2 中,無論元素是否參與更新,每次都會重新創建然后再渲染。

vue3 使用靜態提升后,對於不參與更新的元素,只會被創建一次,在渲染時直接復用就好了。

2> Fragment

模板內不用再創建一個唯一根節點,可以直接放同級標簽和內容。就相當於少了一個節點嵌套渲染。

三、選項式 api VS 組合式 api

3.1、vue3 的組合式 api 相對來說,更有利於維護和封裝。

3.2、組合式 api 高內聚,低耦合。

在 vue2 中采用選項式 api ,會在 vue 文件的 data、methods、watch、computed 中定義屬性和方法,共同處理頁面邏輯,多個功能相互交叉,纏繞在一起,代碼過於分散。

而 vue3 新增了組合式 api ,一個功能模塊代碼會集中到一起,實現高內聚,低耦合。提高代碼的可讀性和可維護性,基於函數組合的 api 更好地重用邏輯代碼。

組合式api 與 選項式api 對比如下圖:

每個顏色,都代表着一個功能。

vue3 到底哪里好?看這一篇就夠了

 

3.3、不宜出現 DOM 元素不存在問題。

vue3 中用 setup 函數代替了 vue2 中的 beforeCreate 和 created 。有些同學有時候會在 created 中操作 DOM 元素,有時候報錯了,就在那納悶看不出來問題,為了沒有反應。使用 setup 之后,就不容易出現該問題了。

注意:

vue3 的組合式 api 中的 onUnmounted 代替了 vue2 中的 beforeDestory。

vue3 的組合式 api unmounted 代替了 vue2 中的 destoryed 。

四、proxy 相對 Object.defineProperty 優點有哪些?

proxy 和 Object.defineProperty 都是來實現響應式數據的。

vue3 使用 proxy 來代替 vue2 的 Object.defineProperty 效率更高,值得學習。

1> vue2 利用 Object.defineProperty 來劫持 data 數據的 getter 和 setter 操作,使得 data 在被訪問或賦值時,動態更新綁定的 template 模板。而 Object.defineProperty 必須遍歷所有的預值才能劫持每一個屬性,這一缺點正好能夠被 proxy 解決。

proxy 相比 Object.defineProperty 優點分別為:

  • 代碼的執行效果更快。
  • proxy 可以直接監聽對象而不是它的屬性。
  • proxy 可以直接監聽數組的每個元素的變化。
  • proxy 不需要初始化的時候遍歷所有屬性,如果有多層嵌套的話,只訪問某個屬性的時候,proxy 能夠快速訪問到,而 Object.defineProperty 還需要遍歷所有屬性,然后逐級向下訪問。
  • proxy 返回的是一個新對象,可以直接操作新對象而達到目標。而 Object.defineProperty 操作的是原對象,只能遍歷對象屬性然后對其直接修改。
  • proxy 有 13 種攔截方法,不限於 apply、ownKeys、deleteProperty 等,而 Object.defineporperty 不具備。

2> defineProperty 無法監聽對象新增屬性以及無法跟蹤數組索引以及數組 length 的問題,proxy 正好解決了該問題。

在 vue2 中,我們給對象新增一個屬性時,如果新增屬性的值發生改變的時候,我們發現視圖並沒有更新,因為新增屬性是無法監聽到的。同樣的,通過下標直接改變數組,視圖也是無法更新的,也是因為監聽不到。

在 vue3 中新增 proxy ,解決了這些問題。

五、更好的 ts 支持

vue2 不適合使用 ts,在於它的 Options API 風格。

options 是一個簡單的對象,而 ts 是一種類型系統、面向對象的語法,兩個不匹配。

vue3 新增了 defineComponent 函數,使組件在 ts 下,更好的利用參數類型推斷。如:reactive 和 ref 很具有代表性。

六、更先進的組件

1> Fragment

在 vue2 中,每個模板必須有一個根節點,否則就會報錯。

vue3 中可以不需要根節點,多個元素或標簽可並列存在。

2> Teleport

傳送門。可以把 teleport 中的內容添加到任意的節點內,對於嵌套較深的組件來說絕對是一個福音。

3> Supense

允許程序在等待異步組件渲染一些后備的內容,可以讓我們創建一個平滑的用戶體驗。

總結:

vue 目前是國內最火的前端框架之一,vue3 性能提升、運行速度也比 vue2 好很多。

總之 vue3 就是:

  • 讓項目更快
  • 讓代碼更少
  • 更易於維護
  • 讓我們開發更快,加班更少


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM