对react的几点质疑
现在react.js如火如荼,非常火爆,昨天抽了一天来看了下这项技术。可能就看了一天,研究的不深入,但是我在看的过程中发现来了很多疑惑,这里拿出来和那家分享讨论以此共勉。
在我接触的前端以后,让我感觉眼前一亮的有一个框架,一种思想。一个框架就是jquery,解决了浏览器兼容问题;一种思想就是mvvm,真正的让前端从docment操作中脱离出来,但是当时没找到很中意的框架,就自己造了一个轮子。
react的设计有几点我是不理解的:
流式绑定
在mvvm框架设计中,有一个难点就是局部刷新,因为要更新我们的数据模型的时候我们必须要找到对应的docment节点来,以此来更新我们的视图

如上图,所以我们在内存里必须维护一个docment节点树,维护这个节点树是比较麻烦的,但是流式渲染却不需要维护这个节点树。因为每次更新都是重新渲染页面,但这样做是很耗性能的,所以react搞了一个虚拟节点,他的渲染就变成了这样

这里多出了一步“对比” ,所以那些传言react的性能比angular高,我一直持怀疑态度,怎么多出了一步还会高?,有兴趣的可以自己测试一下,或许里面有什么“不可告人的秘密” :),如果真是这样,那倒是真的值得研究一下他的源码,看看到底是哪路神仙造成性能提升,
流式绑定的缺点:使双向绑定变得困难,下面看下为什么变困难
传统的的双向绑定的难点

上图中有三个值为xxx文本框,当焦点在第一个文本框的时候我们通过输入来改变文本框的值,这时候会触发渲染事件,第二个文本框和第三个文本框会被渲染,会避开第一个文本框不渲染,原因?
1.因为我们在第一个文本框输入的值,这个就是最近的值 不需要渲染
2.如果第一个文本框也渲染,那就在某些浏览器中无法输入中文或者光标的位置跑到输入框前面
但是,流式渲染很难做到精确控制,所以使我们的双向绑定变的困难;
当然这个问题也不是没有解决方案,我只是说这里增加了我们实现双绑定的难度
React编译的最初的目的是掩盖html写在js里这件丑陋的事
把html片段写在js里面的痛苦想必大家都有体会,react也是把html写在js'里;但是我们的react为了为了使这件事情看起来没那么糟糕,搞了编译这么个东西;这样我们写在js里的代码看起就没那么糟糕。但是我们的编译只做这件事似乎把设计react的工程师的心里想法暴露了,所以这个编译也能把es6 编译为es5,这样在es6的炒作下,
就掩盖了编译的最初的目的是掩盖html写在js里这件丑陋的事,当然facebook的工程师也许不这样想,或许我的猜测不对,但无论怎么样在js里写html代码总是一件不好的事

