Vue3.0的優(yōu)化以及新特性

一捣作、源碼優(yōu)化

1. 更好的代碼管理方式:monorepo

Vue.js 3.0 通過monorepo方式維護(hù)魁袜,根據(jù)功能拆分成packages目錄下不同的子目錄。某些package(比如:reactivity響應(yīng)式庫)可以單獨(dú)依賴這個(gè)庫贝次,而不必依賴整個(gè)Vue.js绳军,減少了引用包的體積大小,二Vue.js2做不到匀奏。

2. 用Typescript重構(gòu)了Vue代碼

Vue.js 1.x ----> javascript
Vue.js 2.x ----> javascript + flow
Vue.js 3.x ----> typescript

二鞭衩、性能優(yōu)化

1. 源碼體積優(yōu)化
  • 移除了一些冷門特性,比如filter娃善、inline-template等
  • 引入tree-shaking技術(shù)论衍,減少打包體積
    tree-shaking原理:依賴ES2015模塊語法靜態(tài)結(jié)構(gòu)(即import 和 export),通過編譯階段的靜態(tài)分析聚磺,找到?jīng)]有引入的模塊并打上標(biāo)記坯台。然后壓縮階段利用uglify-js、terser等壓縮工具真正地刪除這些沒用的代碼瘫寝。
    如果項(xiàng)目中沒有引用Transition蜒蕾、KeepAlive等組件,那么打包就會(huì)移除焕阿,從而減少項(xiàng)目引入Vue.js體積
2. 數(shù)據(jù)劫持優(yōu)化

Vue.js 1.x 和Vue.js 2.x

Object.defineProperty(data, 'a', {
  get() {
    // track
  },
  set() {
    // trigger
  }
})

缺點(diǎn):

  1. 不能監(jiān)測到對(duì)象的添加和刪除咪啡,通過$set、$delete實(shí)例方法實(shí)現(xiàn)
  2. 不能數(shù)組基于下標(biāo)的修改暮屡、對(duì)于 .length 修改的監(jiān)測
    3.不支持 對(duì) Map撤摸、Set、WeakMap 和 WeakSet類型
  3. 潛逃層級(jí)比較深的對(duì)象褒纲,無法判斷到你到底訪問到哪個(gè)層級(jí)准夷,就需要遞歸遍歷對(duì)象,執(zhí)行Object.defineProperty把每一層對(duì)象數(shù)據(jù)都變?yōu)轫憫?yīng)式外厂,性能消耗大
    Vue.js 3.x
observed = new Proxy(data, {
  get(target, key) {
    // 截所有對(duì)源對(duì)象屬性的訪問動(dòng)作
    // track
  },
  set(target, key, value) { // 包括添加和修改
    // 攔截所有對(duì)源對(duì)象屬性的設(shè)置動(dòng)作
    // trigger
  },
  has() {
    // in運(yùn)算符
  },
  apply() {
    // 攔截函數(shù)的調(diào)用冕象、call和apply操作
  },
  deleteProperty() {
    // 刪除屬性
  },
  defineProperty() {
    // 攔截
  },
  construct() {
    // 用于攔截new命令
  },
  getOwnPropertyDescriptor() {
    // 攔截Object.getOwnPropertyDescriptor()
  },
  getPrototypeOf(target) {
    // 攔截獲取對(duì)象原型
    // Object.getPrototypeOf(p)  === proto
  },
  isExtensible() {
    // 攔截Object.isExtensible操作
  },
  ownKeys(target) {
    // 攔截對(duì)象自身屬性的讀取操作
    // 注:有三類屬性會(huì)被 ownKeys方法自動(dòng)過濾:
    // ·目標(biāo)對(duì)象不存在的屬性
    // ·屬性名為Symbol值
    // ·不可遍歷的屬性
    return Reflect.ownKeys(target).fliter(key => key[0] !== '_'); // 注:ownKeys方法返回的數(shù)組成員只能是字符串或 Symbol值.
  },
  preventExtensions() {
    // 攔截Object.preventExtensions()
  },
  setPrototypeOf(){
    // 攔截Object.setPrototypeOf()
  }
})

