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。

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

总结

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

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



相关文章
|
7天前
|
缓存 JavaScript 前端开发
vue学习第四章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中计算属性的基本与复杂使用、setter/getter、与methods的对比及与侦听器的总结。如果你觉得有用,请关注我,将持续更新更多优质内容!🎉🎉🎉
vue学习第四章
|
7天前
|
JavaScript 前端开发
vue学习第九章(v-model)
欢迎来到我的博客,我是瑞雨溪,一名热爱JavaScript与Vue的大一学生,自学前端2年半,正向全栈进发。此篇介绍v-model在不同表单元素中的应用及修饰符的使用,希望能对你有所帮助。关注我,持续更新中!🎉🎉🎉
vue学习第九章(v-model)
|
7天前
|
JavaScript 前端开发 开发者
vue学习第十章(组件开发)
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。本文深入讲解Vue组件的基本使用、全局与局部组件、父子组件通信及数据传递等内容,适合前端开发者学习参考。持续更新中,期待您的关注!🎉🎉🎉
vue学习第十章(组件开发)
|
13天前
|
JavaScript 前端开发
如何在 Vue 项目中配置 Tree Shaking?
通过以上针对 Webpack 或 Rollup 的配置方法,就可以在 Vue 项目中有效地启用 Tree Shaking,从而优化项目的打包体积,提高项目的性能和加载速度。在实际配置过程中,需要根据项目的具体情况和需求,对配置进行适当的调整和优化。
|
13天前
|
存储 缓存 JavaScript
如何在大型 Vue 应用中有效地管理计算属性和侦听器
在大型 Vue 应用中,合理管理计算属性和侦听器是优化性能和维护性的关键。本文介绍了如何通过模块化、状态管理和避免冗余计算等方法,有效提升应用的响应性和可维护性。
|
12天前
|
JavaScript 前端开发 UED
vue学习第二章
欢迎来到我的博客!我是一名自学了2年半前端的大一学生,熟悉JavaScript与Vue,目前正在向全栈方向发展。如果你从我的博客中有所收获,欢迎关注我,我将持续更新更多优质文章。你的支持是我最大的动力!🎉🎉🎉
|
12天前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript和Vue的大一学生。自学前端2年半,熟悉JavaScript与Vue,正向全栈方向发展。博客内容涵盖Vue基础、列表展示及计数器案例等,希望能对你有所帮助。关注我,持续更新中!🎉🎉🎉
|
存储 前端开发 JavaScript
为什么我不再用Vue,改用React?
当我走进现代前端开发行业的时候,我做了一个每位开发人员都要做的决策:选择一个合适的框架。当时正逢 jQuery 被淘汰,前端开发者们不再用它编写难看的、非结构化的老式 JavaScript 程序了。
|
13天前
|
存储 缓存 JavaScript
在 Vue 中使用 computed 和 watch 时,性能问题探讨
本文探讨了在 Vue.js 中使用 computed 计算属性和 watch 监听器时可能遇到的性能问题,并提供了优化建议,帮助开发者提高应用性能。
|
13天前
|
存储 缓存 JavaScript
Vue 中 computed 和 watch 的差异
Vue 中的 `computed` 和 `watch` 都用于处理数据变化,但使用场景不同。`computed` 用于计算属性,依赖于其他数据自动更新;`watch` 用于监听数据变化,执行异步或复杂操作。
下一篇
无影云桌面