前言

在那天风雨交加的夜晚,Vue的创作者尤雨溪尤大大在b站直播分享了Vue.js 3.0 Beta最新进展.我对直播的内容进行了一下整理.整整用了三天的空余时间赶上了

1. 全新文档RFCs

Vue.js 3.0 Beta发布后的工作重点是保证稳定性和推进各类库集成

所有的进度和文档都将在全新RFCs文档可以看到。

2. 六大亮点

  • Performance:性能更比Vue 2.0强。

  • Tree shaking support:可以将无用模块“剪辑”,仅打包需要的。

  • Composition API:组合API

  • Fragment, Teleport, Suspense:“碎片”,TeleportProtal传送门,“悬念”

  • Better TypeScript support:更优秀的Ts支持

  • Custom Renderer API:暴露了自定义渲染API

下面将按顺序分别描述。

3. Performance

  1. 重写了虚拟Dom的实现(且保证了兼容性,脱离模版的渲染需求旺盛)。

  2. 编译模板的优化。

  3. 更高效的组件初始化。

  4. update性能提高1.3~2倍。

  5. SSR速度提高了2~3倍。

下面是各项性能对比

要点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" class="bar">{{ 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:相当于ReactuseCallback自动化。

并且支持手写内联函数:

<div>
<span @click="()=>foo()">
  {{msg}}
</span>
</div>
复制代码

补充:PatchFlags枚举定义

而通过查询Ts枚举定义,我们可以看到分别定义了以下的追踪标记:

export const enum PatchFlags {
 
TEXT = 1,// 表示具有动态textContent的元素
CLASS = 1 << 1, // 表示有动态Class的元素
STYLE = 1 << 2, // 表示动态样式(静态如style="color: red",也会提升至动态)
PROPS = 1 << 3, // 表示具有非类/样式动态道具的元素。
FULL_PROPS = 1 << 4, // 表示带有动态键的道具的元素,与上面三种相斥
HYDRATE_EVENTS = 1 << 5, // 表示带有事件监听器的元素
STABLE_FRAGMENT = 1 << 6,   // 表示其子顺序不变的片段(没懂)。
KEYED_FRAGMENT = 1 << 7, // 表示带有键控或部分键控子元素的片段。
UNKEYED_FRAGMENT = 1 << 8, // 表示带有无key绑定的片段
NEED_PATCH = 1 << 9,   // 表示只需要非属性补丁的元素,例如ref或hooks
DYNAMIC_SLOTS = 1 << 10, // 表示具有动态插槽的元素
// 特殊 FLAGS -------------------------------------------------------------
HOISTED = -1, // 特殊标志是负整数表示永远不会用作diff,只需检查 patchFlag === FLAG.
BAIL = -2 // 一个特殊的标志,指代差异算法(没懂)
}
复制代码

感兴趣的可以看源码:packages/shared/src/patchFlags.ts

4. Tree shaking support

  • 可以将无用模块“剪辑”,仅打包需要的(比如v-model,,用不到就不会打包)。

  • 一个简单“

    HelloWorld

    ”大小仅为:13.5kb

    • 11.75kb,仅Composition API

  • 包含运行时完整功能:22.5kb

    • 拥有更多的功能,却比Vue 2更迷你。

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

5. Composition API

React Hooks类似的东西,实现方式不同。

  • 可与现有的 Options API一起使用

  • 灵活的逻辑组合与复用

  • vue 3的响应式模块可以和其他框架搭配使用

混入(mixin) 将不再作为推荐使用, Composition API可以实现更灵活且无副作用的复用代码。

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

Composition API`包含了六个主要`API

可以到这里查看:composition-api.vuejs.org/api.html#se…

Ps:其它的均为常见的工具函数,可先忽略不看。

6. Fragment

Fragment翻译为:“碎片”

  • 不再限于模板中的单个根节点

  • render 函数也可以返回数组了,类似实现了 React.Fragments 的功能 。

  • 'Just works'

6.1 ``

  • 以前称为``,译作传送门。

  • 更多细节将由@Linusborg 分享

`原先是对标React Portal`(增加多个新功能,更强)

但因为Chrome有个提案,会增加一个名为Portal的原生element,为避免命名冲突,改为Teleport

6.2 ``

Suspense翻译为:“悬念”

  • 可在嵌套层级中等待嵌套的异步依赖项

  • 支持async setup()

  • 支持异步组件

虽然React 16引入了Suspense,但直至现在都不太能用。如何将其与异步数据结合,还没完整设计出来。

Vue 3 的``更加轻量:

仅5%应用能感知运行时的调度差异,综合考虑下,Vue3 的`` 没和React一样做运行调度处理