優(yōu)點(diǎn):

  1. 對(duì)于增加和刪除都能監(jiān)測到
  2. Proxy API不能監(jiān)聽深層次對(duì)象變化,那么Vue.js 3.0處理方式是在getter中去遞歸響應(yīng)式汁蝶,即只能在真正訪問到的內(nèi)部對(duì)象才會(huì)變成響應(yīng)式(惰性監(jiān)測)

三渐扮、編譯優(yōu)化

template compile to render function階段可以借助vue-loader在webpack編譯階段離線完成
那么耗時(shí)更多的patch階段優(yōu)化:通過編譯階段對(duì)靜態(tài)模版的分析论悴,編譯生成Block Tree,只把綁定數(shù)據(jù)的動(dòng)態(tài)節(jié)點(diǎn)加入嵌套區(qū)塊數(shù)據(jù),每個(gè)區(qū)塊以數(shù)組追蹤
*vNode更新性能和動(dòng)態(tài)內(nèi)容的數(shù)據(jù)相關(guān)

四墓律、語法API優(yōu)化: Composition API

1. 優(yōu)化邏輯組織

Vue1.x和Vue2.x編寫組件本質(zhì)為:編譯一個(gè)包含描述組件選項(xiàng)的對(duì)象膀估,稱為:Options API
通常包含:props、methods耻讽、data察纯、computed、watch(都是在initState函數(shù)中被初始化)
Composition API:將某個(gè)邏輯關(guān)注點(diǎn)相關(guān)的代碼全部放在一個(gè)函數(shù)里针肥,這樣修改一個(gè)功能時(shí)饼记,就不需要在文件中跳來跳去

2. 優(yōu)化邏輯復(fù)用

Vue.2.x 中用mixins去復(fù)用邏輯
后續(xù)補(bǔ)充======>

引入RFC(Request For Comments):使每個(gè)版本改動(dòng)可控

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市慰枕,隨后出現(xiàn)的幾起案子具则,更是在濱河造成了極大的恐慌,老刑警劉巖具帮,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件博肋,死亡現(xiàn)場離奇詭異,居然都是意外死亡蜂厅,警方通過查閱死者的電腦和手機(jī)匪凡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掘猿,“玉大人病游,你說我怎么就攤上這事∈踅保” “怎么了礁遵?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長采记。 經(jīng)常有香客問我佣耐,道長,這世上最難降的妖魔是什么唧龄? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任兼砖,我火速辦了婚禮,結(jié)果婚禮上既棺,老公的妹妹穿的比我還像新娘讽挟。我一直安慰自己,他們只是感情好丸冕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布耽梅。 她就那樣靜靜地躺著,像睡著了一般胖烛。 火紅的嫁衣襯著肌膚如雪眼姐。 梳的紋絲不亂的頭發(fā)上诅迷,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音众旗,去河邊找鬼罢杉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛贡歧,可吹牛的內(nèi)容都是我干的滩租。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼利朵,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼律想!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起绍弟,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤蜘欲,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后晌柬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡郭脂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年年碘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片展鸡。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡屿衅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出莹弊,到底是詐尸還是另有隱情涤久,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布忍弛,位于F島的核電站响迂,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏细疚。R本人自食惡果不足惜蔗彤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望疯兼。 院中可真熱鬧然遏,春花似錦、人聲如沸吧彪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽姨裸。三九已至秧倾,卻和暖如春怨酝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背中狂。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國打工凫碌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人胃榕。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓盛险,卻偏偏與公主長得像,于是被迫代替她去往敵國和親勋又。 傳聞我的和親對(duì)象是個(gè)殘疾皇子苦掘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354