【IT168 评论】React起源于Facebook的内部项目,当时Facebook广告部门面临着一个问题,就是页面需要不断重新加载导致速度很慢,Facebook灵机一现,如果我们每次更改时不必不断更新编码,而是把它们转存到DOM中,每次只渲染最近的更改不就可以解决这个问题了吗?由此就诞生了我们现在都熟知的React。
React自2013年5月开源以后,就成为程序员们最喜爱的JavaScript框架。那么到底React有什么神奇的魔法能够吸引这么多人的喜爱呢?
我选择React的几个理由:
1.虚拟DOM
浏览器在渲染网页时,会先将HTML文档解析并构建DOM树,然后与CSSOM树生成RenderObject树,最后渲染成页面。浏览器中渲染引擎和JavaScript引擎是分离的,渲染引擎会提供一些接口给JavaScript调用,它们二者通信的性能其实是很差的。
之前,为了优化性能大家通常采用的办法是减少DOM操作次数。而React提出了一个新的思路就是虚拟DOM:组件的HTML结构不再是直接生成DOM,而是映射生成虚拟的JavaScript DOM结构,React通过diff算法将最小变更写入DOM中,从而减少DOM的实际次数,提升性能。
2.服务器端渲染
React提供开箱即用的服务器端渲染,服务器端渲染解除了服务器端对浏览器的依赖,它会将“可视”部分先渲染,然后再交给客户端做渲染。
3.描述性警告
React的描述性警告也是它惹人喜爱的原因之一,开发人员第一次使用React难保不会发生失误,而React系统会确切的告诉使用者错误代码在哪里,甚至还会提出可能的解决方案。
4.自定义事件系统
React允许开发人员创建自定义事件,并支持将其更新到数据存储区。React中有很多库支持开发人员将现有代码从回调转移到更具声明性的编程模型中。
5.声明性
React是典型的声明式编程,更易于创建交互式用户界面,React对每个状态都会使用视图,能够有效更新和呈现正确的组件,并使得代码更具阅读性。
6.更可预测的编码
React允许开发人员打开任何带有React组件的JavaScript文件,并且允许用户查看文件的行为方式、了解组件的状态。
Native环境比浏览器环境更加强大灵活,每个平台都需要有自己特定的工具集、特定的抽象集合和特定的代码。这一特性使得代码和概念不可重用,当应用程序中的数据逐渐增多时,它需要更多的人力来维护,甚至有时候还会崩溃。
为了更多的满足本地应用程序的需求,Facebook在2015年进一步推出了React Native以作为编码和主机平台之间的桥梁。本来React在渲染之前已经可以阅读和理解代码,但是添加了另一个层,对语言的解释和对平台渲染的支持使得它更受开发人员的喜爱。React Native允许开发人员在JavaScript中编写代码,为Android和iOS平台的应用程序添加了更多原生的感觉。
我选择React Native的几个理由:
1.并行工作
AsyncDisplayKit是Facebook推出的一款保持界面流畅性的IOS开源框架。为了保持界面的流畅性,APP渲染帧率必须保持每秒60帧,也就是说每帧所有的布局和绘制代码都必须在16毫秒内完成,而这基本上是个不可能完成的任务。
而AsyncDisplayKit支持用户将图像解码、调整文字大小并渲染,以及其他高耗时的UI操作移出主线程,从而提高UI的流畅性并缩短响应时间。
2.声明式风格
声明性编码风格基本已经成为React和React Native的标签了, 开发人员现在可以利用它编写可读,灵活的代码,再繁复的UI设计都可以通过查看代码轻松理解。
3.先进的手势处理
手势识别在移动设备上比在网络上要复杂得多,所以触摸材料很早就已经开发出来,但是囿于技术的发展,一直没能建立一个复杂先进的原生手势系统。而React Native就可以通过对本地手势的访问来响应本地更改。
4.访问本机功能
React允许访问平台特定的功能和组件,其中包括本机小部件,如果你不采用本机小部件而是选择使用HTML、CSS和JavaScript来实现本机小部件的功能,你会发现它会非常迟缓甚至兼容性也可能会有问题。
5.快速迭代
React Native支持热加载和实时加载。热加载是指在运行时动态注入修改后的文件内容,而实时加载则是实现了代码修改后自动重新加载APP。这两种方式减少了反馈循环,使得开发人员在修改代码之后能够即时查看到效果。
6.跨平台
React Native同时支持IOS和Android应用程序的编码设计和发布,显著减少了为各个平台编码和设置资源所需的时间,也成功为开发人员减负。
7.易于阅读
编码的声明性样式简化了编码范例和过程,开发人员更易于从代码中获得所需信息。
React和React Native无疑是现在APP开发中的一霸,众多APP开发人员都会把它视为第一选择,笔者相信每个开发人员心中都会有他们选择的理由,上述理由只是冰山一角,如果你有更多的选择理由欢迎你来补充。