Vue框架设计(一):命令式or声明式

简介: Vue框架设计(一):命令式or声明式

前言

从范式角度来看,视图层框架通常分为命令式和声明式。作为框架设计者,应该对两种范式都有足够的认知,才能做出正确的选择,甚至想办法汲取两者的优点并将其捏合。

那么Vue3框架应该设计成命令式还是声明式?这两种范式有何优缺点?我们能否汲取两者的优点?

概念

命令式

早年间流行的jQuery是典型的命令式框架。命令式框架的一大特点是关注过程

举个例子,我们要做到下面的步骤:

  1. 获取id为app的div标签
  2. 它的文本内容为hello world
  3. 为其绑定点击事件
  4. 当点击时弹出提示:ok

那么,如果是用jQuery这种命令式框架实现,那么代码就是:

$('#app')
.text('hello world')
.on('click', ()=>{
    alert('ok')
})
复制代码

可见,每一行代码跟我们的需求描述是一一对应的,自然语言描述能够与代码产生一一对应的关系,代码本身描述的是“做事的过程”,这符合我们的逻辑直觉。

声明式

声明式框架更加关注结果。 上面的例子,我们改用vue:

<div @click="()=>aalert('ok')>hello world</div>
复制代码

框架提供的是一个“结果”,上面就像是告诉vue:“嘿,我要一个div,文本内容是hello world,它有个事件绑定,你搞定它。”,至于实现该“结果”的过程,则是由vue完成的,换句话说,就是vue帮我们封装了过程。

因此,Vuejs的内部实现一定是命令式的,而暴露给用户的却更加声明式。

性能与可维护性的权衡

命令式和声明式各有优缺点,在框架设计方面,则体现在性能与可维护性之间的权衡。

先抛出结论:声明式代码的性能不优于命令式代码的性能

拿上面的例子来说,我们现在需要修改div的文本内容,那么对于命令式代码来说,实现如下:

div.textConent='hello vue'
复制代码

因为我们明确知道哪些发生了变更,只做必要的修改就行。

但如果换做声明式,因为它描述的是结果,就不一定能做到这一点。对于框架来说,为了实现最优的更新性能,它需要找到前后的差异并只更新变化的地方,但是最终完成这次更新的代码依然是:

div.textConent='hello vue'
复制代码

所以对于声明式来说,会多了一个步骤:查找前后差异并找出需要更新变化的地方。换句话说,声明式代码比命令式代码多出查找差异的性能消耗,最理想的情况是,当找出差异的性能消耗为0时,声明式与命令式代码的的性能相同,但是无法做到超越。

那么为什么要选择声明式的设计方案?

原因在于声明式代码的可维护性更强。

从上面的例子来说,采用命令式代码开发,需要维护实现目标的整个过程,包括要手动完成DOM元素的创建、更新、删除等工作。而声明式代码展示的就是我们要的结果,看上去更直观,关于做事的过程,我们不需要care。

这就体现了架构设计上可维护性与性能之间的权衡。在采用声明式提升可维护性的同时,性能就会有一定的损失,而架构设计者要做的就是:在保持可维护性的同时让性能损失最小化

总结

命令式关注过程,声明式关注结果。

声明式代码可维护性更高,但相对于命令式会有性能损耗,所以架构设计时保证可维护性同时最小化性能损失,也就是最小化找出差异的性能损耗。



相关文章
|
2天前
|
JavaScript
|
1天前
|
缓存 JavaScript 前端开发
前端框架与库 - Vue.js基础:模板语法、数据绑定
【7月更文挑战第14天】Vue.js 是渐进式框架,以简洁API和高效数据绑定知名。本文聚焦模板语法与数据绑定,解释常见问题和易错点,助力初学者避坑。模板语法中,{{ expression }} 用于渲染值,v-bind/: 用于动态绑定属性。数据绑定涉及文本、属性和事件,注意v-model适用于表单元素,计算属性有缓存。理解正确用法,借助文档和IDE,可提升开发质量和效率。善用Vue.js,打造响应式UI。
|
4天前
|
JavaScript
【vue】el-dialog 内的tinymce弹窗被遮挡的解决办法 及 tinymce打开弹出菜单后直接关闭对话组件,导致该弹出菜单残留
【vue】el-dialog 内的tinymce弹窗被遮挡的解决办法 及 tinymce打开弹出菜单后直接关闭对话组件,导致该弹出菜单残留
16 6
|
1天前
|
存储 缓存 JavaScript
vue代码优化方案
【7月更文挑战第13天】 **Vue.js 优化要点:** 分解大组件以提高复用性和加载速度;利用计算属性与侦听器优化数据处理;使用Object.freeze()减少响应式数据;借助Vuex或Composition API管理状态;实现虚拟滚动和无限加载提升长列表性能;路由懒加载减少初始加载时间;用Vue DevTools检测性能瓶颈;定期代码审查与重构;应用缓存策略;遵循最佳实践与团队规范,提升应用整体质量。
10 2
|
4天前
|
JavaScript 前端开发
【vue】 el-table解决分页不能筛选全部数据的问题
【vue】 el-table解决分页不能筛选全部数据的问题
15 4
|
4天前
|
JavaScript
【vue】 vue2 监听滚动条滚动事件
【vue】 vue2 监听滚动条滚动事件
10 1
|
4天前
|
JavaScript 定位技术
【天地图】vue 天地图 T is not defined
【天地图】vue 天地图 T is not defined
15 1
|
4天前
|
JavaScript 前端开发
【vue】 Tinymce 数据 回显问题 | 第一次正常回显后面,显示空白bug不能编辑
【vue】 Tinymce 数据 回显问题 | 第一次正常回显后面,显示空白bug不能编辑
11 0
|
9天前
|
数据采集 JavaScript 前端开发
Vue框架的优缺点是什么
【7月更文挑战第5天】 Vue框架:组件化开发利于重用与扩展,响应式数据绑定简化状态管理;学习曲线平缓,生态系统丰富,集成便捷,且具性能优化手段。缺点包括社区规模相对小,类型支持不足(Vue 3.x改善),路由和状态管理需额外配置,SEO支持有限。随着发展,部分缺点正被克服。
19 1
|
10天前
|
JavaScript
Vue卸载eslint的写法,单独安装eslint,单独卸载eslint
Vue卸载eslint的写法,单独安装eslint,单独卸载eslint