1.谈谈你对Vue的理解?
Vue是一套用于构建用户界面的渐进式框架,Vue的核心只关注视图层。
渐进式框架:web应用程序被分解为许多可重用的模块,这样子的模块可以被多个应用程序共享,提高了开发效率,且这种框架不强求开发者一次性集成全部的功能,而是根据实际需要,按需引入使用。比如说vue-router:路由模块,pinia:全局状态管理模块...这些模块完全可以在项目之初不引入使用,如果项目需要再引入使用。
1.1 声明式框架
Vue的核心特定是用起来简单。因为Vue是声明式框架。于是你需要区分声明式框架和命令式框架的区别。
声明式代码注重结果,命令式代码关注过程。
// 需求:实现数组内数字的累加
let numbers = [1,2,3,4,5]
let total = 0
// 命令式编程:
for( let i = 0; i < numbers.length; i++ ){
total += numbers[i]
}
console.log(total)
// 声明式编程:
let total = numbers.reduce( (pre, cur) => {
return pre + cur
},0)
console.log(total)
从上方的例子可以看出,命令式一步步执行代码实现累加的这个过程,最终获得结果。而声明式编程的思路是通过数组类型封装好的reduce()方法实现累加,获得结果。但是两者的区别显而易见,声明式不关注实现,命令式关注实现的过程。
1.2 MVVM模式
MVVM的起源其实是MVC,而MVC最开始其实是后端的框架。
MVC:M(Model) V(View) C(Controller),采用MVC模式的目的其实是为了划分职责,分层管理。用户请求资源是通过控制层(Controller),控制层要从数据模型(Model)中获取数据,之后反馈给视图层(View)。
那么从前端的角度来看MVC模式,前端关注的事情其实就是如何将数据同步到页面上,这其实是借鉴了MVC的思想。
MVVM:其实是MVC模式的改进版。M(Model) - V(View) - VM(ViewModel),ViewModel连接了数据和视图,作为二者之间的桥梁。
Vue的设计借鉴了MVVM模式,但并不全是MVVM模式。
1.3 采用虚拟DOM
传统的项目更新页面会拼接一个完整的字符串innerHTML,之后全部重新渲染。在使用了虚拟DOM之后,相当于添加了一个缓存层,可以比较新旧DOM节点的区别,找到变化的节点进行更新(diff算法)。
1.4 组件化
实现高内聚、低耦合、单向数据流
- 组件化开发能提高应用的开发效率、测试性、复用性等
- 降低更新范围,只重新渲染有变化的组件
2.谈谈你对SPA的理解?
2.1 基本概念
- SPA(Single Page Application)单页应用。一般情况下,Vue和React的项目都只有一个HTML页面,并且只有一个挂载点,最终打包后会在此页面中引入对应资源。也换页面通过监听前端路由的变化渲染对应页面,称为客户端渲染CSR(Client Side Rendering)。
- MPA(Multi Page Application)多页应用。多个HTML页面,每个页面必须重复加载js,css等相关资源。多页应用的页面跳转需要刷新整页资源,称为服务端渲染SSR(Server Side Rendering)。
2.2 优缺点
| 单页应用(SPA) | 多页应用(MPA) | |
|---|---|---|
| 组成 | 一个主页面和页面组件 | 多个完整的页面 |
| 刷新方式 | 局部刷新 | 整页刷新 |
| SEO搜索引擎优化 | 无法实现 | 容易实现 |
| 页面切换 | 速度快、用户体验良好 | 切换加载资源速度慢,用户体验差 |
| 维护成本 | 相对容易 | 相对复杂 |
SPA应用虽然体验好,维护成本低,但是首屏白屏时间长,不利于SEO优化。针对这两个问题的解决方法有如下两种:
- 静态页面预渲染(Static Site Generation)SSG,在打包的时候生成完整的HTML页面,不过这种方式仅适合静态页面网站,变化率不高的王章,比如说企业门户网站这种,像新闻网这种就不适合。
- SSR + CSR结合的方式。首屏采用服务端渲染的方式,后续的交互采用客户端渲染的方式。 (Nuxt.js)