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 调用数据 ...
随机推荐
- selenium python bindings 项目结构总结
一个合理的文档结构在import的过程中会避免很多错误,踩完坑来记录. webtests/ framework.py webdriver.py test_file.py module/ __init_ ...
- EXCEL函数常用技巧浅析
EXCEL函数常用技巧浅析 EXCEL函数是一门趣味性非常大的游戏,此贴内容基本上为总结前人经验而来.废话不多说,我们现在走入正题. 一:判断数值奇偶性 1.1 ISODD(number) 判断一个 ...
- <每日一题>题目5:生成器表达式面试题
题目: def demo(): for i in range(4): yield i g = demo() g1 = (i for i in g ) g2 = (i for i in g1) prin ...
- css中字体属性的简写
- Python调用DLL动态链接库——ctypes使用
最近要使用python调用C++编译生成的DLL动态链接库,因此学习了一下ctypes库的基本使用. ctypes是一个用于Python的外部函数库,它提供C兼容的数据类型,并允许在DLL或共享库中调 ...
- java_Collections工具
** * Collections.addAll(List,多个元素): * Collections.shuffle(List):打乱顺序 * sort(List):将集合中元素按照默认规则排序 * s ...
- 【学术篇】luogu1558&&poj2777 色板游戏
题目の传送门: luogu:https://www.luogu.org/problem/show?pid=1558 poj:http://poj.org/problem?id=2777 题目大意:给有 ...
- Linux 运维日常排错
硬盘与IO df -Th #查看挂载和文件系统类型.检查是否有空间用满,是否有业务数据未使用独立分区? iostat -x 1 1. 检查iowait是否持续在15%以上,说明硬盘负载高. 2. ...
- 廖雪峰Java15JDBC编程-1关系数据库基础-1关系数据库简介
1.数据库 1.1 定义 数据库是按照数据结构来组合.存储和管理数据的软件. 1.2 数据库模型 数据库有层次模型.网状模型.关系模型三种模型. 2 关系数据库 关系数据库是建立在关系模型上的数据库, ...
- DuiLib学习笔记3.颜色探究
在前面两篇日志已经能使用xml了.今天准备好好的折腾一番,结果在颜色上却掉坑里了. 起初我在ps里取颜色为0104ff 这里01为R,04为G,ff为B 在控件的属性里有这样一个属性bkcolor=& ...