上面是我对react的两点疑惑,当然他的组件化开发是值得称道的,设计的很优秀,但是组件化开发是个双刃剑有利有弊,具体的根据业务。
综上所述:在react的传播中,在人们的对es6和组件化开发的追逐中,react的优点被无限放大,而缺点被掩饰了。但是无论是es6还是组件化开发,都是双刃剑,至少在前端开发中,暂且不论nodejs
对react的几点质疑的更多相关文章
- 一个资深iOS开发者对于React Native的看法
一个资深iOS开发者对于React Native的看法 当我第一次尝试ReactNative的时候,我觉得这只是网页开发者涉足原生移动应用领域的歪门邪道. 我认为一个js开发者可以使用javasc ...
- [转] 一个资深iOS开发者对于React Native的看法
当我第一次尝试ReactNative的时候,我觉得这只是网页开发者涉足原生移动应用领域的歪门邪道. 我认为一个js开发者可以使用javascript来构建iPhone应用确实是一件很酷的事情,但是我很 ...
- 大神眼中的React Native--备用
当我第一次尝试ReactNative的时候,我觉得这只是网页开发者涉足原生移动应用领域的歪门邪道. 我认为一个js开发者可以使用javascript来构建iPhone应用确实是一件很酷的事情,但是我很 ...
- 【前端单元测试入门02】react的单元测试之Enzyme
React项目的单元测试 React的组件结构和JSX语法,对上一章的内容来讲进行测试显得很勉强. React官方已经提供了一个测试工具库:react-dom/test-utils 只是用起来不够方便 ...
- React 16 加载性能优化指南
关于 React 应用加载的优化,其实网上类似的文章已经有太多太多了,随便一搜就是一堆,已经成为了一个老生常谈的问题. 但随着 React 16 和 Webpack 4.0 的发布,很多过去的优化手段 ...
- 移动端跨平台方案对比:React Native、weex、Flutter
跨平台一直是老生常谈的话题,cordova.ionic.react-native.weex.kotlin-native.flutter等跨平台框架百花齐放,颇有一股推倒原生开发者的势头. 为什么我们需 ...
- 最火移动端跨平台方案盘点:React Native、weex、Flutter
1.前言 跨平台一直是老生常谈的话题,cordova.ionic.react-native.weex.kotlin-native.flutter等跨平台框架的百花齐放,颇有一股推倒原生开发者的势头. ...
- React 源码剖析系列 - 不可思议的 react diff
简单点的重复利用已有的dom和其他REACT性能快的原理. key的作用和虚拟节点 目前,前端领域中 React 势头正盛,使用者众多却少有能够深入剖析内部实现机制和原理. 本系列文章希望通过剖析 ...
- [翻译]Review——24 tips for React Native you probably want to know
Post author: Albert Gao Post link: http://www.albertgao.xyz/2018/05/30/24-tips-for-react-native-you- ...
随机推荐
- 编写Java应用程序。首先,定义描述学生的类——Student,包括学号(int)、 姓名(String)、年龄(int)等属性;二个方法:Student(int stuNo,String name,int age) 用于对对象的初始化,outPut()用于输出学生信息。其次,再定义一个主类—— TestClass,在主类的main方法中创建多个Student类的对象,使用这些对象来测 试Stud
package zuoye; public class student { int age; String name; int stuNO; void outPut() { System.out.pr ...
- 烂泥:学习Nagios(三): NRPE安装及配置
本文由秀依林枫提供友情赞助,首发于烂泥行天下 在前两篇文章中,我们介绍了有关nagios的安装与配置,文章为<烂泥:学习Nagios(一):Nagios安装>.<烂泥:学习Nagio ...
- mysql禁用autocommit,以及遇到的问题
原文地址:http://blog.51yip.com/mysql/1230.html http://blog.csdn.net/ying_593254979/article/details/12095 ...
- javascript刷新父页面的内容
适应于超级链接和弹出窗口 function RefreshParent() { if (window.opener != null) { ...
- Java Web之请求和响应
Servlet最主要作用就是处理客户端请求并作出回应,为此,针对每次请求,Web容器在调用service()之前都会创建两个对象,分别是HttpServletRequest和HttpServletRe ...
- 今天在看UWP蓝牙的例子
private async void InitializeRfcommServer() { ListenButton.IsEnabled = false; DisconnectButton.IsEna ...
- 在Eclipse彻底删除一个项目
1. 先必须关闭项目 2. 再从workspace中把项目删除
- poj 2528
Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 56958 Accepted: 16464 ...
- Xcode基本操作
2.偏好设置 通过“command+,”快捷键或”Xcode|Preferences”菜单呼出偏好设置. (1)主题及字体(Preferences->Fonts & Colors) 选中 ...
- Tomcat 5.5启动需要用户名密码的解决方案
我在使用Tomcat的时候碰到这样的问题,然后在csdn里面找到方法,然后保存一份,原帖地址:Tomcat用户名密码,8#原来的tomcat-user.xml是 <?xml version=& ...