MVVM,MVC都是软件架构设计模式,它们的主要作用都是分离视图和业务逻辑。
MVC
首先说一下MVC模式,它是一种传统的软件架构模式,它有三个基本的部分,模型,视图,和控制器。
- 模型:主要是用来封装程序的业务逻辑和相关的数据,一旦有数据变动,就会通知有关的视图
- 视图:主要负责数据的展示,并且响应用户的操作
- 控制器:控制器是模型和视图之间的纽带,接收视图传过来的用户事件并且传递给模型,同时,接收从模型传来的最新数据,用来更新更新视图
基本是这样一个流程:
- view接受用户交互请求
- view将请求交给controller
- controller操作model更新数据
- 数据更新后,model通知view更新视图
- view更新变化数据
缺点:
- 视图中也会包含一些业务逻辑,导致后期修改比较复杂困难,可复用程度低
- 视图和控制层并没有完全分离,解耦程度不够
- 单向通信(既model绑定到view,当我们用js更新model时,view会自动更新,但是当view变动时,model不会自动更新)
MVVM
MVVM是当下比较流行的一种架构设计模式,它也有三个基本的部分,视图,模型,模型视图
- 模型:仅仅只关注数据本身,不关心任何行为
- 视图:MVVM模式中的视图通过使用模板语法来渲染数据,当viewmodel对model进行更新的时候,会通过数据绑定更新到view
- viewmodel:ViewModel 是一个同步View 和 Model的对象,通过数据绑定将view和model链接起来,
基本是这样一个流程:
- View 接收用户交互请求
- View 将请求转交给ViewModel
- ViewModel 操作Model数据更新
- Model 更新完数据,通知ViewModel数据发生变化
- ViewModel 更新View数据
实现数据绑定的方式:
- 数据劫持vue
- 发布订阅者模式
- 脏值检查angualr
优点:
- 双向通信(viewModel和view绑定)
- 低耦合,view可以独立于model的变化和修改,一个ViewModel可以绑定到不同的”View”上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。
- 可复用性,可以将一些可复用的逻辑放在一个 ViewModel 中,让多个 View 复用这个 ViewModel。
- 独立开发,开发人员可以专注于业务逻辑和数据的开发,而不用去管数据的流向
缺点: viewmodel会越加庞大,调用的复杂度增加。
但是MVVM不是万能的,它的目的是为了解决复杂的前端逻辑。对于以展示逻辑为主的页面,例如,新闻,博客、文档等,不能使用MVVM展示数据,因为这些页面需要被搜索引擎索引,而搜索引擎无法获取使用MVVM并通过API加载的数据。
引申问题:
- 前端基于MVC/MVVM架构,如何做SEO优化?
搜索引擎的基础爬虫的原理就是抓取网页的html源代码并解析。但一般来说搜索引擎是不回去执行请求到的js的。ps:谷歌搜索引擎已经具备识别JavaScript的能力了
1.简单一点的可以用Prerender预渲染,它可以帮忙把页面渲染完成之后再返回给爬虫工具,我们的页面也就能被解析到了。
2.复杂一点的话,可以用服务端渲染SSR
- 什么是服务端渲染?
简单的理解就是通过服务器生成html字符串,再发送到浏览器。
- 服务端渲染利弊?
1.有利于seo,有利于首屏渲染,
2.服务端压力大,尤其是高并发的情况下,会打量占用资源
3.学习成本比较高,除了要知道前端技术,还要学习一些后端的技术,而且项目的构建和部署会变得复杂。