React技术实践(1)
随着系统越来越庞大,前端也变得越来越复杂,因此,构建一套组件化的前端变得很重要了。
之前一直在使用Asp.net来进行前端的组件化,Asp.net组件化有个很大的缺陷,就是和后台代码绑定太紧密了,不符合REST API模式;再后来就使用纯粹的Javascript模块化开发,虽然解决了前后端分离问题,也做到了前端逻辑的组件化,但无法做到真正的前端(包括UI)的组件化。
所以,前端组件化技术就自然成为首选方案了。
流行的前端组件化技术有React和Vue两种,对比如下(摘录自https://segmentfault.com/a/1190000009268926)
---------------------------
2016年,React巩固了它JavaScript web框架之王的地位。在这一年里,Web和原生APP的库都迅速发展,同时与Angular相比,也具有明显优势。
与此同时,2016年对于Vue而言,也是很重要的一年。Vue2的发布给JavaScript社区带来了巨大的冲击,在Github上获得了25000个star。
不可否认,React和Vue的范围十分类似:它们都是轻量级的组件库,都用于构建用户界面,专注于视图层。两者都可以在简单项目中,也可以使用工具将它们扩展为复杂的应用程序。
因此,很多web开发人员都想知道,到底应该选择哪一个?一个明显优于另一个?有什么需要注意的利弊吗?还是说,两者基本相同?
两个框架,两个倡导者
在本文中,我想彻底地公正地比较两者之前的区别。唯一的问题就是:我是Vue的爱好者,必然会有一些偏见。我经常在我的项目中使用Vue,还发布了一些在线教程,即Ultimate Vue.js Developers course
为了摆脱我偏见的影响,我找到了我的朋友Alexis Mangin,他是一名优秀的JavaScript开发者,也是React的爱好者。他沉浸在React中,经常在Web和移动APP开发中使用React。
Alexis曾经问我:“为什么你这么喜欢Vue,从来不用React?”。由于我不太了解React,我很难回答这个问题。所以,我决定,一起坐下来,展示我们选择的库,看看它们究竟能提供什么东西。
经过激烈的讨论和互相学习,我们得出了以下6个结论。
如果你喜欢使用模板( 或需要一些其中的选项)构建应用程序,那么请选择Vue
将标记放在HTML文件中是Vue应用程序的默认选项。与Angular类似,大括号用于数据绑定表达式,指令(特殊的HTML属性)用于向模板添加功能。下面是一个简单的Vue程序例子。它可以输出一条消息,有一个按钮可以动态反转消息:
<div id="app">
<p>{{ message }}</p>
<button v-on:click="reverseMessage">Reverse Message</button>
</div>
new Vue({
el: '#app',
data: {
message: 'Hello Vue.js!
},
methods: {
reverseMessage: function () {
this.message = this.message.split('').reverse().join('');
}
}
});
相比之下,React应用程序避开模板,要求开放人员在JavaScript中创建DOM,通常用JSX辅助,下面是用React来实现同样的功能:
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这样的预处理器。
但是,使用模板需要学习所有的HTML扩展语法,渲染函数只需要了解标准的HTML和JavaScript
如果你喜欢简单的能正常工作的,那么请选择Vue
一个简单的Vue项目可以不需要解析,直接在浏览器中运行,这允许Vue可以像jQuery一样在项目中引用。
虽然在技术上使用React也是可行的,但是典型的React代码更倾向于像classes和non-mulating 数组方法这样的JSX和ES6的特性。但是Vue在简洁设计方面更为深入。我们来比较两者如何处理应用程序的数据(即“状态”)。
在React中State是不可以直接改变的,需要调用setState接口:
this.setState({
message: this.state.message.split('').reverse().join('')
});
当前和之前的状态差异让React知道什么时候在DOM中重新渲染以及渲染什么,因此不可变的状态是非常必要的。
相比之下,数据可以在Vue中突变。相同的数据属性在Vue中发生变化更为简单。
// Note that data properties are available as properties of
// the Vue instance
this.message = this.message.split('').reverse().join('');
在你得出Vue渲染系统比React渲染低效的结论之前,让我们来看看Vue中的状态管理:当你向状态添加新对象时,Vue会遍历它的所有属性并且转换为getter和setter。Vue系统会持续追踪状态并且在状态发生变化时,自动重新渲染DOM。
令人印象深刻的是,Vue中的状态改变更为简洁的同时,重新渲染系统的效率其实比React更好。
Vue的反应系统确实有值得注意的事项。例如:它不能检测到属性的添加、删除以及特定数组的变化。在这种情况下,可以使用Vue API中类似React的set方法。
如果你希望你的程序更小更快,那么请选择Vue
React和Vue都将构建一个虚拟DOM,并且在应用程序状态更改时同步更新实际的DOM。两者都有自己的优化方法。Vue核心开发人员提供了一个基准测试,展示了Vue的渲染系统比React的更快。在这个测试中,10000个项目的列表被渲染了100次。下面的表格展示了比较的结果。
从实际角度而言,这种基准只与边缘情况有关。大多数应用程序不需要经常进行这种操作,因此不能将其视为比较的一个重要因素。
虽然页面的大小与项目相关,Vue又占据了优势。目前发布的Vue库只有25.6KB。
要用React实现类似的功能,你需要使用React DOM(37.4KB)和React with Addons库(11.4KB),总共为48.8KB,几乎是Vue的两倍。为了公平起见,你可以使用React获得更多的API,但是不会有双倍的功能。
如果你想要构建大型应用程序,那么请选择React
用Vue和React来实现简单的应用程序,就像本文开头所说的一样,大部分开发者会偏向于Vue。这是因为基于模板的应用程序乍看更容易理解,并且能够更快启动。
但是这些初始的好处会导致大型程序进展缓慢。模板很容易出现运行时错误,难以测试,也不容易重构或分解。
相比之下,JavaScript制作的模板可以被组织成可分解的组件,DRY code也更容易重用和测试。
Vue也具有组件系统和渲染功能。但是React的渲染系统配置性更高,并且具有浅渲染的特性,与React的测试程序结合时,可以提供更多可测试和可维护的代码。
同时,React不可变的代码并不简单,当透明度和可测试性至关重要时,它会发挥更大的作用。
如果你想要一个同时适用于web和原生APP的库,那么请选择React
React Native是用JavaScript创建原生APP的库。它与React相同,只是将web组件换成了原生组件。如果你学习了React.js,那么你很快就可以学会React Native,反之亦然。
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或者原生APP,他们不需要不同的知识体系和工具。如果您打算开发web和移动APP,React会给你带来巨大冲击。
阿里巴巴的Weex是另一个跨平台UI项目。目前,它认为Vue提供了灵感,并且使用了很多相同的语法,并计划完全集成Vue。但是,这个计划的时间表和细节尚未清晰。
由于Vue将HTML模板作为其设计的核心部分,也没有将客户端渲染作为当前的特性,因此很难看到原生的Vue像React.js或React Native一样紧密。
如果你想要最大的生态系统,那么请选择React
毫无疑问,React目前是最受欢迎的库,NPM下载量每月约2.5M,Vue每月的下载量为225k。
人气带来的好处不止一点半点。这意味有更多的文章、教程和Stack Overflow回答能够帮助。也意味着在项目中有更多的工具和附加组件可用,同时节省了开发人员自己构建所有模块的时间。
两者都是开源的,但是React诞生自Facebook,受益于它。开发者和热爱React的公司都可以保障React一直被维护。
相比之下,Evan You一个人创建了Vue,同时他也是Vue唯一的全职维护人员。Vue得到了一些企业的赞助,但是还达不到Facebook或是Google的规模。
为了使得Vue团队更为可信,它的小体积和独立性目前并不被当做劣势。Vue有规律的发布周期,令人印象深刻的是,Vue在Github上只有54个公开的问题,3456个关闭的问题,而React有530个开放问题,3447个关闭的问题。
如果你已经选择了其中的一个,那么也不需要换了
总而言之,我们发现,Vue的优势是:
模板或渲染的灵活选项
语法以及项目设置的简单
渲染速度更快,体积更小
React的优势是:
更大的规模、更多的使用者、更好的可测试性
Web和原生APP
能提供更多支持和工具的更大的生态系统
然而,React和Vue都是优秀的UI库,并且具有更多的相似之处。它们都有的优势是:
使用虚拟DOM快速渲染
轻量级
响应式组件
服务端渲染
轻松集成的的路由、捆绑和状态管理
强大的支持和社区
如果你认为我们漏掉了一些东西,欢迎在评论中说明。Happy developing!
React技术实践(1)的更多相关文章
- react技术栈实践(1)
本文来自网易云社区 作者:汪洋 背景 最近开发一个全新AB测试平台,思考了下正好可以使用react技术开发. 实践前技术准备 首先遇到一个概念,redux.这货还真不好理解,大体的理解:Store包含 ...
- react技术栈实践(2)
本文来自网易云社区 作者:汪洋 这时候还没完,又有两个问题引出来了. 按照上面的配置,第三方库 antd 竟然也被编译了,导致样式失败. react中,一旦包裹了子组件,子组件没办法直接使用 styl ...
- 重谈react优势——react技术栈回顾
react刚刚推出的时候,讲react优势搜索结果是几十页. 现在,react已经慢慢退火,该用用react技术栈的已经使用上,填过多少坑,加过多少班,血泪控诉也不下千文. 今天,再谈一遍react优 ...
- [转] React 最佳实践——那些 React 没告诉你但很重要的事
前言:对很多 react 新手来说,网上能找到的资源大都是些简单的 tutorial ,它们能教会你如何使用 react ,但并不会告诉你怎么在实际项目中优雅的组织和编写 react 代码.用谷歌搜中 ...
- React最佳实践(1)
React最佳实践不敢妄谈,但最差实践非知乎莫属. 旧版知乎看起来土了点,但体验流畅,起码用起来舒服. 新版知乎看起来UI现代化,技术实现上采用了React,但是可能因为知乎缺钱,请不起高水平的前端工 ...
- fir.im 持续集成技术实践
互联网时代,人人都在追求产品的快速响应.快速迭代和快速验证.不论是创业团队还是大中型企业,都在探索属于自己的敏捷开发.持续交付之道.fir.im 团队也在全面实施敏捷,并推出新持续集成服务 - flo ...
- iBatis.net技术实践
随着大数据技术的兴起和快速发展,人们更多的开始关注HDFS.HBase.Hive等技术.但是谈到强一致性,我们又不得不回归现实,只能继续沿用RDBMS存储强一致性的数据.我们日常接触到的绝大多数的应用 ...
- 让互联网更快:新一代QUIC协议在腾讯的技术实践分享
本文来自腾讯资深研发工程师罗成在InfoQ的技术分享. 1.前言 如果:你的 App,在不需要任何修改的情况下就能提升 15% 以上的访问速度,特别是弱网络的时候能够提升 20% 以上的访问速度. 如 ...
- 【公开课】【阿里在线技术峰会】魏鹏:基于Java容器的多应用部署技术实践
对于公开课,可能目前用不上这些,但是往往能在以后想解决方案的时候帮助到我.以下是阿里对公开课的整理 摘要: 在首届阿里巴巴在线峰会上,阿里巴巴中间件技术部专家魏鹏为大家带来了题为<基于Java容 ...
随机推荐
- 6.15 省选模拟赛 老魔杖 博弈论 SG函数
这道题确实没有一个很好的解决办法 唯一的正解可能就是打表找规律 或者 直接猜结论了吧. 尽管如此 在此也给最终结论一个完整的证明. 对于70分 容易发现状态数量不大 可以进行暴力dp求SG函数. 原本 ...
- 无所不能的Embedding 1 - Word2vec模型详解&代码实现
word2vec是google 2013年提出的,从大规模语料中训练词向量的模型,在许多场景中都有应用,信息提取相似度计算等等.也是从word2vec开始,embedding在各个领域的应用开始流行, ...
- 将map中的json转ObjecId
我们直接从gridfs中取文件列表时取出来的文件_id为: "_id": { "timestamp": 1587091947, "counter&qu ...
- 在图像中隐藏数据:用 Python 来实现图像隐写术
什么是“隐写术”? 隐写术是将机密信息隐藏在更大的信息中,使别人无法知道隐藏信息的存在以及隐藏信息内容的过程.隐写术的目的是保证双方之间的机密交流.与隐藏机密信息内容的密码学不同,隐写术隐瞒了传达消息 ...
- Python初学者的自我修养,找到自己的方向
今天是 Python专题 的第22篇文章,原本今天是准备和大家继续Python当中多线程的使用的相关内容.然而前两天有一个读者在后台问我,学习Python有哪些适合新手入门的小项目推荐,所以今天这篇临 ...
- Spark Streaming——Spark第一代实时计算引擎
虽然SparkStreaming已经停止更新,Spark的重点也放到了 Structured Streaming ,但由于Spark版本过低或者其他技术选型问题,可能还是会选择SparkStreami ...
- C#LeetCode刷题之#167-两数之和 II - 输入有序数组(Two Sum II - Input array is sorted)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3903 访问. 给定一个已按照升序排列 的有序数组,找到两个数使得 ...
- C#LeetCode刷题之#172-阶乘后的零(Factorial Trailing Zeroes)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3854 访问. 给定一个整数 n,返回 n! 结果尾数中零的数量. ...
- 详解Java线程池的ctl(线程池控制状态)【源码分析】
0.综述 ctl 是线程池源码中常常用到的一个变量. 它的主要作用是记录线程池的生命周期状态和当前工作的线程数. 作者通过巧妙的设计,将一个整型变量按二进制位分成两部分,分别表示两个信息. 1.声明与 ...
- MST(最小生成树)
1.prim算法分析 prim算法是用来构建MST(最小生成树)的一种基于贪心策略的算法.prim算法通过维护lowcost数组和closest数组记录每次查询的最小权值边结点. 首先,看一个示例来理 ...