Vue应用的默认选项是把markup放在HTML文件中。数据绑定表达式采用的是和Angular类似的mustache语法,而指令(特殊的HTML属性)用来向模板添加功能。前端
下面的示例是一个简单的Vue应用。它会展现message和一个用来reverse message的按钮:react
// HTML
<div id="app">
<p>{{ message }}</p>
<button v-on:click="reverseMessage">Reverse Message</button>
</div>
// JS
new Vue({
el: '#app',
data: {
message: 'Hello Vue.js!'
},
methods: {
reverseMessage: function () {
this.message = this.message.split('').reverse().join('');
}
}
});
相比之下,React应用不使用模板,它要求开发者借助JSX在JavaScript中建立DOM。下面是用React实现的一样的应用:jquery
// HTML
<div id="app"></div>
// JS (pre-transpilation)
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
message: 'Hello React.js!'
};
}
reverseMessage() {
this.setState({
message: this.state.message.split('').reverse().join('')
});
}
render() {
return (
<div>
<p>{this.state.message}</p>
<button onClick={() => this.reverseMessage()}>
Reverse Message
</button>
</div>
)
}
}
ReactDOM.render(App, document.getElementById('app'));
对于来自标准Web开发方式的新开发者,模板更容易理解。可是一些资深开发者也喜欢模板,由于模板能够更好的把布局和功能分割开来,还可使用Pug之类的模板引擎。android
可是使用模板的代价是不得不学习全部的HTML扩展语法,而渲染函数只须要会标准的HTML和JavaScript。并且比起模板,渲染函数更加容易调试和测试。固然你不该该由于这方面的缘由错过Vue,由于在Vue2.0中提供了使用模板或者渲染函数的选项。ios
一个简单的Vue项目能够不须要转译直接运行在浏览器中,因此使用Vue能够像使用jQuery同样简单。固然这对于React来讲在技术上也是可行的,可是典型的React代码是重度依赖于JSX和诸如class之类的ES6特性的。react-native
Vue的简单在程序设计的时候体现更深,让咱们来比较一下两个框架是怎样处理应用数据的(也就是state)。数组
React中的state是不可变(immutable)的,因此不能直接改变,须要使用API中的setState方法:浏览器
this.setState({
message: this.state.message.split('').reverse().join('')
});
React中是经过比较当前state和前一个state来决定什么时候在DOM中进行重渲染以及渲染的内容,所以须要不可变(immutable)的state。前端框架
Vue中的数据是可变(mutated)的,因此一样的操做看起来更加简洁。app
// Note that data properties are available as properties of
// the Vue instance
this.message = this.message.split('').reverse().join('');
让咱们来看看Vue中是如何进行状态管理的。当向state添加一个新对象的时候,Vue将遍历其中的全部属性而且转换为getter,setter方法,如今Vue的响应系统开始保持对state的跟踪了,当state中的内容发生变化的时候就会自动从新渲染DOM。使人称道的是,Vue中改变state的状态的操做不只更加简洁,并且它的从新渲染系统也比React 的更快更有效率。
Vue的响应系统还有有些坑的,例如:它不能检测属性的添加和删除和某些数组更改。这时候就要用到Vue API中的相似于React的set方法来解决。
当应用程序的状态改变时,React和Vue都将构建一个虚拟DOM并同步到真实DOM中。 二者都有各自的方法优化这个过程。
Vue核心开发者提供了一个benchmark测试,能够看出Vue的渲染系统比React的更快。测试方法是10000个项目的列表渲染100次,结果以下图。
从实用的观点来看,这种benchmark只和边缘状况有关,大部分应用程序中不会常常进行这种操做,因此这不该该被视为一个重要的比较点。可是,页面大小是与全部项目有关的,这方面Vue再次领先,它目前的版本压缩后只有25.6KB。React要实现一样的功能,你须要React DOM(37.4KB)和React with Addon库(11.4KB),共计44.8KB,几乎是Vue的两倍大。双倍的体积并不能带来双倍的功能。
像文章开头那种同时用Vue和React实现的简单应用程序,可能会让一个开发者潜意识中更加倾向于Vue。这是由于基于模板的应用程序第一眼看上去更加好理解,并且能很快跑起来。可是这些好处引入的技术债会阻碍应用扩展到更大的规模。模板容易出现很难注意到的运行时错误,同时也很难去测试,重构和分解。
相比之下,Javascript模板能够组织成具备很好的分解性和干(DRY)代码的组件,干代码的可重用性和可测试性更好。Vue也有组件系统和渲染函数,可是React的渲染系统可配置性更强,还有诸如浅(shallow)渲染的特性,和React的测试工具结合起来使用,使代码的可测试性和可维护性更好。
与此同时,React的immutable应用状态可能写起来不够简洁,但它在大型应用中意义非凡,由于透明度和可测试性在大型项目中变得相当重要。
React Native是一个使用Javascript构建移动端原生应用程序(iOS,Android)的库。 它与React.js相同,只是不使用Web组件,而是使用原生组件。 若是你学过React.js,很快就能上手React Native,反之亦然。
// JS
import React, { Component } from 'react';
import { AppRegistry, Text, View } from 'react-native';
class HelloWorld extends Component {
render() {
return (
<View>
<Text>Hello, React Native!</Text>
</View>
);
}
}
AppRegistry.registerComponent('HelloWorld', () => HelloWorld);
它的意义在于,开发者只须要一套知识和工具就能开发Web应用和移动端原生应用。若是你想同时作Web端开发和移动端开发,React为你准备了一份大礼。
阿里的Weex也是一个跨平台UI项目,目前它以Vue为灵感,使用了许多相同的语法,同时计划在将来彻底集成Vue,然而集成的时间和细节还不清楚。由于Vue将HTML模板做为它设计的核心部分,而且现有特性不支持自定义渲染,所以很难看出目前的Vue.js的跨平台能力能像React和React Native同样强大。
毫无疑问,React是目前最受欢迎的前端框架。它在NPM上每月的下载量超过了250万次,相比之下,Vue是22.5万次。
人气不只仅是一个肤浅的数字,这意味着更多的文章,教程和更多Stack Overflow的解答,还意味有着更多的工具和插件能够在项目中使用,让开发者再也不孤立无援。
这两个框架都是开源的,可是React诞生于Facebook,有Facebook背书,它的开发者和Facebook都承诺会持续维护React。相比之下,Vue是独立开发者尤雨溪的做品。尤雨溪目前在全职维护Vue,也有一些公司资助Vue,可是规模和Facebook和Google没得比。不过请对Vue的团队放心,它的小规模和独立性并无成为劣势,Vue有着固定的发布周期,甚至更使人称道的是,Github上Vue只有54个open issue,3456个closed issue,做为对比,React有多达530个open issue,3447个closed issue。
总结一下,咱们发现的,Vue的优点是:
React的优点是:
然而,React和Vue都是很优秀的框架,它们之间的类似之处多过不一样之处,而且大部分的优秀功能是相通的: