1.3 Vue与React
在MVVM框架一族中,Vue.js的表现十分优秀。在1.3和1.4小节中,我们将分别看到Vue和React以及Vue和Angular的对比表现。
Vue和React都是轻量级框架,不过总体来看,Vue的性能是要高于React的,笔者简单罗列了以下几点。
1.3.1 虚拟DOM
在处理用户界面时,DOM操作成本是最高的,两者都在渲染流程中采用虚拟DOM以降低页面开销,如图1.11所示。不过,Vue的虚拟DOM实现的层级更高一些,这也意味着Vue比React更轻量,性能更高一些。
图1.11 渲染流程
1.3.2 功能性组件
两者都提供一些功能性组件以减少用户开销。笔者运行GitHub上的一个测试项目(https://github.com/chrisvfritz/vue-render-performance-comparisons),该项目将渲染10000个列表条目100次,得到的测试结果如下,如表1.1所示。
表1.1 测试结果
React和Vue的速度都很快,不过显然Vue的渲染速度要更快一些,这是因为React中有大量用于提供警告和错误提示信息的检查机制。
1.3.3 轻量级——将与核心库无关的业务封装成独立库
React和Vue都将着重点放在核心库上,也都有专门负责路由和全局状态管理等功能的配套库。例如,与React配套的有React Router、Redux,与Vue配套的有Vue Router、Vuex。
1.3.4 视图模板
React采用JSX渲染组件,而Vue则采用模板,比如.vue后缀的文件。
JSX是使用XML语法编写Javascript的一种语法糖。语法如下:
class HelloMessage extends React.Component { render() { return ( <div> Hello {this.props.name} </div> ); }} ReactDOM.render( <HelloMessage name="Taylor" />, mountNode );
通过JSX,我们可以只用Javascript来构建视图组件。不过,对于从传统HTML+ CSS+JS分离开发走向组件化开发的前端工程师来说,这种语法感觉并不友好。
Vue提供了更简单的模板。语法如下:
<template> <div class="demo-title">{{title}}</div> </template> <script> export default { data () { return { title: 'Hello World' } } } </script> <style scoped> .demo-title { font-size: 24px; font-weight: 600; } </style>
Vue模板更贴合HTML,而不是用更高层的东西去封装它,学习曲线十分平缓。在Vue模板的style标签上标注scoped属性可划分作用域,使CSS样式表只作用于当前组件(具体实现机制将在后续章节中描述)。
由于Vue模板更贴近原生,因此,我们很容易混入其他一些东西,比如HTML的预处理器(Pug/Jade等)、CSS的预处理器(LESS、SASS/SCSS等),以及更高版本(高级)的脚本语言(TypeScript、ES6 Javascript等)。Vue模板的语法也更符合传统开发习惯,并易于团队分析和代码维护。
1.3.5 其他
除框架本身外,Vue在其他方面也占据了一些优势,比如Vue的状态管理库vuex和路由库vue-router都是由官方维护更新,从而保证了这些库与Vue本身的统一性。而React的相关库则由社区进行维护,不过,这也使得React的社区生态更加繁荣一些。
此外,Vue提供了项目快速构建工具——vue-cli脚手架,提供了包含npm依赖管理、webpack模块打包、vue-router前端路由、eslint语法检测、单元测试等集成功能,能够让开发者快速构建一个高质量的项目环境。