共计 6550 个字符,预计需要花费 17 分钟才能阅读完成。
随着前端框架的疾速更新迭代,当初的支流前端框架之一 Vue.js 迎来了它的新版本 3.0。在往年 2020 的 5 月 28 日,Vue.js 的作者尤雨溪颁布了 Vue3 的整个设计过程,让咱们来理解一下吧。加一 Q 一带一你10319281邀一情一玛33339333进【c9183.com】已助上千人成功翻盘,欢迎增加,沟通交流!
简略的来说,这个框架的版本更新肯定是为了补救前一个版本的不足之处,回忆一下 Vue2 的呈现也曾经有四年之久了,尤大的团队也始终在钻研新的版本的 Vue,也就是 Vue3。
翻阅了一下他们的 Vue3 设计过程能够理解到 版本更新的起因 有以下两点:
- 当初的支流浏览器对 JavaScript 语言曾经有了十分好的反对,其中包含了起初 ES6 更新的语法,而 Vue2 应用的大多都是 ES6 之前的语法,所以当初能够通过利用新的语法对 Vue 框架进行更新,以进步性能
- Vue2 代码库中的设计和体系架构存在肯定的问题,所以不得不对其进行更正
那么 Vue3 到底更新了什么呢?它有哪些新的个性?它绝对于 Vue2 的劣势是什么?Vue3 如何进行应用?
别急,本文就将带着大家提前体验一下 Vue3,以上的问题也会一一失去解答,大家也能够从中感受一下 Vue3 的魅力。
- 公众号:前端印象
- 不定时有送书流动,记得关注~
- 关注后回复对应文字支付:【面试题】、【前端必看电子书】、【数据结构与算法残缺代码】、【前端技术交换群】
提前体验 Vue3 新个性
- 一、Vue3 的亮点
-
- (1)Performance
- (2)Tree shaking support
- (3)Better TypeScript support
- (4)Composition API
- (5)Custom Renderer API
- (6)Fragment
- 二、Vue3 的性能
- 三、降级 Vue3
-
- (1)创立 Vue2 我的项目
- (2)将 Vue2 升级成 Vue3
- 四、体验 Vue3 新个性
- 五、结束语
一、Vue3 的亮点
在体验 Vue3 之前,咱们先来理解一下 Vu3 到底有哪些亮点之处
总共有 6 大两点:
- Performance(性能比 vue2 的 runtime 快 2 倍左右)
- Tree shaking support(按需打包模块)
- Better TypeScript support(更好的 TS 代码反对)
- Composition API(组合 API)
- Custom Renderer API(自定义渲染 API)
- Fragment, Teleport, Suspense
(1)Performance
在本来的 Vue2 中,每次 DOM 某个中央须要更新都须要遍历整个虚构 DOM,而后判断哪个中央须要进行更新,而后再从新渲染。而 Vue3 抉择了一种新的渲染策略,即采纳某些形式使得每次须要更新 DOM 时,无需遍历整个虚构 DOM 树就能够检测到扭转而进行 DOM 更新。
(2)Tree shaking support
这个就时为了实现 按需打包,咱们晓得 Vue 框架里有很多的 API 和模块,然而一个我的项目中不可能用到所有的 API 和模块,所以该性能就能够实现在打包时去除掉 Vue 中没有被用到的模块和 API,使得整个我的项目大小大幅度减小。
依据官网的说法,Vue3 如果只写入了一个 Hello World
,即没有用到任何的模块 API,打包后的大小大概为 13.5kb
;若用到了所有的 Vue3 所有的模块,打包后的大小也就只有大概 22.5kb
;而 Vue2 若只写入了 Hello World
,并没有用到任何的模块 API,打包后的大小大概为 32kb
左右,这就是因为 Vue2 中没有 Tree shaking
的起因。
从中能够看出,Vue3 比 Vue2 更轻量。
(3)Better TypeScript support
为了更好的用户应用,Vue3 应用了 TS 从新对 Vue 框架进行了重写,减少了对 TS 更好的反对。
(4)Composition API
Composition API
是为了解决本来 Vue 我的项目中代码逻辑扩散而导致不易保护的问题
首先先来看一个图
这幅图里色彩雷同的区域示意的是实现同一个性能的代码区域
图中左侧的是 Vue2 的一个 API,叫做 Options
,就是咱们代码中的 data
、methods
、mounted
……这些存储数据或办法的对象
咱们都晓得,在大的我的项目中,咱们要实现一个组件的残缺性能,须要上百甚至上千行代码。例如,咱们要做一个 轮播图组件,当初把图中左侧这一列图像看成是轮播图组件的代码,假如这里有 1000 行代码。
首先咱们在 methods
里写了实现轮播性能的办法,而后在 mounted
里写上在进入页面时主动开启轮播性能的代码,此时又想起来应该加一个性能,在鼠标移入该组件时应暂停轮播,所以又在 methods
里新增了一个办法,如图
这时你就会有这种感触,仅仅为了实现一个 轮播 的性能,却在这个页面中的不同中央写了不同的代码,那这样保护起来就特地的麻烦了,假如你的轮播性能出 bug 了,你须要排查问题,这时你先查看 实现轮播性能的代码
有无问题,而后又往下翻几百行代码找到 鼠标移入暂停轮播的代码
,检查一下是否有问题,再又往下翻几百行代码找到 进入页面开启轮播的代码
是否又问题。最终一顿剖析能力查出 bug。
这样一来,代码逻辑在页面中比拟扩散,很难保护,所以 Vue3 舍弃了这种 Options API
,而换用 Composition API
,也就是图中右侧的局部。
咱们来看一下,方才举的例子如果换用 Composition API
会时什么样
所有实现 轮播 这一性能的代码都放在一起,也就天然不便了保护
(5)Custom Renderer API
Custom Renderer API
也算是 Vue3 一个很不错的亮点了,它的作用就是将咱们的代码绘制到 canvas
画布上
(6)Fragment
Vue3 实现了不再限于模板中的单个根节点
在 Vue2 中大家应该遇到过这样的状况
这个报错的起因是因为,Vue2 要求组件模板中只能有一个根节点,而不能够有多个根节点,如图
图中这种状况就是有两个根节点,所以会报错。所以咱们能够通过给这两个标签内部加一个节点来解决报错问题,如图
这样就不会在报错了,但有时会感觉这样特地麻烦,所以 Vue3 解决这个报错问题,实现了模板中不限于单个根节点,即即便有多个根节点也不会报错
二、Vue3 的性能
在 Vue3 中,重写了虚构 dom 的实现,并且针对编译模板进行了优化。
在下面咱们讲到了,在 Vue2 中,每次更新 dom 都须要从新遍历整个虚构 dom 树,检测到变动点再去做相应的更新。然而 Vue3 在每次更新 dom 时就不须要遍历整个虚构 dom 树了,这是为什么呢?
这里先放上两个网址,别离能够查看到 Vue2 和 Vue3 的模板编译是如何的:
- Vue2-template:https://template-explorer.vuejs.org/#%3Cdiv%20id%3D%22app%22%3E%0A%20%20%7B%7B%20msg%20%7D%7D%0A%3C%2Fdiv%3E
- Vue3-template:https://vue-next-template-explorer.netlify.app/#%7B%22src%22%3A%22%3Cdiv%20id%3D%5C%22app%5C%22%3E%5Cr%5Cn%20%20%7B%7B%20msg%20%7D%7D%5Cr%5Cn%3C%2Fdiv%3E%22%2C%22options%22%3A%7B%22mode%22%3A%22module%22%2C%22prefixIdentifiers%22%3Afalse%2C%22optimizeImports%22%3Afalse%2C%22hoistStatic%22%3Afalse%2C%22cacheHandlers%22%3Afalse%2C%22scopeId%22%3Anull%2C%22ssrCssVars%22%3A%22%7B%20color%20%7D%22%2C%22bindingMetadata%22%3A%7B%22TestComponent%22%3A%22setup%22%2C%22foo%22%3A%22setup%22%2C%22bar%22%3A%22props%22%7D%7D%7D
Vue 的渲染过程是先将 html 模板生成一个 render
函数,而后再依据该 render
函数进行渲染的,咱们首先来看一下 Vue2 的模板编译状况
图中左侧局部就是咱们平时写的 html 模板,右侧局部则是该 html 模板编译后生成的 render
函数
接下来咱们再来看一下 Vue3 的模板编译状况是如何的
很显著的能够看到,比照 Vue2 的 render
函数,在图中的第 7 行代码中多出了一个数字 1
和 /* TEXT */
,这是针对 html 模板打上了一个标记,通知程序这个地位的数据是动静的(html 模板中的 {{msg}}
是可能会扭转的,是一个动静的数据),所以之后如果要更新 dom,就会针对打上标记的地位进行遍历检测。
当初咱们再在 html 模板上写上一个动态的数据,看看它是如何编译模板的
咱们能够看到,我先给最内部的 div
加上了一个动静的 class
属性,即 :class="isShow"
,所以编译后的 render
函数中的第 11 行代码中,有一个数字 9
、正文 /* TEXT, PROPS */
以及 ["class"]
,示意 html 模板该处的 text
文本局部是动静的,属性 class
也是动静的,所以在前面更新 dom 时,会对该处的这两个值进行遍历检测;另外咱们给属性 name
赋值了 box
,该值是一个动态固定的值,所以在图中右侧的 render
函数中咱们并没有看到对其有任何的标记,所以在之后更新 dom 时,会主动疏忽该处的值。
这就是 Vue3 通过标记来追踪动态数据的绑定,从而节约遍历虚构 dom 的大部分开学。
联合官网的说法,Vue3 比 Vue2 的页面渲染速度晋升了 1.3 倍~2 倍,SSR(服务器渲染)速度进步了 2 倍~3 倍
这里放上两者性能的比照图
三、降级 Vue3
尽管目前为止 Vue3 还未正式公布,但咱们曾经能够提前体验 Vue3 了,为了更好地进行版本的迭代更新,Vue3 对 Vue2 进行了很大水平的兼容,并且还提供了一个版本升级工具,能够将本来的 Vue2 我的项目很好的降级到 Vu3。接下来我给大家介绍一下降级 Vue3 的步骤
(1)创立 Vue2 我的项目
咱们先通过 vue-cli
脚手架的 vue create 我的项目名
来创立一个 vue2 我的项目,这里倡议大家在创立时把 vue-router
和 vuex
一并装置上,因为等会在降级时,会把这两个一并降级,因而代码会有所变动。
(2)将 Vue2 升级成 Vue3
那么咱们当初只须要在原来的 vue 我的项目目录下通过命令 vue add vue-next
来将 Vue2 升级成 Vue3
在降级之前,我先记录一下几个文件的代码,能够不便咱们看看降级前和降级后的差异
- Vue2 的
main.js
文件 - Vue2 的
vue-router
的index.js
文件 - Vue2 的
vuex
的index.js
文件
略微期待一下,Vue3 就降级胜利了,后果如图
那么此时咱们来看看降级后的 Vue 文件有哪些变动
- Vue3 的
main.js
文件 - Vue3 的
vue-router
的index.js
文件 - Vue3 的
vuex
的index.js
文件
比照一下各个文件降级前和降级后的区别,咱们能够很显著地看到:
Vue2 的文件中都是 import Vue from 'vue'
导入了整个 Vue,也就是把所有的模块 API 都导入了,然而用到的 API 可能就那么几个,所以这十分影响性能
Vue3 的文件都是将用到的 Vue 中的模块 API 独自地导出,而不是导入整个 Vue,相似图中的 import {createApp} from 'vue'
,这样就跟吃自助时吃多少拿多少的情理一样,十分得节俭代码性能的耗费。
到这里,Vue3 就算曾经降级胜利了,接下来咱们就来体验一下 Vue3 的一些新个性把。
四、体验 Vue3 新个性
这里次要是来体验一下 Composition API
的,首先理解一下 Composition API
新个性的入口—— setup()
函数,该函数是为组件提供的新属性。
下面说了,这个 API 次要就是为了整合代码,使得为了实现雷同性能的代码集中在一起便于保护查看,咱们来用一个简略的例子来感受一下
咱们要实现以下这个性能
首先看看在 Vue2 里是如何实现的
`<template>
<div>
<div>{{count}}</div>
<button @click="add"> 减少 </button>
</div>
</template>
<script>
export default {
name: "demo",
data() {
return {count: 0}
},
methods: {add() {this.count ++}
}
}
</script>`
* 1
* 2
* 3
* 4
* 5
* 6
* 7
* 8
* 9
* 10
* 11
* 12
* 13
* 14
* 15
* 16
* 17
* 18
* 19
* 20
* 21
* 22
咱们能够看到,首先数据 count
和 办法 add
是离开的,别离散布在 data
属性 和 methods
属性中的,这也就是证实了,实现一个性能时,代码时离开的,如果这个组件里有很多很多性能,就会比拟难找了。
接下来咱们再来看一下在 Vue3 中是如何实现这一性能的吧
`<template>
<div>
<div>{{count}}</div>
<button @click="add"> 减少 </button>
</div>
</template>
<script>
// 导入 ref 函数
import {ref} from 'vue'
function increase() {
// 申明响应式数据 count,值为 0
const count = ref(0)
// 创立办法 add
const add = () => {count.value ++}
// 导出数据和办法,便于外界拜访
return {
count,
add
}
}
export default {
name: 'demo',
setup() {
// 调用 increase 函数,并获取 count 和 add
let {count, add} = increase()
//return 出须要被拜访的值和办法
return {
count,
add
}
}
}
</script>`
* 1
* 2
* 3
* 4
* 5
* 6
* 7
* 8
* 9
* 10
* 11
* 12
* 13
* 14
* 15
* 16
* 17
* 18
* 19
* 20
* 21
* 22
* 23
* 24
* 25
* 26
* 27
* 28
* 29
* 30
* 31
* 32
* 33
* 34
* 35
* 36
* 37
* 38
* 39
* 40
* 41
Vue3 中没有再应用 data
属性,而是通过应用 vue 中的 ref()
函数来命名响应式数据的,ref()
函数返回的是一个对象,咱们命名的数据是存储在这个对象的 value
属性里的,如图
同样的也没有再应用 methods
属性,而是间接通过 function
命名一个函数即可
同时,为了让代码整合在一起,咱们在最内部命名了一个 increase
函数,外面寄存了所有的数据和办法。
在 Vue3 中有一个新的属性 setup()
,它能够看作是一个生命周期,介于 beforeCreate
与 created
之间,在这个生命周期内被 return
的值和办法能够被外界拜访到
所以在代码中,咱们间接调用了方才将性能代码整合在一起的 inscrease
函数,同时获取了函数内 return
的两个变量,这是因为这两个变量是须要被拜访的,例如 <div>{{count}}</div>
中须要拜访 count
;<button @click="add"> 减少 </button>
中须要拜访 add
办法。
不要看这一个简略的性能中,仿佛 Vue3 显得更麻烦,其实在一个性能十分多的我的项目中,这样的逻辑形式会使代码浏览与保护起来十分的不便。
五、结束语
好了,Vue3 的尝鲜就到这里了,但 Vue3 的性能和 API 远远不止这些,置信大家对 Composition API
也有了粗浅的印象,前面我会再出一篇博客来更具体地介绍这个 API 的更多用法,欢送大家持续关注我~
我是 Lpyexplore,欢送关注公众号:前端印象,理解更多前端与爬虫常识
创作不易,喜爱的加个关注,点个珍藏,给个赞~ 带你们在 Python 爬虫的过程中学习 Web 前端