Vue 3.0都帶來了哪些變化

請相信,這個世界上來真的有人在過著你想過的生活斟览,愿你我既可以朝九晚五轴猎,又能夠浪跡天涯

微信圖片_20200508000823.jpg

遲到了,遲到了廓脆,距離4月21號尤雨溪在嗶哩嗶哩直播分享vue3.0 beta更新已經(jīng)近一個月的時間筛谚,下面我們來一起看看尤大大究竟嘚吧了些啥。

全新的文檔

image.png

vue3.0 beta發(fā)布之后的所有進度及文檔都將在全新的RFS文檔中可以看到https://github.com/vuejs/rfcs/

六大亮點

image.png
  • performance:性能比vue2.0更強
  • tree-shaking support:可以僅打包真正需要的模塊
  • Composition API: 組合API停忿,這將是一大兩點驾讲,可參考http://www.reibang.com/p/687a393e788a
  • Fragment, Teleport, Suspense:碎片,protal傳送門,懸念
  • Better TypeScript support:更優(yōu)秀的Ts支持吮铭,這一點也是我比較期待的时迫,在這個前端必須掌握TS的時代,這是大勢所趨
  • Custom Renderer API:暴露了自定義渲染API

性能

image.png
  • 重寫了虛擬DOM的實現(xiàn)
  • 編譯模板的優(yōu)化
  • 更高效的組件初始化
  • update性能提升1.3~2倍
  • SSR(http://www.reibang.com/p/b6f288048a72
    )速度提高了2~3倍
    各項性能對比圖
    image.png

編譯模板的優(yōu)化

image.png

注意看第二個_createVNode結尾的“1”:

Vue在運行時會生成number(大于0)值的PatchFlag谓晌,用作標記掠拳。

image.png

僅帶有PatchFlag標記的節(jié)點會被真正追蹤,且無論層級嵌套多深纸肉,它的動態(tài)節(jié)點都直接與Block根節(jié)點綁定溺欧,無需再去遍歷靜態(tài)節(jié)點

image.png
<div>
  <span>static</span>
  <span :id="hello" class="bar">{{ msg }}   </span>
</div>

在vue的編譯中會成為:

import { createVNode as _createVNode, toDisplayString as _toDisplayString, openBlock as _openBlock, createBlock as _createBlock } from "vue"

export function render(_ctx, _cache) {
  return (_openBlock(), _createBlock("div", null, [
    _createVNode("span", null, "static"),
    _createVNode("span", {
      id: _ctx.hello,
      class: "bar"
    }, _toDisplayString(_ctx.msg), 9 /* TEXT, PROPS */, ["id"])
  ]))
}

PatchFlag 變成了9 /* TEXT, PROPS */, ["id"]
它會告知我們不光有TEXT變化,還有PROPS變化(id)
這樣既跳出了virtual dom性能的瓶頸柏肪,又保留了可以手寫render的靈活性姐刁。
等于是:既有react的靈活性,又有基于模板的性能保證烦味。

時間監(jiān)聽緩存: cacheHandlers

image.png
<div>
  <span @click="onClick">
    {{msg}}
  </span>
</div>

關閉cacheHandlers后:

import { toDisplayString as _toDisplayString, createVNode as _createVNode, openBlock as _openBlock, createBlock as _createBlock } from "vue"

export function render(_ctx, _cache) {
  return (_openBlock(), _createBlock("div", null, [
    _createVNode("span", { onClick: _ctx.onClick }, _toDisplayString(_ctx.msg), 9 /* TEXT, PROPS */, ["onClick"])
  ]))
}

onClick會被視為PROPS動態(tài)綁定聂使,后續(xù)替換點擊事件時需要進行更新。
開啟cacheHandlers后:

import { toDisplayString as _toDisplayString, createVNode as _createVNode, openBlock as _openBlock, createBlock as _createBlock } from "vue"

export function render(_ctx, _cache) {
  return (_openBlock(), _createBlock("div", null, [
    _createVNode("span", {
      onClick: _cache[1] || (_cache[1] = $event => (_ctx.onClick($event)))
    }, _toDisplayString(_ctx.msg), 1 /* TEXT */)
  ]))
}

