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。

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

总结

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

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



相关文章
|
4天前
|
JavaScript 前端开发 开发者
前端框架对比:Vue.js与Angular的优劣分析与选择建议
【10月更文挑战第27天】在前端开发领域,Vue.js和Angular是两个备受瞩目的框架。本文对比了两者的优劣,Vue.js以轻量级和易上手著称,适合快速开发小型到中型项目;Angular则由Google支持,功能全面,适合大型企业级应用。选择时需考虑项目需求、团队熟悉度和长期维护等因素。
11 1
|
5天前
|
前端开发 数据库
芋道框架审批流如何实现(Cloud+Vue3)
芋道框架审批流如何实现(Cloud+Vue3)
17 3
|
6天前
|
缓存 JavaScript UED
Vue 中实现组件的懒加载
【10月更文挑战第23天】组件的懒加载是 Vue 应用中提高性能的重要手段之一。通过合理运用动态导入、路由配置等方式,可以实现组件的按需加载,减少资源浪费,提高应用的响应速度和用户体验。在实际应用中,需要根据具体情况选择合适的懒加载方式,并结合性能优化的其他措施,以打造更高效、更优质的 Vue 应用。
|
6天前
|
JavaScript
如何在 Vue 中使用具名插槽
【10月更文挑战第25天】通过使用具名插槽,你可以更好地组织和定制组件的模板结构,使组件更具灵活性和可复用性。同时,具名插槽也有助于提高代码的可读性和可维护性。
13 2
|
6天前
|
JavaScript
Vue 中的插槽
【10月更文挑战第25天】插槽的使用可以大大提高组件的复用性和灵活性,使你能够根据具体需求在组件中插入不同的内容,同时保持组件的结构和样式的一致性。
11 2
|
6天前
|
前端开发 JavaScript 容器
在 vite+vue 中使用@originjs/vite-plugin-federation 模块联邦
【10月更文挑战第25天】模块联邦是一种强大的技术,它允许将不同的微前端模块组合在一起,形成一个统一的应用。在 vite+vue 项目中,使用@originjs/vite-plugin-federation 模块联邦可以实现高效的模块共享和组合。通过本文的介绍,相信你已经了解了如何在 vite+vue 项目中使用@originjs/vite-plugin-federation 模块联邦,包括安装、配置和使用等方面。在实际开发中,你可以根据自己的需求和项目的特点,灵活地使用模块联邦,提高项目的可维护性和扩展性。
|
6天前
|
缓存 JavaScript UED
Vue 中异步加载模块的方式
【10月更文挑战第23天】这些异步加载模块的方式各有特点和适用场景,可以根据项目的需求和架构选择合适的方法来实现模块的异步加载,以提高应用的性能和用户体验
|
6天前
|
JavaScript 测试技术 UED
解决 Vue 项目中 Tree shaking 无法去除某些模块
【10月更文挑战第23天】解决 Vue 项目中 Tree shaking 无法去除某些模块的问题需要综合考虑多种因素,通过仔细分析、排查和优化,逐步提高 Tree shaking 的效果,为项目带来更好的性能和用户体验。同时,持续关注和学习相关技术的发展,不断探索新的解决方案,以适应不断变化的项目需求。
|
5天前
|
JavaScript 前端开发 API
前端框架对比:Vue.js与Angular的优劣分析与选择建议
【10月更文挑战第26天】前端技术的飞速发展让开发者在构建用户界面时有了更多选择。本文对比了Vue.js和Angular两大框架,介绍了它们的特点和优劣,并给出了在实际项目中如何选择的建议。Vue.js轻量级、易上手,适合小型项目;Angular结构化、功能强大,适合大型项目。
11 0
|
Web App开发 JavaScript 前端开发
Vue框架快速入门
Vue是现在最流行的前端框架之一,而且相对于其他两个框架React和Angular来说也更加易学,而且它的作者是国人,中文文档也很完善。当然Vue框架算是比较高级的框架,所以在使用过程中还需要JavaScript、JavaScript 2015、WebPack、NodeJS、npm、ESLint、JavaScript单元测试框架等其他知识和框架的使用方法。
1338 0