尤雨溪在Vue3.0 Beta直播裡聊到了這些…

2021-03-02 Vue中文社區

前言

在 4 月 21 日晚,Vue 作者尤雨溪在嗶哩嗶哩直播分享了Vue.js 3.0 Beta最新進展。以下是直播內容整理

1. 全新文檔RFCs

Vue.js 3.0 Beta發布後的工作重點是保證穩定性和推進各類庫集成

所有的進度和文檔都將在全新RFCs文檔可以看到。

2. 六大亮點Performance:性能更比Vue 2.0強。Tree shaking support:可以將無用模塊「剪輯」,僅打包需要的。Fragment, Teleport, Suspense:「碎片」,Teleport即Protal傳送門,「懸念」Better TypeScript support:更優秀的 Ts 支持Custom Renderer API:暴露了自定義渲染API

下面將按順序分別描述。

3.Performance重寫了虛擬Dom的實現(且保證了兼容性,脫離模版的渲染需求旺盛)。

下面是各項性能對比

要點 1:編譯模板的優化

假設要編譯以下代碼

<div>  <span/>  <span>{{ msg }}</span></div>

將會被編譯成以下模樣:

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", null, _toDisplayString(_ctx.msg), 1 /* TEXT */) ]))}
// Check the console for the AST

注意看第二個_createVNode結尾的「1」:

Vue 在運行時會生成number(大於 0)值的PatchFlag,用作標記。

僅帶有PatchFlag標記的節點會被真正追蹤,且無論層級嵌套多深,它的動態節點都直接與Block根節點綁定,無需再去遍歷靜態節點

再看以下例子:

<div>  <span>static</span>  <span :id="hello">{{ msg }}   </span></div>

會被編譯成:

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的靈活性,又有基於模板的性能保證。

要點 2: 事件監聽緩存:cacheHandlers

假設我們要綁定一個事件:

<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動態綁定,後續替換點擊事件時需要進行更新。

開啟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],會自動生成並緩存一個內聯函數,「神奇」的變為一個靜態節點。Ps:相當於React中useCallback自動化。

並且支持手寫內聯函數:

<div>  <span @click="()=>foo()">    {{msg}}  </span></div>

補充:PatchFlags枚舉定義

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

感興趣的可以看源碼:packages/shared/src/patchFlags.ts

4. Tree shaking support可以將無用模塊「剪輯」,僅打包需要的(比如v-model,<transition>,用不到就不會打包)。一個簡單「HelloWorld」大小僅為:13.5kb11.75kb,僅Composition API。

很多時候,我們並不需要 vue提供的所有功能,在 vue 2 並沒有方式排除掉,但是 3.0 都可能做成了按需引入。

5. Composition API

與React Hooks 類似的東西,實現方式不同。

混入(mixin) 將不再作為推薦使用, Composition API可以實現更靈活且無副作用的復用代碼。

感興趣的可以查看:https://composition-api.vuejs.org/#summary

Composition API包含了六個主要API

可以到這裡查看:https://composition-api.vuejs.org/api.html#setup

Ps:其它的均為常見的工具函數,可先忽略不看。

6. Fragment

Fragment翻譯為:「碎片」

render 函數也可以返回數組了,類似實現了 React.Fragments 的功能 。6.1 <Teleport>

<Teleport>原先是對標 React Portal(增加多個新功能,更強)

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

6.2 <Suspense>

Suspense翻譯為:「懸念」

雖然React 16引入了Suspense,但直至現在都不太能用。如何將其與異步數據結合,還沒完整設計出來。

Vue 3 的<Suspense>更加輕量:

僅 5%應用能感知運行時的調度差異,綜合考慮下,Vue3 的<Suspense> 沒和 React 一樣做運行調度處理

7. 更好的TypeScript支持Vue 3是用TypeScript編寫的庫,可以享受到自動的類型定義提示JavaScript和TypeScript中的 API 是相同的。class組件還會繼續支持,但是需要引入vue-class-component@next,該模塊目前還處在 alpha 階段。

還有Vue 3 + TypeScript 插件正在開發,有類型檢查,自動補全等功能。目前進展可喜。

8. Custom Renderer API:自定義渲染器 API用戶可以嘗試WebGL自定義渲染器,與普通 Vue 應用程式一起使用(Vugel)。

意味著以後可以通過 vue, Dom 編程的方式來進行 webgl 編程 。感興趣可以看這裡:Getting started vugel

9. 剩餘工作9.1 Docs & Migration Guides新的文檔編寫交由@NataliaTepluhina, @sdras, @bencodezen & @phanan 負責9.2 Router下一代 Router:vue-router@next已在alpha階段,感謝@posva

有部分的API變動,可到RFC上看。

9.3 Vuex

