随着前端技术的发展,纯粹的HTML+CSS+JavaScript已经不能完全满足应用的需要,特别是针对大型的网站,代码量巨大,开发也会非常复杂,因此,前端框架的概念与体系应运而生。框架能够封装功能,基于组件技术可以大大优化和简化应用程序的开发。前端框架一般是指用于简化网页设计的框架,往往会封装一些网页开发的功能,如BootStrap框架封装了大量的样式,能够简化CSS的设计,提供各种漂亮的控件(如按钮、表单等)和实用的网站开发技术(如菜单设计、轮播等技术)。目前,市场三大前端主流框架分别是AngularJS、React和Vue。
1)AngularJS诞生于2009年,由Misko Hevery等人创建,后被Google公司收购,是一个应用设计框架与开发平台,用于创建高效、复杂、精致的单页面应用。AngularJS通过新的属性和表达式扩展了HTML,实现了一套框架在多种平台(移动端和桌面端)的应用。它有诸多特性,最为核心的是MVVM模式、模块化、自动化双向数据绑定、语义化标签、依赖注入等。
2)React是用于构建用户界面的JavaScript库,起源于Facebook公司的内部项目,用于架设Instagram的网站,于2013年5月开源。React主要用于构建UI,可以在React中传递多种类型的参数,如渲染UI、传递静态HTML DOM元素、动态变量,以及可交互的应用组件等。
3)Vue的早期开发灵感来源AngularJS,于2014年上线,它解决了AngularJS中存在的许多问题。秉承了AngularJS和React两个框架的优势,代码简洁、上手容易,上市后即在市场上得到了广泛的应用。
三个框架的简单比较如表1-1所示。
表1-1 AngularJS、React和Vue比较
Vue.js的作者是尤雨溪,也是Vite的作者和HTML5版Clear的打造人,是独立开源开发者,曾就职于Google Creative Labs和Meteor Development Group,大学所学专业是室内艺术和艺术史,硕士所学专业是美术设计和技术,读硕士期间偶然接触到了JavaScript,并被这门编程语言所深深吸引,工作中接触了大量的开源JavaScript项目,因而也走上了开源之路,开启了自己的前端生涯。他于2014年2月开发了Vue.js前端开发库,现全职开发和维护Vue.js。
Vue(读音/vjuː/,音同view)是一套用于构建用户界面的渐进式框架,可以自底向上逐层应用。其核心库只关注视图层,易于上手,便于与第三方库或既有项目整合。与现代化的工具链以及各种支持类库结合使用时,Vue能够完全为复杂的单页应用提供驱动。
建议在学习Vue前先学习HTML、CSS和JavaScript中级的知识。
Vue.js提供了一个MVVM(Model View ViewModel的简写)模式的双向数据绑定JavaScript库。MVVM是Presentation Model设计模式的演变,与Presentation Model一样,MVVM抽象了视图(View)的状态和行为,但是,简化了用户界面的事件驱动编程方式,更专注于View层。其核心是MVVM中的视图模型(ViewModel, VM)层,VM负责连接视图层和模型层(Model),提供对View和ViewModel的双向数据绑定,能够保证视图和数据的一致性,让前端开发更加高效、便捷。
MVVM模式如图1-1所示,Vue实际对应其中的VM,因此,在官方文档中经常可以看到使用vm这个变量名来表示Vue实例。视图层代表视图、模板,负责将数据模型转化为UI展现出来。模型层代表模型、数据,可以定义数据修改和操作的业务逻辑。视图模型层连接视图和模型,通过双向数据绑定将视图层和模型层连接起来,视图层通过视图模型层从模型层获取数据并进行显示,模型层通过视图模型层获取视图层数据并进行处理。通过视图模型层,视图层和模型层数据实现了自动同步,开发者不再需要手动操作DOM,只需要关注业务逻辑即可,复杂的数据状态维护交给MVVM来统一管理,大大简化了应用的开发。
图1-1 MVVM模式
1.Vue与React
Vue和React有许多相似之处,都使用Virtual DOM,都提供了响应式(Reactive)和组件化(Composable)的视图组件,将其他功能如路由和全局状态管理交给相关的库,从而能够将开发者的注意力集中在核心库。鉴于其众多的相似处,这里对其进行简单的比较。
(1)运行时性能
Vue和React运行都非常快,都具有优秀的运行性能,但是优化方面有区别。React的某个组件状态发生变化时会以该组件为根,重新渲染整个组件子树,想要避免不必要的子组件重渲染,就需要使用PureComponent或实现shouldComponentUpdate方法,而且有限定条件,如可能需要使用不可变的数据结构、保证组件的整个子树渲染输出都由组件的props决定等,组件的优化非常复杂。Vue组件的依赖在渲染过程中能自动追踪,系统能够精确知道哪个组件需要重新渲染,开发者不需要考虑此类优化,从而能够更好地专注于应用本身。
(2)HTML与CSS
React中一切都是JavaScript,HTML可以用JSX来表达,CSS也越来越多地被纳入到JavaScript中来处理,因此学习React就需要掌握相关语法。Vue的整体思想是拥抱经典Web技术,并在其上进行扩展,对于很多习惯了HTML的开发者来说,开发更为自然,且基于HTML的模板使得将已有的应用迁移到Vue更为容易。针对组件作用域内的CSS,React通过CSS-in-JS的方案实现CSS作用域,与普通CSS撰写过程不同,引入了新的面向组件的样式范例。Vue设置样式的默认方法是单文件组件(类似style属性的标签),样式设置更为灵活,通过vue-loader可以使用任意预处理器、后处理器,甚至可以将CSS Modules深度集成在<style>标签内,使用更为方便。
(3)规模
向上扩展方面,Vue和React都提供了应对大型应用的强大路由。React提供了Flux、Redux等状态管理模式,这些模式可以非常容易地集成在Web应用中,Vue拓展了状态管理模式(Vuex),开发体验更好。Vue还提供了CLI脚手架,通过交互式的脚手架可以方便地构建项目和快速开发组件原型,React的create-react-app尚存在一些局限性。
向下扩展方面,React的学习曲线陡峭,开始学React前需要知道JSX和ES2015,Vue向下扩展后类似于jQuery,只需要引入类库就可以运行程序,可以是本地类库,也可以是在线类库。以下代码引入在线类库。
特别是将Vue开发环境代码应用到生产环境中只需要用min版Vue文件替换开发环境的Vue类库文件即可,不需要担心其他性能问题,更为方便。
(4)原生渲染
React Native能使用相同的组件模型编写具有本地渲染能力的App(iOS和Android),能同时跨多平台开发,开发效率非常高。Vue和Weex进行了官方合作(Weex是阿里巴巴发起的跨平台用户界面开发框架),允许使用Vue语法开发可以运行在浏览器端、iOS和Android上的原生应用组件。
2.Vue与AngularJS
AngularJS是Vue早期开发的灵感来源,Vue的一些语法和AngularJS很类似,这里也对其进行简单比较。
(1)复杂性
在API与设计上,Vue.js都比AngularJS简单得多。
(2)灵活性和模块化
Vue.js是一个更加灵活、开放的解决方案,允许以任意方式组织应用程序,提供了Vue CLI搭建应用项目,能够使多样化的构建工具通过妥善的默认配置无缝协作,节约了用户在配置上的时间花费。同时还提供配置的灵活性,方便特殊的应用搭建需求。AngularJS需要遵循AngularJS制定的规则,灵活性不及Vue。
(3)数据绑定
AngularJS使用双向数据流,Vue使用单向数据流,应用中的数据流更加清晰易懂。
(4)指令与组件
Vue中的指令和组件划分更为清晰,指令用于封装DOM操作,组件是一个具有视图和数据逻辑的独立单元。AngularJS中每件事都由指令来做,组件是一种特殊的指令,Angular(Angular 2)采用了和AngularJS完全不同的框架,也具有优秀的组件系统。
(5)运行时性能
Vue使用基于依赖追踪的观察系统,队列异步更新,所有数据变化独立触发,不使用脏检查,具有更好的性能,非常容易优化。AngularJS中watcher增加时会变得越来越慢,特别是一些watcher触发另一个更新时,脏检查循环(digest cycle)可能需要运行多次,效率会非常低。
3.Vue的优势
通过前面的比较,可以简单总结Vue的优势如下。
1)Vue是一款轻量级框架,使用相对简单、直接,学习成本低,更加友好。
2)Vue可以进行组件化开发,将数据与结构进行了分离,代码量更少,开发效率更高。
3)Vue是一个MVVM框架,可以实现数据双向绑定,使视图和数据同步变化,在进行表单处理时非常方便。
4)Vue是单页面应用,使用路由进行页面局部刷新,不必每次都请求数据,加快了访问速度,提升了用户体验。
5)Vue使用虚拟DOM,浏览器不必多次渲染DOM树,页面更为流畅,用户体验更好。
6)Vue的运行速度更快,性能更为优化。