# 关于框架选型

# 几大框架的利弊

通常来说,框架选择是准备项目的第一步。说到框架,目前主流三大框架 Angular、React 和 Vue,先从个人理解来看看这三个框架。

# Angular

这里的 Angular 是指 Angular 2.0+版本,v1.0 我们通常称之为 AngularJS,目前已经不更新了,如果要使用建议大家还是使用 Angular。

Angular 相对 React 和 Vue,最初的设计是针对大型应用来进行的。要是你认识 JAVA 的话,像依赖注入这一套你会觉得很熟悉。当然到了 v2.0 以上的版本由于加入了很多的语法糖,看起来 AngularJS 和 Angular 相差很远,但是最核心的依赖注入模式还是相似的。

项目中使用 Angular,最大的体验感受则是项目有完备的结构和规范,新加入的成员能很快地通过复制粘贴完成功能的开发。有人说过,好的架构设计,能让高级程序员和初入门的程序员写出相似的代码,这样对于整体管理和项目的维护有非常好的体验。很多人说 Angular 难上手,其实主要在于开始的项目搭建、以及 Angular 独有的一套设计方案的理解。但是依赖注入的设计方式,我们几乎不用考虑很多数据和状态管理的问题。当然脏检查的方式曾经也带来性能问题,后面在加入树状的模块化、Zone.js 之后,即使没有虚拟 DOM,性能也是有大大的提升。

当初 AngularJS 拥有不少量的粉丝,但是在 AngularJS 到 Angular2 的断崖式升级下,不少的开发者开始弃用而投向 React、Vue 等框架。不得不说,Angular 这次升级是相当的激进,刚开始的时候连兼容方案都没有,虽然说核心的设计理念像依赖注入这种并没有很大的调整,但从 AngularJS 到 Angular2 几乎改变了所有的 API 和管理模式,同时引入了在当时还算前卫的 Typescript 以及各种语法糖,其实这样大胆的设计和自我革新,个人还是很佩服的。要往前走,有些东西最终还是要摒弃的。

从 Angular 框架设计大而全的角度来看的话,Vue 和 React 更多是小巧的模板框架,也可以通过灵活搭配路由、状态管理等工具,达到大型应用的管理。目前来说,社区也有比较好的解决方案,官方也有出相关的脚手架来快速构建应用。

# React

本人接触的 React 项目不是很多,但是 jsx、虚拟 DOM、函数式编程的设计,带来的震撼和冲击还是很大的。React 相对 Angular 最大的优势是轻量和性能,或许其实这么比较不大对,因为 React/Vue 和 Angular 不一样,Angular 是整套的解决方案,而 React/Vue 则是项目搭建中灵魂使用的前端模板工具。

# 也就是说,我们可以这么理解
Angular = React + react-router + Redux/Flux/Mobx = Vue + vue-router + Vuex/Redux

虚拟 DOM 主要解决了什么,它的原理又是怎样的,这些会涉及到浏览器的页面渲染原理,包括 DOM Tree、CSS Ruler Tree、Rendering Tree、Repaint、Reflow 等等,我们也在《前言 前端框架的出现》《第 1 章 Vue 框架介绍》介绍过,你需要去理解虚拟 DOM 为何能带来性能的提升,这常常会被作为面试题来问噢。

以上,你会在使用 React 的时候,接触到很多好的设计,去引领你进行更深入的思考。函数式编程的方式,也会不同程度地拓展你的思考方式,遇到问题的时候,能有更多的解决办法。至于社区建设,其实三大主流开源框架的社区都相当完善了。

# Vue

如果你熟悉 Angular 以及 React,你会发现 Vue 的设计和使用,其实很多地方看起来很像像是前两者的结合体。Vue 结合了两者的优势,同时通过超友好的入门体验打下了一片天地。

Vue 最大的特点是上手简单,不管是框架的设计和文档,都对新手极其友好。但是这并不代表它只是个简单的框架,当你需要实现一些更加深入的自定义功能时,你会发现它其实也有很好的功能支持。如果你还认为它只是把 Angular 和 React 的优势结合,在你深入使用甚至阅读源码的时候,你会慢慢发现里面处处都不缺 Vue 自己的思考,真的是个很棒的框架。

如果说你是个新手,那么 Vue 会是较好的选择。相比另外两个框架,Vue 最初的社区缺陷现在也早已不再是问题了,相关的脚手架、配套工具也都很完善,还有贴心的中文服务。

# 对比 Angular

(1) 更灵活的适应各种场景。Vue 的默认 API 适合纯前端背景的开发者/小快灵场景,配合 TypeScript 也可以适合传统 Java 后端背景的开发者/大型项目。
(2) 更低的培训成本,更快的上手速度。
(3) 底层的 Virtual DOM 在高级场景下提供更多的灵活性。
(4) 大型应用中与 TypeScript 的整合不如 Angular(Vue3.0 中会对 Typescript 支持更加友好)。

# 对比 React

(1) 对大部分常见场景都提供了事实标准方案。不需要额外自行调研选取方案,在必要情况下也可以换用自研方案。
(2) 模版提供更友好的学习曲线,同时暴露底层 Virtual DOM 用于高级场景(也支持 JSX)。
(3) 大型应用中与 TypeScript 的整合暂时不如 React(同样的 Vue3.0 中会增强)。
(4) 对标 React 16+,Vue 同样可以实现类似 Hooks 的逻辑复用机制(Vue3.0 支持时间分片)。

# 开源框架?

使用开源框架的好处是,有着完整详细的文档,同时有问题也能通过 issues 和 Stack Overflow 来查找。更多时候,我们选择一个框架,需要考虑项目大小、定位。**技术选型更多的在于团队,你要考虑这个团队的能力、大家对各个框架的熟悉程度、是否有强烈的倾向。**或者有能力的团队,也可以选择相对小众的框架。

当然也有些小伙伴喜欢自己造轮子,不过你们要记得,造轮子是要负责任的,你需要提供友好的文档和 API 给他人,不然对项目的维护来说,简直就是毁灭性的体验。有些热爱技术的小伙伴喜欢捣鼓新东西,个人的体验(填坑体验)是,我们尽量在对这些新技术有较好地把握之后,再尝试一点点加入我们的项目里。项目尤其是工程项目,大多数是解决某些问题,我们需要在满足业务和项目维护性的同时,来做一些新的尝试。

# 技术选型?

其实前端发展到现在,几大框架之间的差距越来越小,好的方案相互学习、不好的地方自行调整。从实现的功能上来看,Angular、React、Vue 并没有太大的区别,更多的是框架在设计的时候引入的一些概念带来的入门难度。

所以,技术选型在很多时候更多的是对业务和团队成员的考虑,包括 Typescript 等的使用,都是对配合的协助。大家一致性通过或者协商后的方案,才是最适合的方案。到后面更多的是维护成本,这个时候需要做些整理和抽象,这时候规范的重要性就随着项目的壮大、成员的增加愈发地体现出来了。技术选型,跟团队成员是无法脱离的。