【面試題】888- Vue3.0 高頻出現的幾道面試題



1. Vue 3.0 性能提升主要是通過哪幾方面體現的?

1.響應式系統提升

vue2在初始化的時候,對data中的每個屬性使用definepropery調用getter和setter使之變爲響應式對象。如果屬性值爲對象,還會遞歸調用defineproperty使之變爲響應式對象。

vue3使用proxy對象重寫響應式。proxy的性能本來比defineproperty好,proxy可以攔截屬性的訪問、賦值、刪除等操作,不需要初始化的時候遍歷所有屬性,另外有多層屬性嵌套的話,只有訪問某個屬性的時候,纔會遞歸處理下一級的屬性。

優勢:

  • 可以監聽動態新增的屬性;
  • 可以監聽刪除的屬性 ;
  • 可以監聽數組的索引和 length 屬性;

2. 編譯優化

優化編譯和重寫虛擬dom,讓首次渲染和更新dom性能有更大的提升 vue2 通過標記靜態根節點,優化 diff 算法 vue3 標記和提升所有靜態根節點,diff 的時候只比較動態節點內容

Fragments, 模板裏面不用創建唯一根節點,可以直接放同級標籤和文本內容

靜態提升

patch flag, 跳過靜態節點,直接對比動態節點,緩存事件處理函數

3. 源碼體積的優化

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

2. Composition Api 與 Vue 2.x使用的Options Api 有什麼區別?

Options Api

包含一個描述組件選項(data、methods、props等)的對象 options;

API開發複雜組件,同一個功能邏輯的代碼被拆分到不同選項 ;

使用mixin重用公用代碼,也有問題:命名衝突,數據來源不清晰;

composition Api

vue3 新增的一組 api,它是基於函數的 api,可以更靈活的組織組件的邏輯。

解決options api在大型項目中,options api不好拆分和重用的問題。

3. Proxy 相對於 Object.defineProperty

有哪些優點?

proxy的性能本來比defineproperty好,proxy可以攔截屬性的訪問、賦值、刪除等操作,不需要初始化的時候遍歷所有屬性,另外有多層屬性嵌套的話,只有訪問某個屬性的時候,纔會遞歸處理下一級的屬性。

  • 可以* 監聽數組變化
  • 可以劫持整個對象
  • 操作時不是對原對象操作,是 new Proxy 返回的一個新對象
  • 可以劫持的操作有 13 種

4. Vue 3.0 在編譯方面有哪些優化?

vue.js 3.x中標記和提升所有的靜態節點,diff的時候只需要對比動態節點內容;

Fragments(升級vetur插件):

template中不需要唯一根節點,可以直接放文本或者同級標籤

靜態提升(hoistStatic),當使用 hoistStatic 時,所有靜態的節點都被提升到 render 方法之外.只會在應用啓動的時候被創建一次,之後使用只需要應用提取的靜態節點,隨着每次的渲染被不停的複用。

patch flag, 在動態標籤末尾加上相應的標記,只能帶 patchFlag 的節點才被認爲是動態的元素,會被追蹤屬性的修改,能快速的找到動態節點,而不用逐個逐層遍歷,提高了虛擬dom diff的性能。

緩存事件處理函數cacheHandler,避免每次觸發都要重新生成全新的function去更新之前的函數 tree shaking 通過搖樹優化核心庫體積,減少不必要的代碼量

5.  Vue.js 3.0 響應式系統的實現原理?

1. reactive

設置對象爲響應式對象。接收一個參數,判斷這參數是否是對象。不是對象則直接返回這個參數,不做響應式處理。創建攔截器handerler,設置get/set/deleteproperty。

get

  • 收集依賴(track);
  • 如果當前 key 的值是對象,則爲當前 key 的對
  • 象創建攔截器 handler, 設置 get/set/deleteProperty;

如果當前的 key 的值不是對象,則返回當前 key 的值。

set

設置的新值和老值不相等時,更新爲新值,並觸發更新(trigger)。

deleteProperty 當前對象有這個 key 的時候,刪除這個 key 並觸發更新(trigger)。

2. effect

接收一個函數作爲參數。作用是:訪問響應式對象屬性時去收集依賴

3. track

接收兩個參數:target 和 key

-如果沒有 activeEffect,則說明沒有創建 effect 依賴

-如果有 activeEffect,則去判斷 WeakMap 集合中是否有 target 屬性

-WeakMap 集合中沒有 target 屬性,則 set(target, (depsMap = new Map()))

-WeakMap 集合中有 target 屬性,則判斷 target 屬性的 map 值的 depsMap 中是否有 key 屬性

-depsMap 中沒有 key 屬性,則 set(key, (dep = new Set())) -depsMap 中有 key 屬性,則添加這個 activeEffect

4.trigger

判斷 WeakMap 中是否有 target 屬性,WeakMap 中有 target 屬性,則判斷 target 屬性的 map 值中是否有 key 屬性,有的話循環觸發收集的 effect()。

作者:大唐榮華

blog.csdn.net/weixin_40599109/article/details/110938941


1. JavaScript 重溫系列(22篇全)
2. ECMAScript 重溫系列(10篇全)
3. JavaScript設計模式 重溫系列(9篇全)
4.  正則 / 框架 / 算法等 重溫系列(16篇全)
5.  Webpack4 入門(上) ||  Webpack4 入門(下)
6.  MobX 入門(上)  ||   MobX 入門(下)
7. 100 +篇原創系列彙總

回覆“加羣”與大佬們一起交流學習~

點擊“閱讀原文”查看 100+ 篇原創文章

本文分享自微信公衆號 - 前端自習課(FE-study)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章