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 调用数据 ...
随机推荐
- Maven父子工程配置文件详解
项目骨架搭建成功之后. 因为父工程管理子工程.子工程相当于继承于子工程,所以子工程可以调用父工程里面的东西.那么就可以将jar包对应的配置文件书写到父工程的pom.xml文件中,注意:父工程的打包方式 ...
- day3:python测试题
1.Python的怎么单行注释和多行注释: 单行注释:# 多行注释: ''' ''' 或者 “”“ ”“” . 2.布尔值分别是什么 ? True /Fa ...
- 初识OpenCV-Python - 010: 精致边缘探测
本节主要介绍使用Canny函数达到边缘探测的结果. Code: import cv2from matplotlib import pyplot as plt img = cv2.imread('bal ...
- idea创建web项目,springboot项目,maven项目
web项目搭建 https://www.cnblogs.com/jxldjsn/p/8203859.html
- 2019-11-12-浅谈-Windows-桌面端触摸架构演进
title author date CreateTime categories 浅谈 Windows 桌面端触摸架构演进 lindexi 2019-11-12 14:37:31 +0800 2019- ...
- 使用HttpStaus自定义返回状态
一.导入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...
- Luogu P2619 [国家集训队2]Tree I(WQS二分+最小生成树)
P2619 [国家集训队2]Tree I 题意 题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有\(need\)条白色边的生成树. 题目保证有解. 输入输出格式 输入格式 ...
- 查看python安装位置和已安装库的相关操作
打开cmd.exe, *查看python安装位置 where python *查看已安装库 pip list 或者pip freeze *查看可以更新的第三方库 pip list --outdated ...
- CSS3 学习笔记(动画 多媒体查询)
动画 1.@keyframes规则用于创建动画.在@keyframes中规定某项CSS样式,就能创建由当前样式逐渐改为新样式的动画效果 2.使用animation进行动画捆绑.两个值:动画名称.时长 ...
- day07 linux磁盘分区,ps,kill,df,top命令使用
day07进入单用户模式删除密码不能进入系统问题: SELINUX=disabled 操作系统linux开机流程加电BIOS找到启动介质先读取第一个扇区(MBR)grup找到kernel加载到内存执行 ...