cache[1]谬俄,會自動生成并緩存一個內聯(lián)函數(shù)柏靶,“神奇”的變?yōu)橐粋€靜態(tài)節(jié)點。 Ps:相當于React中useCallback自動化溃论。

PatchFlags枚舉定義

而通過查詢Ts枚舉定義宿礁,我們可以看到分別定義了以下的追蹤標記:

export const enum PatchFlags {
  
  TEXT = 1,// 表示具有動態(tài)textContent的元素
  CLASS = 1 << 1,  // 表示有動態(tài)Class的元素
  STYLE = 1 << 2,  // 表示動態(tài)樣式(靜態(tài)如style="color: red",也會提升至動態(tài))
  PROPS = 1 << 3,  // 表示具有非類/樣式動態(tài)道具的元素蔬芥。
  FULL_PROPS = 1 << 4,  // 表示帶有動態(tài)鍵的道具的元素,與上面三種相斥
  HYDRATE_EVENTS = 1 << 5,  // 表示帶有事件監(jiān)聽器的元素
  STABLE_FRAGMENT = 1 << 6,   // 表示其子順序不變的片段(沒懂)控汉。 
  KEYED_FRAGMENT = 1 << 7, // 表示帶有鍵控或部分鍵控子元素的片段笔诵。
  UNKEYED_FRAGMENT = 1 << 8, // 表示帶有無key綁定的片段
  NEED_PATCH = 1 << 9,   // 表示只需要非屬性補丁的元素,例如ref或hooks
  DYNAMIC_SLOTS = 1 << 10,  // 表示具有動態(tài)插槽的元素
  // 特殊 FLAGS -------------------------------------------------------------
  HOISTED = -1,  // 特殊標志是負整數(shù)表示永遠不會用作diff,只需檢查 patchFlag === FLAG.
  BAIL = -2 // 一個特殊的標志姑子,指代差異算法(沒懂)
}

Tree shaking support

image.png
  • 可以將無用的模塊干掉(比如v-model,<transition>乎婿,用不到就不會打包)
  • 一個簡單的一個簡單“HelloWorld”大小僅為:13.5kb
    -- 11.75kb,僅Composition API街佑。
  • 包含運行時完整功能:22.5kb
    -- 擁有更多的功能谢翎,卻比Vue 2更迷你。
    很多時候沐旨,我們并不需要 vue提供的所有功能森逮,在 vue 2 并沒有方式排除掉,但是 3.0 都可能做成了按需引入磁携。

Composition API

image.png
  • 可與現(xiàn)有的Options API一起使用
  • 靈活的邏輯組合與復用
  • vue3.0的響應式模塊可以和其他框架搭配使用

混入(mixin) 將不再作為推薦使用褒侧, Composition API可以實現(xiàn)更靈活且無副作用的復用代碼
官網(wǎng)https://composition-api.vuejs.org/#summary

fragment

image.png

fragment翻譯為: “碎片”

  • 不再限于模板中的單個根節(jié)點(之前的vue文件是必須有一個根節(jié)點)
  • render函數(shù)也可以返回數(shù)組,類似實現(xiàn)了React.Fragments 的功能
  • just works,一句話闷供,就干正事

teleport

image.png

但因為Chrome有個提案疑俭,會增加一個名為Portal的原生element,為避免命名沖突婿失,改為Teleport

<Suspense>

image.png
  • 可在嵌套層級中等待嵌套的異步依賴項
  • 支持async setup()
  • 支持異步組件

更好的typeScript支持

image.png
  • vue3.0是用typescript編寫的庫钞艇,可以享受自動的類型定義提示
  • JavaScript和typescript中的API相同
    -- 事實上,代碼也是幾乎相同的
  • 支持TSX
  • 仍然支持class組件(http://www.reibang.com/p/b8f031875829
    )移怯,但是需要引用vue-class-component@next香璃,該模塊仍在alpha階段
    還有Vue 3 + TypeScript 插件正在開發(fā),有類型檢查舟误,自動補全等功能葡秒。目前進展可喜。(這是我對vue3最大的期待)

Custom Renderer API: 自定義渲染器API

image.png
  • 正在進行NativeScript Vue集成
  • 用戶可以嘗試WebGL自定義渲染器嵌溢,與普通Vue應用一起使用
    意味著以后可以通過 vue眯牧, Dom 編程的方式來進行 webgl 編程 。感興趣可以看這里:Getting started vugel