`

下一代Vuex:,vuex@next(與Vue 3 compat相同的 API),已在alpha階段,感謝@KiaKing。

目前以兼容Vue 3為主,基本上沒有API變動,莫慌。

9.4 CLICLI插件:vue-cli-plugin-vue-nextby @sodatea9.5 新工具:vite(法語 「快」)

地址:https://github.com/vuejs/vite

一個簡易的http伺服器,無需webpack編譯打包,根據請求的Vue文件,直接發回渲染,且支持熱更新(非常快)

9.6 vue-test-utils下一代test-utils:test-utils@nextby @lmiller1990, @dobromir-hristov, @afontcu & @JessicaSachs9.7 DevTools早期的原型已經由@Akryum 完成,當我們到beta時,將完全集成。

目前需要花更多精力去完善。

9.8 IDE Support (Vetur)@octref將在 5 月為Vue 3進行Vetur集成9.9 Nuxt

目前Nuxt的整合工作也正在進行中,內部團隊已經跑起來了。還需要時間磨合

10 Vue 2.x還有 2.7 版本從Vue 3向後移植兼容的改進(不損壞兼容性前提下)

最後建議:Vue 3雖好,如果你的項目很穩定,且對新功能無過多的要求或者遷移成本過高,則不建議升級。

結束

花了一宿反覆回放整理出來的,如有錯誤,盡情諒解。

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

相關焦點

  • 尤雨溪公布Vue.js 3.0版本詳細進展變化!
    本次大會在上海交通大學文治堂一樓舉辦,大會在昨天早上8:30 - 9:20進行籤到,9點30分大會正式開始,大會中Vue 作者:尤雨溪 發表了有關Vue及即將更新的Vue 3.0版本的一些重磅信息。由於大會內容較多,以下我們就總結報導一些這次的重磅消息,主要是關於即將更新的 Vue 3.0版本的重大變化改進!
  • 尤雨溪:Vue 3 之後會休息一下
    從 VUE 1.0 的 「Evangelion」(新世紀福音戰士),再到 VUE 2.0 的 「Ghost in the Shell」(攻殼機動隊),如今的 VUE 3.0 則被尤雨溪命名為 「One Piece」 (海賊王)—— 這部漫畫史上銷量最高、覆蓋範圍最廣的少年漫畫,似乎也暗示著 VUE 已經從一個小眾群體中的寶藏項目成長為如今風靡全球的世界三大前端框架之一。
  • 致敬尤雨溪,Vue.js 讓我賺到了第一桶金
    從最早使用的 jQuery,到後來的 Ext JS,還有 Backbone,Knockout 等,都嘗試過。這些框架都各有其優缺點,解決問題的同時也帶來了不少麻煩。由於平時比較關注技術動態,一個偶然的機會接觸到了 Vue.js,當是還是剛發布不久的 1.0 版本,用的人也不多。
  • 一張圖教你快速玩轉vue-cli3
    這確保了最終包裡 polyfill 數量的最小化。但是如果其中一個依賴需要特殊的 polyfill,默認情況下 Babel 無法將其檢測出來。": "^11.0.2","vue": "^2.6.10","vue-router": "^3.0.3","vuex": "^3.0.1"},"devDependencies": {
  • 前端娛樂圈大瓜:前端人因為 Vue3 的 Ref-sugar 提案打起來了!
    首先明確一件事情,想要吃這個前端娛樂圈的大瓜,各位看官姥爺得先用一下剛新鮮出爐、十分熱乎的 Vue3.0 版本,否則,這個瓜可能不太甜:)  咱們來捋一捋到底咋回事。 其中最具爭議的就是 ref 的語法糖問題;  為了將問題更加聚焦,前幾天,尤大大將這個提案的兩個內容,分離到了各自的 PR 中,setup 是 RFC 227(https://github.com/vuejs/rfcs/pull/227),ref sugar 是 RFC 228(https://github.com/vuejs/rfcs/
  • 阿里媽媽又做了新工具,幫你把 Vue2 代碼改成 Vue3 的
    於是我們梳理了遷移指南[4]裡提到的,附帶上 vue-router \ vuex 升級的一些 API 變化,配合 GoGoCode[5] 書寫了近 30 條轉換邏輯,涵蓋了 Vue2 到 Vue3 代碼 break change 的大部分場景,這個程序可以幫助你一鍵把 Vue2 的代碼轉換成 Vue3 的代碼。
  • Vue超好玩的新特性:DOM傳送門
    因為目前大多數的 Vue 3 文章重點都在講 Composition API 和 響應式的優化 ,雖然這些新特性很棒,但大家都把其他的新特性給忽略掉了。或者有的文章只是簡單的提了一嘴,然後寫個簡單的 Demo ,講解的不夠細緻也不夠深入。
  • 準備將您的Vue應用遷移到Vue 3
    在這篇文章中,我想分享一下我最近試用Vue 3 Beta版本的經驗,特別是有關您計劃將現有Vue 2應用程式遷移到升級版本Vue 3時可能要注意的一些注意事項!下面的列表將幫助您邁向Vue 3最佳實踐,並避免在Vue 2中遷移到Vue 3時可能遇到麻煩的一些用例。讓我們繼續!
  • Vue 3 生命周期完整指南
    當然,我們用 Vue3 就是要用它的 組合 API,組合 API中訪問這些鉤子的方式略有不同,組合API在較大的Vue項目中特別有用。      }        }</script> 在組合API中使用Vue 3生命周期鉤子在組合API中,我們需要將生命周期鉤子導入到項目中,才能使用,這有助於保持項目的輕量性。
  • Vue的基本使用
    2.2 數據與方法當vm實例創建好了之後,它將 data 對象中的所有的 property 加入到 Vue 的響應式系統中。當這些 property 的值發生改變時,視圖將會產生「響應」,即匹配更新為新的值。
  • vue 使用 vue-pdf 實現pdf在線預覽
    本篇筆記循序漸進,從基礎的demo,到一個可用的程度,文末列出了大家在實際使用的過程中可能會遇到的問題和解決方案。安裝:這個沒有啥背景知識可講,我們直接跳到安裝環節,vue-pdf 和其他vue組件的安裝並無不同,打開命令行,敲入:npm install --save vue-pdf注意路徑。
  • Vue超好玩的新特性:在CSS中使用JS變量
    前言以前在翻譯《Vue 3:2020年中狀態更新》的時候,文中曾經提到過尤雨溪希望7月中旬發布RC版(候選版本),8月初發布3.0正式版。不過現在已經八月初了怎麼還是沒發布呢?這個月初到底幾號才算是"初"呢?
  • vue的$nextTick的使用+源碼分析
    上面,我拋了一個問題,現在來聊一聊這個問題,首先說一說nextTick的作用,這裡我就直接引用官網api上的一句話,我覺得已經說的非常清楚了:將回調延遲到下次 DOM 更新循環之後執行。在修改數據之後立即使用它,然後等待 DOM 更新。它跟全局方法 Vue.nextTick 一樣,不同的是回調的 this 自動綁定到調用它的實例上。
  • Vue 生命周期鉤子完整指南
    Vue 2 和 Vue 3 中的生命周期鉤子,其工作方式非常相似。如果我們在項目中使用Options API,那就不必更改Vue生命周期鉤子的任何代碼,因為Vue 3兼容Vue之前的版本。OK,現在讓我們到Composition API中使用Vue 3生命周期鉤子。在Vue 3 Composition API中使用Vue生命周期鉤子在Composition API中,我們必須先將生命周期鉤子導入到項目中,然後才能使用它們。這是為了儘可能保持項目的輕量級。
  • 這幾款基於 vue3 和 vite 的開箱即用的中後臺管理模版,讓你 yyds !
    我們都知道 vue3 已經發布一年多了,相關的生態也在慢慢建立,很多公司也在嘗試用 vue3 來開發自己的應用系統。但是由於生態的不完善以及缺乏成熟方案的落地,vue3 的應用仍然探索和小規模試驗中。好在開源界無私奉獻的大佬們提前做了很多探索和嘗試,比如面向 vue3 的 UI 組件庫 element Plus,ant-desigin-vue 等,同時基於這些 UI 庫,又有一批大佬封裝了針對企業業務場景的中後臺管理模版,方便我們高效的搭建業務系統。
  • 基於Vue實現一個有點意思的拼拼樂小遊戲
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫前言為了加深大家對vue的了解和vue項目實戰,筆者採用vue生態來重構此項目,方便大家學習和探索。
  • webpack loader 與plugin 開發實戰 —— 點擊 vue 頁面元素跳轉到對應的 vscode 代碼
    Meta摘要本文以一個點擊 vue 頁面元素跳轉到對應 vscode 代碼的 loader 和 plugin 開發實戰,講述 webpack loader 和 plugin 開發的簡單入門。  apply(compiler) {    // 指定一個掛載到 webpack 自身的事件鉤子。
  • 優美的v-for列表加載動畫:vue動畫鉤子實踐
    原文轉自 優美的v-for列表加載動畫:vue動畫鉤子實踐 https://juejin.im/post/6869195042599206919最近忙完工作,重新擼了一遍vue官方文檔,發現很少被我用到的vue動畫神器,JavaScript鉤子函數
  • 技術分享:vue 過濾器
    vue 過濾器 1 關於 vue 過濾器 在vue1.0的時候其實是內置了過濾器的,但是考慮到好多過濾器並不一定會被開發所調用,所以把原本內置的過濾器就給去掉了,但是過濾器還是比較普遍的,所以我們從vue2.0之後就需要自己定義過濾器
  • Vue.js深入學習
    vue.jsv-cloak:解決網速慢閃爍問題 ,不會替換掉標籤裡面的內容v-text:會替換掉標籤裡面的內容:原樣輸出v-html:會解析標籤v-bind:綁定屬性的指令,縮寫@click.stop="btnHandle" 阻止事件冒泡 從裡到外.prevent 阻止默認行為,連結跳轉,.capture 實現捕獲觸發事件的機制 從外到裡.self 只有點擊當前元素時觸發,冒泡和捕獲都不管用,.once 只觸發一次事件處理函數.stop和.self的區別.self只會阻止自己身上冒泡行為,並不會阻止其他元素的冒泡行為