@
shuangya #51
@
Hanggi #56
事先声明,以下内容仅代表个人见解,为方便表述使用了一些可能会存在歧义的名词或者概念。
事先声明,一直对 vue 的创始人以及使用 vue 的技术群体充满了敬畏之情,万一说错了什么,敬请谅解。
JQuery/Vue/React/Angular 属于基于浏览器端 DOM/BOM 接口的“交互向”或者“视觉向”的前端应用开发框架,这四者可以作比较。
EggJS/NestJS 可以放在一起作比较,主要是在用来开发服务器端 NodeJS 环境下业务系统,统称为“数据向”的前端框架。
Redux 只能算是针对 React 某一部分功能的加强或者扩展,同样与 JQuery/Vue/React/Angular 不是一类产品。
如果把 JQuery/Vue/React/Angular 比作战斗机的话,egg/nestjs 就可以比作坦克,毕竟两者的战场完全不一样。
总之,不是一类的东西放在一起比较没有意义。
先比较 JQuery/Vue/React/Angular 四个框架之间的差异。
每一代浏览器端前端框架都解决了至少一个核心技术难点,就好比每一代战机都会在至少一个核心技术方面有重大突破一样,可能是发动机、隐身、雷达、武器等方面中的任何一种或者多种。
话题回到浏览器端前端框架的问题,这里说的“分代”,不是指的产品,而是指的产品背后的技术思想。
JQuery 所代表的的三代技术思想主要解决的是垮浏览器端 DOM 接口的兼容性问题。
Backbone 属于三代半,在 jq 的思想基础之上,实现了基于数据绑定思想的 MV*架构。
判定四代的标准是不依赖 jq 操作 DOM (但仍然要操作 DOM,也就是所谓的虚拟 DOM ),同时实现了基于数据绑定思想的各种 MV*架构。
发展初期的 Vue/React/Angular 站在同一起跑线上,均属于四代,但由于种种原因早已渐行渐远了。
Vue 核心思想就是速成,快速上手、高速开发。
Angular 在三四代技术思想之上,核心发展思想是创建规范化的前端工程开发流程,写出尽可能优秀的代码。换句话说就是开发前端应用的时候要有开发系统软件、桌面软件、服务器端业务系统一样的“硬姿势”,导致的结果就是开发工作颗粒度太细,开发效率低,学习曲线陡等问题,导致大多数开发者在潜移默化中把开发出良好用户体验的前端应用的目标调整成了写出符合 ng 标准的代码,代码质量确实提高了,但开发出来的东西用户不买账,或者开发出用户满意的东西工期太长。
可以看出 Angular 和 Vue 在某些层面是站在绝对的对立面的。
Angular 后续版本重点解决的是自身的性能问题,比如 ng8 引入,ng9 扶正的 Ivy 引擎,对于 API 用户来说没有思想上的改变。
Vue 的后续版本则是类似于 IE6789 风格的升级。
v16 之前的 react 核心技术思想是单向数据流,还有 JSX 勉强也算,redux 则不是 react 官方的东西。
为什么说 v16+的 React 属于五代技术思想?
v16 之后有三个很重要的东西,Fiber/Hook/Concurrent,网上有很多优秀的分析文章,这里不再赘述。
React 把近十几年优秀的前端开发思想集成到了一起,而非通过打包工具、第三方库、语法糖、接口等方式把这些思想层面简单粗暴的堆到一起,毕竟前端开发是门手艺活儿,手艺人需要的是灵活发挥的空间,以及齐全趁手的工具。
再就是与浏览器端 JS 开发的层叠样式设计开发、交互动画设计开发等方面的技术问题,开发流程、代码架构等思想上应该是统一的,React 实现了这一点。
这里扩展说一下,CSS 的布局思想由 BFC 发展到 FFC 再发展到 GFC,与 React 的单向数据流思想不谋而合。
更进一步说,UI 设计,布局设计,动画设计,交互设计,以及状态管理策略设计,应遵循单向数据流风格的开发流程,React 可以保证这一类型的开发流程的顺利递进,而 Vue/Angular 不行,它们只关心怎么写 JS/TS 代码。