7. 更好的TypeScript支持

  • Vue 3是用TypeScript编写的库,可以享受到自动的类型定义提示

  • JavaScript

    TypeScript

    中的API是相同的。

    • 事实上,代码也基本相同

  • 支持TSX

  • class组件还会继续支持,但是需要引入vue-class-component@next,该模块目前还处在 alpha 阶段。

还有Vue 3 + TypeScript 插件正在开发,有类型检查,自动补全等功能。目前进展可喜。

8. Custom Renderer API:自定义渲染器API

  • 正在进行NativeScript Vue集成

  • 用户可以尝试WebGL自定义渲染器,与普通Vue应用程序一起使用(Vugel)。

意味着以后可以通过 vueDom 编程的方式来进行 webgl 编程 。感兴趣可以看这里:Getting started vugel

9. 剩余工作

9.1 Docs & Migration Guides

  • 新的文档编写交由@NataliaTepluhina, @sdras, @bencodezen & @phanan 负责

  • @sdras 正在做自动升级迁移工具

  • @sodatea 已经开始研究CodeMods

9.2 Router

  • 下一代 Routervue-router@next已在alpha阶段,感谢@posva

有部分的API变动,可到RFC上看。

9.3 Vuex

`

  • 下一代Vuex:,vuex@next(与Vue 3 compat相同的API),已在alpha阶段,感谢@KiaKing

  • 团队正在为下一次迭代试验Vuex API的简化

目前以兼容Vue 3为主,基本上没有API变动,莫慌。

9.4 CLI

  • CLI插件:vue-cli-plugin-vue-nextby @sodatea

  • (wip)CodeMods支持升级Vue 2应用

9.5 新工具:vite(法语 “快”)

地址:github.com/vuejs/vite

一个简易的http服务器,无需webpack编译打包,根据请求的Vue文件,直接发回渲染,且支持热更新(非常快)

9.6 vue-test-utils

  • 下一代

    test-utils

    :

    test-utils@next
    • by @lmiller1990, @dobromir-hristov, @afontcu & @JessicaSachs

9.7 DevTools

  • 早期的原型已经由@Akryum 完成,当我们到beta时,将完全集成。

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

9.8 IDE Support (Vetur)

  • @znck目前正在试验模板的类型检查

  • @octref将在5月为Vue 3进行Vetur集成

9.9 Nuxt

目前Nuxt的整合工作也正在进行中,内部团队已经跑起来了。还需要时间磨合

10. Vue 2.x还有2.7版本

  • 将有最后一个小版本(2.7)

  • Vue 3向后移植兼容的改进(不损坏兼容性前提下)

  • 加上在Vue 3中删除的功能的弃用警告

  • LTS1 18个月。

最后建议:Vue 3虽好,如果你的项目很稳定,且对新功能无过多的要求或者迁移成本过高,则不建议升级。

更多前端学习内容文章干货请关注我的专栏(不断更新)

阿里名厂标准web前端高级工程师教程目录大全,从基础到进阶,看完保证您的薪资上升一个台阶

在这里我给大家准备了很多的学习资料:

其实你与阿里工程师的差距只差这些东西

结束

如有错误,尽情谅解。如果觉得还可以,大家可以给个关注

尤雨溪在直播中讲到的Vue3.0 Beta的那些特性,快记笔记了的更多相关文章

  1. 尤雨溪:TypeScript不会取代JavaScript

    来源 |evrone.com译者 | 核子可乐策划 | 蔡芳芳 近日,Evrone 与 Vue.js 的作者尤雨溪进行了一次访谈,了解他对于无后端与全栈方法.以及 Vue.js 适用场景的看法,还有他 ...

  2. [译] 尤雨溪:Vue 3.0 计划

    [译] 尤雨溪:Vue 3.0 计划 原文:Plans for the Next Iteration of Vue.js作者:Evan You 发表时间:Sep 30, 2018译者:西楼听雨 发表时 ...

  3. Vue作者尤雨溪:以匠人的态度不断打磨完善Vue (图灵访谈)

    访谈对象: 尤雨溪,Vue.js 创作者,Vue Technology创始人,致力于Vue的研究开发. 访谈内容: 你为何选择从事前端方面的工作? 其实,我本科读的是艺术史,研究生阶段学习Design ...

  4. 听说尤雨溪在开发vue4.0?是谁煽动了前端圈的焦虑情绪

    导火索因P图而起 今天前端圈里被一张P图搞得好热闹,最初只是QQ群里一个冒名尤雨溪的前端网友发了一句调侃的话,原话截图如下: 看完觉得好搞笑,说尤雨溪在开发vue4.0,有谁学不动了,就给他发10块钱 ...

  5. 专访Vue作者尤雨溪:Vue CLI 3.0重构的原因

    1.为什么要对 Vue CLI 进行大规模修改? 尤雨溪认为旧版本的 Vue CLI 本质上只是从 GitHub 拉取模版,这种拉模版的方式有几个问题: (1) 在单个模版里面同时支持太多选项会导致模 ...

  6. React 和 Vue 到底谁更牛?听听尤雨溪怎么说

    React 和 Vue 到底谁更牛?听听尤雨溪怎么说 知乎上近日有人发起了一个 “react 是不是比 vue 牛皮,为什么?” 的问题,再度引发一场关于前端框架谁更牛的口水战,评论里可以说是撕得不可 ...

  7. 致敬尤雨溪,Vue.js 让我赚到了第一桶金

    最近这个 Vue.js 纪录片在前端圈广为传播,相信不少人已经看过了.第一次看编程领域的纪录片,感觉还挺新鲜的.这部 30 分钟左右的纪录片制作精良,主角是 Vue.js 作者尤雨溪,还穿插采访了框架 ...

  8. 蒲公英 · JELLY技术周刊 Vol.12 尤雨溪新作 Vite, 你会支持么?

    「蒲公英」期刊,每周更新,我们专注于挖掘「基础技术.工程化.跨端框架技术.图形编程.服务端开发.桌面开发.人工智能」等多个大方向的业界热点,并加以专业的解读:不仅如此,我们还精选凹凸技术文章,向大家呈 ...

  9. 尤雨溪的vue怎么学,应该从vue-cli开始,为什么?

    带手机验证码登陆, 带全套购物车系统 带数据库 前后端分离开发 带定位用户功能 数据库代码为本地制作好了 带支付宝支付系统 带django开发服务器接口教程 地址:   https://www.dua ...

随机推荐

  1. 那些年,我们追过的java8

    9月份java9就要发布了,在8月的最后一天决定回顾一下java8那些惊天动地的变化,加深理解,共同进步. 我们都知道java与c++,c不同是一个为面向对象而生的语言,面向对象思想贯彻了java发展 ...

  2. Python第十二章-多进程和多线程01-多进程

    多进程和多线程 一.进程 1.1 进程的引入 现实生活中,有很多的场景中的事情是同时进行的,比如开车的时候 手和脚共同来驾驶汽车,再比如唱歌跳舞也是同时进行的:试想,如果把唱歌和跳舞这2件事情分开依次 ...

  3. SpringBoot中遇到的一些问题

    1.JQuery和bootstrap报404的问题 在html页面导入的js和css的时候,不要加static这级目录,直接跳过即可,例如 导入的时候不需要加static目录,直接导入js/和css/ ...

  4. cut-trailing-bytes:二进制尾部去0小工具

    背景 之前的文章 二进制文件处理之尾部补0和尾部去0 中介绍了一种使用 sed 去除二进制文件尾部的 NULL(十六进制0x00)字节的方法. 最近发现这种方法有局限性,无法处理较大的文件.因为 se ...

  5. B. The Monster and the Squirrel

    B. The Monster and the Squirrel Ari the monster always wakes up very early with the first ray of the ...

  6. app测试的一些较为重要的测试点

    安装测试 从不同的手机所自带的不同的版本的软件商城里面下载抖音并安装查看是否成功 安装后是否能正常运行安装后的文件和文件夹是否写到了指定的目录里 安装过程中取消安装,安装的文件是否在指定的目录里 安装 ...

  7. 怎么用scratch做大鱼吃小鱼

    行走代码不说了.出鱼代码大概就是 棋子被点击时 重复执行 移到x:从()到()任意选一个数,y一样 克隆自己 等待你想要的秒数.吃鱼代码就是 当作为克隆体启动是 重复执行 如果碰到()那么 删除克隆体 ...

  8. 《操作系统》课程笔记(Ch01-导论)

    Ch01 - 导论 操作系统的功能 用户视角:在乎使用方便,不在乎资源利用 系统视角:资源分配器.控制程序 计算机系统的运行 启动:利用固件(Firmware)中的引导程序(Bootstrap Pro ...

  9. 【python实现卷积神经网络】卷积层Conv2D反向传播过程

    代码来源:https://github.com/eriklindernoren/ML-From-Scratch 卷积神经网络中卷积层Conv2D(带stride.padding)的具体实现:https ...

  10. python3(十六) sorted

    # sorted()函数list进行排序: L = sorted([36, 5, -12, 9, -21]) print(L) # [-21, -12, 5, 9, 36] # 可以看到默认是按照升序 ...