浅析理解vue3的设计与实现(1)-------vue3在设计时做了哪些“取舍”

从vue3学习者的角度来看,应该先从全局的角度对框架的设计有清楚认知,不用纠结于一些小细节。框架在进行设计时,都会有一些取舍,vue3也不例外。命令式or声明式?极致性能or保持可维护性?运行时or编译时?

在这里插入图片描述

命令式和声明式

命令式框架的特点是关注过程,声明式框架的特点是关注结果。区别我们在具体的例子中看下:

-获取id为app的标签
-添加他的文本内容为 hello world
-为其绑定点击事件
-当点击时弹出提示:ok

这里我们使用声明式框架jquery的代码来实现下:

$('#app')//获取节点
.text('hello world')//设置文本内容
.on('click',()=>{
    
    alert('ok')})//绑定点击事件

可以看到jQuery是真的在关注做事的过程,以至于我们可以用自然语言来描述每一行代码的作用
我们再使用声明式框架来实现下:

<div @click="()=>{alert('ok')}">hello world</div>

可以看出,在这里我们作为vue的用户,直接声明了这个结果,我们需要一个div,文本是…,功能是…
至于实现结果的过程,是vue帮助我们实现的

我们可以看出声明式的框架方便了用户的使用,那么声明式的框架就一定优于命令式吗?我们继续往下分解

可维护性与性能的权衡

其实对于框架设计者来说。声明式和命令式的选择其实就是再可维护性和性能之间做了取舍,这里可能联想不到与性能的关联,我们以上面的例子继续往下延申,此时多了一个需求,将div的文本改为‘hello vue’。
这里我们先使用声明式的写法来完成:

div.textContent = 'hello vue'

可以看出非常非常非常的简单!!!我们此时考虑下,有没有更简单的方法了呢?没有的了。因为我们明确知道是哪个节点做了变更,这已经把性能优化到了极致,vue不一定能做到这一点,因为描述的是结果

<div @click="()=>{alert('ok')}">hello world</div>
变更为
<div @click="()=>{alert('ok')}">hello vue</div>

对于vue来说,他需要找到前后的差异和更新变化的地方,但是最终完成更新的代码仍然是div.textContent = ‘hello vue’。
在这里,我们抽象把直接修改的性能定义为A,把找出性能差异的性能消耗定义B,就有:
命令式:A
声明式:B+A
所以从性能上来说,声明式只能无限接近于命令式,无法做到超越,所以声明式框架代码性能不优于命令式框架代码性能;所以vue框架就要在保持可读性的同时把性能损失最小化。

运行时和编译时

设计框架时,有三种选择:纯运行时的、运行时+编译时的、纯编译时的
纯运行时的:
此时需要规定用户输出固定格式的数据对象,调用框架所写的render方法,即可看到预期的内容;

此时用户可能觉得纯运行的框架还不够直观,若是可以直接用html编译成预期内容,体验会更好,这时我们可以引入一个compiler函数,这个函数的功能是把html结构编译成固定格式的数据对象,这种就是运行时+编译时的框架

此时再进行思考,既然可以把html转成固定的数据格式,那么是否可以通过这个html结构,直接调用创建结构的命令呢,此时就只需要一个compailer函数了,这也就是纯编译的框架

而这三种类型的框架都是有优缺点的:
1、纯运行的框架由于缺少编译的过程,无法分析用户提供的内容,如果可以分析的话,可以分析哪些内容是会改变的,哪些是不会改变的,render函数拿到这些内容后也就可以优化了
2、纯编译的诳语由于缺少运行的过程,性能会更好,但是用户提供的内容必须通过编译才可以使用,这也失去了灵活性。
vue3使用的是运行+编译的架构,保证灵活性的基础下,尽可能地去优化。

题头的三个“取舍”问题,已经得到解答啦。

猜你喜欢

转载自blog.csdn.net/weixin_44064067/article/details/123465571