RxJS/Cycle.js 与 React/Vue 相比更适用于什么样的应用场景?
RxJS/Cycle.js 与 React/Vue 相比更适用于什么样的应用场景?
RxJS/Cycle.js 与 React/Vue 相比更适用于什么样的应用场景? - 知乎 https://www.zhihu.com/question/40195289
实际项目中,React, Vue 等就很方便了。而使用 Rxjs, Cycle.js 会引入大量的函数式概念,无法轻松融入现有项目。
对于全新前端项目来说,要完全投入 Cycle.js 的怀抱也总有大炮打蚊子的感觉,毕竟前端项目充满了各种状态,变量,副作用。快速迭代时,为了临时业务需要,也会容忍一些反模式的代码出现。
那么对于前端项目来说,Rxjs,Cycle.js 更适用于何种场景呢?
某前辈同事的原话:
这个 app 还没复杂到需要让我忍受
action$.startWith( 0 ).scan( ( x, y ) => x + y )
这样代码的程度。
[其实个人感觉这样的代码含蛮带感的哎( 是我 2 young, 2 simple 么),毕竟看起来高大上,会让那些只会jq的童鞋完全搞不懂 ^_^ (神马心态) ]
先说观点,React/Vue 和 Cycle 一起用是不太合理的,因为 Cycle 本身定位是框架,定义了整个应用的代码组织方式和开发范式,那就是无论是用户事件处理还是服务端数据同步,统统用 Rx 来做,Cycle 自己也提供了偏好的 view layer(基于 virtual-dom 的 DOM driver)。总的来说 Cycle 的范式侵入性很强,属于要么不用要用就得全盘接受 Rx for everything 的理念。我本身对于这个理念持保留态度,同时目前还没有看到过大型 Cycle 应用的例子,那么自然对于 Cycle 到底好不好用,也是持保留态度。
另一方面,在 React/Vue 应用中部分使用 Rx 是完全没有问题的。思路上来说就是把 React/Vue 组件的 local state 当做一个『中介』,在一个 Rx Observable 的 subscribe 回调里面更新组件状态。通过简单的绑定库支持,可以完全把 component state 作为一个实现细节封装掉,实现 Observable -> view 的声明式绑定。参考:
- Vue + Rx: https://github.com/vuejs/vue-rx/
- React + Rx: GitHub - belfz/fully-reactive-react-example
我个人倾向于在适合 Rx 的地方用 Rx,但是不强求 Rx for everything。比较合适的例子就是比如多个服务端实时消息流,通过 Rx 进行高阶处理,最后到 view 层就是很清晰的一个 Observable,但是 view 层本身处理用户事件依然可以沿用现有的范式。
---
题外话,
的答案拿 Vue 说事,然后说不可避免会遇到『性能墙』问题,而 Virtual DOM 是 React 对『性能墙』的解决方案,我只能说这个看法基本属于对 Virtual DOM 理解停留在宣传层面的水平。详见 网上都说操作真实 DOM 慢,但测试结果却比 React 更快,为什么? - 尤雨溪的回答。
而关于『复杂度墙』,则要么是对『单向数据流』的理解停留在宣传层面,要么是对 Vue 的了解有限(不了解您可以少说两句)。React 如果没有 Flux,其实也是依赖 component local state。React + Redux 做的事情说到底就是把应用状态从组件本身隔离出去统一管理,这种思路并不是只有 React 能做到,只要有个声明式的视图层就行了。这也是为什么 Redux 是 view-layer agnostic,Vue,Angular 2 都有配合 Redux 使用的例子,Vue 自己也有专属的状态管理方案 Vuex。(这些话我其实在知乎重复过好几遍了,只是太多人被 FB 的宣传洗了脑,说 React 必提 virtual dom 性能好 + 单向数据流应对复杂度,对其本质却不知其所以然...)
收藏收起
我们厂(小厂)在iOS(Native)、Android(ReactNative)和Web上都选择了Data Flow驱动的设定思路,使用RxJS(RxSwift)来作为Data Flow驱动的核心组件,架构基本类似,把全局状态和组件局部状态分开,结构很清楚,因为Data Flow会让你比较容易追踪到数据变化的原因,最终导致UI变化的原因。其实只要把全局状态和局部状态有效管理,使用Redux也很好,不过使用RxJS是因为我们可以很轻松的把全局状态Stream和组件局部状态的Stream通过Rx运算子共同运算,代码会更加清晰,同时大大减少对全局状态的污染,有效控制数据状态变化传播的范围。
Reactive programming is oriented around data flows and the propagation of change. Erik Meijer gave us Rx because he was induced by push-based systems. When you want to stay up to date about the state of the world, it is much better to push instead of to pull.
Observable Stream + FRP围绕数据流驱动设计App架构,会大大减少UI上的复杂度,非常看好的结构方向。
而React本身定义了数据流向的要求,但是没有定义如何解决这个问题,所以,React和RxJS解决的不是一个问题……
They have not solved the problem of how to achieve explicit data-flow graphs
https://medium.com/@fkrautwald/plug-and-play-all-your-observable-streams-with-cycle-js-e543fc287872#.zcbj1db3x
收藏
部分引入Rx只会获得部分收益,总要从Observable这个monad容器出来进去,导致编码本身大量冗余,丢掉大部分FP的好处。
用用Cycle你就能发现比React大量的手动绑定简洁多了,这样重构也方便。Cycle效率真心远超React Redux,这取决于React onClick绑定,导致要做到类似Reactive Programming的效果(Flux / Redux 对React来说是标配),需要做大量重复工作,Flux只是模式,导致不能真的抽象成库。这是React为数不多的硬伤。
缺点就是Rx4测试困难,如果你们不要求覆盖率,调试Rx其实并不是很麻烦的事情。
收藏
Vue 的年龄轻,但是 Vue 却是最传统的基于 observer 的MVC,但是做到了尽量简单。但是不可避免的,当你的 Web App 越来越复杂,自然也会撞到两堵墙,"性能墙"和"复杂度墙"(否则也就不会有React, Cycle.js..., Angular早就一统江湖了)。
React 针对"性能墙"的方案就是 VirtualDOM,对于"复杂度墙"的方案就是单向数据流,希望用一些"函数式"的概念来规避过于复杂的状态维护(对于稍微复杂一些的应用,这是一定会出现的问题)。但是由于 React 自身不是"函数式"的,又有大量的工程妥协,因此真的是充满了 boilerplate。
Cycle.js 其实是 FRP 在 Web App 领域的一种"模式"(Source/Driver, MVI),是天生用来对付"复杂度墙"的。而且,得益于 React 的思路, Cycle.js 也老大不客气地把 VirtualDOM 拿来缓解"性能墙"问题。
但是,由于 Cycle.js 尚没有被大量的开发者使用,缺少工程验证,尤其是性能评估方面;而且也没有大厂持续地投资,所以还是在探索阶段。不过以我个人体验来看,Cycle.js 是一种“对”的开发方式。
收藏
收藏
RxJS/Cycle.js 与 React/Vue 相比更适用于什么样的应用场景?的更多相关文章
- vue.js与react.js相比较的优势
vue.js的简介 vue.js是一个javascript mvvm库,它是以数据驱动和组件化的思想构建的.我们平时多用js去操作dom,vue.js则是使用了数据绑定驱动来操作dom的,也就是说创建 ...
- Vue.js vs React vs Angular 深度对比[转]
这个页面无疑是最难编写的,但我们认为它也是非常重要的.或许你曾遇到了一些问题并且已经用其他的框架解决了.你来这里的目的是看看 Vue 是否有更好的解决方案.这也是我们在此想要回答的. 客观来说,作为核 ...
- MVC、MVP、MVVM、Angular.js、Knockout.js、Backbone.js、React.js、Ember.js、Avalon.js、Vue.js 概念摘录
注:文章内容都是摘录性文字,自己阅读的一些笔记,方便日后查看. MVC MVC(Model-View-Controller),M 是指业务模型,V 是指用户界面,C 则是控制器,使用 MVC 的目的是 ...
- Vue.js与React的全面对比
Vue与React的对比 Vue.js与React.js从某些反面来说很相似,通过两个框架的学习,有时候对一些用法会有一点思考,为加深学习的思索,特翻阅了两个文档,从以下各方面进行了对比,加深了对这两 ...
- 学习RxJS:Cycle.js
原文地址:http://www.moye.me/2016/06/16/learning_rxjs_part_two_cycle-js/ 是什么 Cycle.js 是一个极简的JavaScript框架( ...
- 4-13 Webpacker-React.js; 用React做一个下拉表格的功能: <详解>
Rails5.1增加了Webpacker: Webpacker essentially is the decisions made by the Rails team and bundled up i ...
- day67:Vue:es6基本语法&vue.js基本使用&vue指令系统
目录 Vue前戏:es6的基本语法 1.es6中的let特点 1.1.局部作用域 1.2.不存在变量提升 1.3.不能重复声明 1.4.let声明的全局变量不从属于window对象,var声明的全局变 ...
- [Cycle.js] From toy DOM Driver to real DOM Driver
This lessons shows how we are able to easily swap our toy DOM Driver with the actual Cycle.js DOM Dr ...
- Js 框架之Vue .JS学习记录 ① 与Vue 初识
目录 与 Vue.js 认识 VUE.JS是个啥?有啥好处? Vue 的目标 战前准备 VUE.JS环境 VUE.JS 尝试一下,你就明白 第一步 实例化VUE 对象 第二步VueAPP 调用数据 ...
随机推荐
- try-catch 捕捉不到异常
code: int _tmain(int argc, _TCHAR* argv[]) { cout << "In main." << endl; //定义 ...
- 移动端click点透bug
移动端click点透bug click点透bug有一个特定的产生情况: 当上层元素是tap事件,且tap后消失,下层元素是click事件.这个时候,tap上层元素的时候就会触发下层元素的click事件 ...
- ASP.NET的Validform验证表单使用说明
当我们写提交表单的时候往往需要验证表单是否填写了内容,是否正确,这个插件可以很方便的完成我们需要的验证! 使用方法: 1.引用JS <script type="text/javascr ...
- Git 查看、删除、重命名远程分支
原文地址:http://blog.csdn.net/sunnyyoona/article/details/52065544 1. 查看远程分支 分支加上-a参数可以查看远程分支,远程分支会用红色表示出 ...
- vue使用axios实现前后端通信
安装依赖 npm install --save axios # vue-axios是对axios的简单封装 npm install --save vue-axios 用例 在main.js里面进行全局 ...
- 把类完善了一下,播放器也完善了一下,纯MFC与WinMM的产物
- 自己新机器安装CM时候 server服务启动DB配置
com.cloudera.cmf.db.type=mysqlcom.cloudera.cmf.db.host=localhost:3306com.cloudera.cmf.db.name=cmfcom ...
- 【笔记篇】C#笔记3
笔记目录:http://blog.csdn.net/enzymii/article/details/77169928 C#的接口有点意思,我们说过可以用来多重继承.. using System; na ...
- 辨析JspWriter和PrintWriter
JspWriter和PrintWriter的区别? JspWriter相当于带缓冲的PrintWriter 如何控制out缓冲? 通过设置JSP页面page指令的buffer属性, 可以调整out缓冲 ...
- Verilog与VHDL的混合模块例化
1,大小写与转义 对VHDL解释器而言,对于模块名和端口名, (1) 若有转义 a) 先不考虑转义,寻找与字符串完全相同的VHDL模块: 若找不到: b) 考虑转义,寻找对应的Verilog模块. ( ...