对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- ...
随机推荐
- 今天说一下 Group by 这个东西
group by 这个关键字,这个语句太平凡了~基本上只要有报表的地方,就会有它的身影. 常规用法就是 INSERT INTO #TypeValue ( TypeID, Col2 ) , N , N ...
- ORA-01858: 在要求输入数字处找到非数字字符
数据库 date 字段问题 insert into WK_RE_LE (DACL_FILE_ID,DACL_GROUP_ID,BDCDYH,DACL_LENGTH,ISVALID,DACL ...
- [原]ubuntu14.04 网卡逻辑修改没有文件/etc/udev/rules.d/70-persistent-net.rules
-----问题出现------ 在新装的ubuntu14.04系统中没有发现文件/etc/udev/rule.d/70-persistent-net.rules, 无法修改网络的逻辑名称(即把第一张网 ...
- windows phpstudy 本地添加自定义域名
1.本地配置自定义域名访问 2.打开PHPstudy 域名配置 3.打开host.文件地址 C:\Windows\System32\drivers\etc hosts 192.168.1.101 wi ...
- Windows Azure支持七层负载均衡--Application Gateway
一直以来Windows Azure的负载均衡(Loadbalancer)功能一直被客户诟病,无法其竞争对手(特别是国内的云厂商)匹敌. Windows Azure的负载均衡器是四层的,前期的版本不支持 ...
- 大话设计模式C++版——工厂模式在COM中的典型应用
上篇<大话设计模式C++版——抽象工厂模式>中,我们拯救世界未遂,留下小小的遗憾,本篇中我们将给出一个解决方案——COM组件技术,同时也顺便扯扯工厂模式在COM组件技术中的应用. 工厂模式 ...
- linux下yum命令出现Loaded plugins: fastestmirror
yum install的时候提示:Loaded plugins: fastestmirror fastestmirror是yum的一个加速插件,这里是插件提示信息是插件不能用了. 不能用就先别用呗,禁 ...
- 创建MyOffice项目
创建查看评分窗体(FrmLOOK),添加定义成员数组,将员工数据绑定到FrmLOOK窗体的ListView控件上 public ListViewItem lv; private void Form1_ ...
- C#中Abstract和Virtual
C#中Abstract和Virtual 在C#的学习中,容易混淆virtual方法和abstract方法的使用,现在来讨论一下二者的区别.二者都牵涉到在派生类中与override的配合使用. 一.Vi ...
- [No00004F]史上最全Vim快捷键键位图(入门到进阶)
史上最全Vim快捷键键位重磅来袭!!学习Linux的朋友看过来啦,你是不是觉得Linux编辑器Vim操作复杂,步骤繁琐呢?Linux工程师是不是想大幅度提升自己的工作效率呢? 经典版 下 ...