Skip to content

框架架构

常见的架构为三种,MVC,MVP,MVVM。后两者是 MVC 的变种。

MVCMVP

具体介绍参考:

MVP 中,模式将 Controller 改名为 Presenter,三层之间的通信,变为都是双向的。

具体来说,之前的 MVC 内部数据流是一个环,并且数据流动是随机的,随业务逻辑而变。MVP 变成了一个垂直的管道,数据流动为垂直双向,变得扁平化:modelview 无法直接互操作了,必须通过中间的 presenter 来连接。

MMVM

MVP 中,view 变化会影响 Presenter,而 Presenter 又会由于 Model 数据的更新,去改变 view。这个特点,是每一个基于 MVP 架构的项目都会有的,必须实现的一个逻辑。为什么不把它作为一个库单独实现出来,别人只要用提供的 API 就可以了呢?

MVP 的基础上,为视图层和 Presenter 提供了数据双向绑定的服务。这就是 MVVM 了。在 MVVM 中,当中间的控制层(叫法从 Presenter 变为 ViewModel)的相关变量变化的时候,MMVM 项目的默认内置库(比如 vue 框架)就会检测到该变量将会导致视图更新,就自动去更新;当视图 DOM 变化的时候,vue 捕获到它将影响 ViewModel,也就是我们在项目中声明的变量的值,就去更新。

MVVM:优势与缺陷

为什么要用它

我们知道,数据双向绑定不需要自己去实现。相对于之前需要自己去手动实现,然后在开发的过程中不断 debug、在 HTML DOM 代码和 js 逻辑上面反复横跳,MVVM代码开发速度可维护性 上都有质的飞跃。虽然现在仍然需要在 DOM 和 JS 之间跳,但更简单了,因为不需要调试 DOM 的响应式属性。这是 MVVM 的主要优势。

它会带来什么问题

内存

但是,对于使用第三方库实现数据双向绑定,不可避免的会产生临时数据 book-keeping data。也就是临时数据。

对于一个通用性和健壮性非常强的数据绑定库,其代价往往是需要占用更加多的内存,用于存放临时数据。尤其对于大型项目而言,在数据绑定收集依赖的过程中,我们不得不为每个对象产生几个、甚至几十个的临时变量和设置缓存,这会造成内存膨胀。

性能

对于简单的小项目,手动的实现响应式,和用第三方库实现响应式,显然后者的性能是绝对无法优于前者的,除非你 coding 能力实在太菜。因为后者需要考虑的东西太多了,而如果手动实现的话,就可以直接去针对元素进行操作,不仅更加定制化,而且更快,什么外部影响都不需要考虑。

这也构成了 vue3 把响应式从默认全部是响应式数据,变为可选 ref 声明的理由。并不是每一个数据都必须是响应式的,数据绑定操作是可选的,如果你想的话,可以自己手动实现自己的数据绑定(当然,我觉得很少有人为了追求那么点性能而这么做...vue 的响应式已经被证实可以用于大型项目,比如 某bili。)

Vue.js的目标是通过尽可能简单的 API 实现响应的数据绑定(MVVM)和可组合的视图组件(SFC)。