剩余工作

image.png

Docs & Migration Tools/Guides

image.png
  • 新的文檔編寫交由@NataliaTepluhina, @sdras, @bencodezen & @phanan 負責
  • @sdras 正在做自動升級遷移工具
  • @sodatea 已經(jīng)開始研究CodeMods

Router

image.png
  • 下一代 Router:vue-router@next已在alpha階段赖草,感謝@posva
    有部分的API變動学少,可到RFC上看。

Vuex

image.png
  • 下一代Vuex:秧骑,vuex@next(與Vue 3 compat相同的API)版确,已在alpha階段,感謝@KiaKing乎折。
  • 團隊正在為下一次迭代試驗Vuex API的簡化
    目前以兼容Vue 3為主绒疗,基本上沒有API變動,莫慌骂澄。

CLI

image.png
  • CLI插件:vue-cli-plugin-vue-nextby @sodatea
  • (wip)CodeMods支持升級Vue 2應用

新工具: vite

image.png

地址:github.com/vuejs/vite

一個簡易的http服務器吓蘑,無需webpack編譯打包,根據(jù)請求的Vue文件坟冲,直接發(fā)回渲染磨镶,且支持熱更新(非常快)

vue-test-utils

image.png

DevTools

image.png
  • 早期的原型已經(jīng)由@Akryum 完成健提,當我們到beta時鲤氢,將完全集成俗壹。
    目前需要花更多精力去完善阳啥。

IDE Support(Vetur)

image.png
  • @znck目前正在試驗模板的類型檢查
  • @octref將在5月為Vue 3進行Vetur集成

Nuxt (https://zh.nuxtjs.org/

)

image.png

目前Nuxt的整合工作也正在進行中床牧,內部團隊已經(jīng)跑起來了痪伦。還需要時間磨合

vue2.x還有2.7版本

image.png
  • 將有最后一個小版本(2.7)
  • 從Vue 3向后移植兼容的改進(不損壞兼容性前提下)
  • 加上在Vue 3中刪除的功能的棄用警告
  • LTS1 18個月。
    最后建議:Vue 3雖好雹锣,如果你的項目很穩(wěn)定网沾,且對新功能無過多的要求或者遷移成本過高,則不建議升級蕊爵。

直播中用到的渲染模板查看工具地址vue-next-template-explorer.netlify.app/

image.png

原文來自:https://juejin.im/post/5e9f6b3251882573a855cd52?utm_source=gold_browser_extension

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末辉哥,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子攒射,更是在濱河造成了極大的恐慌醋旦,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件会放,死亡現(xiàn)場離奇詭異饲齐,居然都是意外死亡,警方通過查閱死者的電腦和手機咧最,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門捂人,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人矢沿,你說我怎么就攤上這事滥搭。” “怎么了捣鲸?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵瑟匆,是天一觀的道長。 經(jīng)常有香客問我栽惶,道長愁溜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任外厂,我火速辦了婚禮祝谚,結果婚禮上,老公的妹妹穿的比我還像新娘酣衷。我一直安慰自己,他們只是感情好次泽,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布穿仪。 她就那樣靜靜地躺著,像睡著了一般意荤。 火紅的嫁衣襯著肌膚如雪啊片。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天玖像,我揣著相機與錄音紫谷,去河邊找鬼。 笑死,一個胖子當著我的面吹牛笤昨,可吹牛的內容都是我干的祖驱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼瞒窒,長吁一口氣:“原來是場噩夢啊……” “哼捺僻!你這毒婦竟也來了?” 一聲冷哼從身側響起崇裁,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤匕坯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后拔稳,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體葛峻,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年巴比,在試婚紗的時候發(fā)現(xiàn)自己被綠了术奖。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡匿辩,死狀恐怖腰耙,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情铲球,我是刑警寧澤挺庞,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站稼病,受9級特大地震影響选侨,放射性物質發(fā)生泄漏。R本人自食惡果不足惜然走,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一援制、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧芍瑞,春花似錦晨仑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至竟贯,卻和暖如春答捕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背屑那。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工拱镐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留艘款,地道東北人。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓沃琅,卻偏偏與公主長得像哗咆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子阵难,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355