再见Flux, 欢迎Bacon/Rx?

Facebook的Flux和React.js刚刚变得很火,大有剿灭MVC之势,现在又有人提出再见Flux,新的Bacon/Rx有哪些优势呢?

Facebook一年前引入Flux架构,它是客户端建立Web应用的最新革新,是对Angular.js的前端MVC的提升与革命,如今已经成为Web开发者最火热的技术。

Flux是使用dispathcer将业务逻辑从用户界面中分离出来,核心思想是单向数据流,这意味着响应用户动作的事件的传播可以单向传遍整个系统,不需要绑定任何内部数据模型:


这种单向数据流与React的虚拟DOM绑定,使得Flux实现更加简洁,因为没有必要进行状态区分(虚拟DOM框架实现这个一功能),但是Flux是重量的,它引入了多个模板(如 事件发射器、监听器等等),有一些企业软件的繁琐酸味,如按约定编程与分层结构。

函数响应式编程Functional Reactive Programming (FRP) 是一种新的编程范式,事件建模为事件流,事件流是类似一个不变的数组,它们能够被map 过滤 combine和merge,数组和事件流的区别是事件流中的事件是异步的,每次当事件发生时,它会被通过流传播,最终被订阅者消费使用。

顾名思义,Reactive响应式编程是React的本质,发生的动作通过事件流传播,这些事件流结合起来形成应用的状态,当事件通过系统传播以后,新的应用状态对象导致了状态的订阅者,它会通过根级别的React组件重新渲染:

整个状态广播的逻辑能使用下面代码实现,使用的是Bacon.js作为FRP库:

// app.jsconst React   = require(‘react‘),      Bacon   = require(‘baconjs‘),      TodoApp = require(‘./todoApp‘),      todos   = require(‘./todos‘),      filter  = require(‘./filter‘)

const filterP = filter.toProperty(<initial filter>),      itemsP  = todos.toItemsProperty(<initial items>, filterP)

const appState = Bacon.combineTemplate({  items: itemsP,  filter: filterP})

相比Flux,这样做的好处是不再需要分离动作和存储,事件流非常简单,取而代之是一个业务组件,它有一个公共API通过本地dispatcher与业务逻辑进行通讯:

// todos.jsconst Bacon       = require(‘baconjs‘),      Dispatcher  = require(‘./dispatcher‘)

const d = new Dispatcher()

module.exports = {  toItemsProperty: function(initialItems, filterP) {    // "business logic"        const itemsP = Bacon.update(initialItems,      [d.stream(‘remove‘)], removeItem,      [d.stream(‘create‘)], createItem,      ...    )    return Bacon      .combineAsArray([itemsP, filterP])      .map(setItemsDisplayStatusBasedOnFilter)

   function createItem(items, newItemTitle) {      return items.concat([{<new item data>}])    }

   function removeItem(items, itemIdToRemove) {      return items.filter(it => it.id !== itemIdToRemove)    }    ...  },

 // "public API"

 createItem: function(title) {    d.push(‘create‘, title)  },  removeItem: function(itemId) {    d.push(‘remove‘, itemId)  },

 ... }

dispatcher.js是一个可发布的事件流,事件流能够被订阅和消费:

// dispatcher.jsconst Bacon = require(‘baconjs‘)

module.exports = function() {  const busCache = {}  // Bus == Subject in Rx

 this.stream = function(name) {    return bus(name)  }  this.push = function(name, value) {    bus(name).push(value)  }  this.plug = function(name, value) {    bus(name).plug(value)  }

 function bus(name) {    return busCache[name] = busCache[name] || new Bacon.Bus()  }}

视图代码如下,视图会变得简单,没有回调,监听者,React的虚拟DOM会做剩余的工作,我们只要同步公共API去调用业务逻辑:

// todoItem.jsxconst React = require(‘react‘),      todos = require(‘./todos‘)

module.exports = React.createClass({  render: function() {    const item = this.props.item    return (      <li className={item.states.join(‘ ‘)}>        <div className="view">          <label>{item.name}</label>          ...          <button             className="destroy"             onClick={() => todos.removeItem(item.id)}            />        </div>      </li>    )  }})

以上代码演示见:TodoMVC project

Good bye Flux, welcome Bacon/Rx? — Medium

点评:Bacon/Rx的事件流类似事件总线,虽然很简单,但是理解起来有一定难度,而Flux虽然繁琐一些,但是一板一眼,对于前端程序员比较容易理解。

时间: 2024-08-06 07:47:27

再见Flux, 欢迎Bacon/Rx?的相关文章

响应式编程(Reactive Programming)(Rx)介绍

很明显你是有兴趣学习这种被称作响应式编程的新技术才来看这篇文章的. 学习响应式编程是很困难的一个过程,特别是在缺乏优秀资料的前提下.刚开始学习时,我试过去找一些教程,并找到了为数不多的实用教程,但是它们都流于表面,从没有围绕响应式编程构建起一个完整的知识体系.库的文档往往也无法帮助你去了解它的函数.不信的话可以看一下这个: 通过合并元素的指针,将每一个可观察的元素序列放射到一个新的可观察的序列中,然后将多个可观察的序列中的一个转换成一个只从最近的可观察序列中产生值得可观察的序列. 天啊. 我看过

再见!春节红包大战隐退是策略转移

对于近两三年的春节来说,大众印象最深刻的不是美酒佳肴.无聊春晚.鞭炮礼花啥的,而是以排山倒海之势袭来的红包雨.支付宝.微信支付都在春节时刻不断发力,以发红包的方式承包了大众春节的大部分娱乐时间.但在今年,支付宝和微信似乎是有了心灵感应一般,都表示不会再在春节期间展开红包大战,这是否就意味着以后我们就要与其说再见了? 但细细看支付宝.微信支付近来的动作却不难发现,春节红包大战的隐退实际上只是一种策略上的转移.春节红包对它们来说已经完成了既定的开拓移动支付应用场景的任务,但这并不意味着春节红包就真地

redux+flux(一:入门篇)

React是facebook推出的js框架,React 本身只涉及UI层,如果搭建大型应用,必须搭配一个前端框架.也就是说,你至少要学两样东西,才能基本满足需要:React + 前端框架. Facebook官方使用的是 Flux 框架.本文就介绍如何在 React 的基础上,使用 Flux 组织代码和安排内部逻辑. 首先,Flux将一个应用分成四个部分: Flux 的最大特点,就是数据的"单向流动". 用户访问 View View 发出用户的 Action Dispatcher 收到

.Net并行编程 - Reactive Extensions(Rx)并发浅析

关于Reactive Extensions(Rx) 关于Reactive Extensions(Rx),先来看一下来自微软的官方描述: The Reactive Extensions (Rx) is a library for composing asynchronous and event-based programs using observable sequences and LINQ-style query operators. Using Rx, developers represen

Six Degrees of Cowvin Bacon (poj 2139 最短路Floyd)

Language: Default Six Degrees of Cowvin Bacon Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3288   Accepted: 1529 Description The cows have been making movies lately, so they are ready to play a variant of the famous game "Six Degrees

Flux 架构入门教程

过去一年中,前端技术大发展,最耀眼的明星就是React. React 本身只涉及UI层,如果搭建大型应用,必须搭配一个前端框架.也就是说,你至少要学两样东西,才能基本满足需要:React + 前端框架. Facebook官方使用的是 Flux 框架.本文就介绍如何在 React 的基础上,使用 Flux 组织代码和安排内部逻辑,使得你的应用更易于开发和维护. 阅读本文之前,我假设你已经掌握了 React .如果还没有,可以先看我写的<React入门教程>.与以前一样,本文的目标是使用最简单的语

Flux --&gt; Redux --&gt; Redux React 入门 基础实例使用

本文的目的很简单,介绍Redux相关概念用法 及其在React项目中的基本使用 假设你会一些ES6.会一些React.有看过Redux相关的文章,这篇入门小文应该能帮助你理一下相关的知识 一般来说,推荐使用 ES6+React+Webpack 的开发模式,但Webpack需要配置一些东西,你可以先略过,本文不需要Webpack基础 入门,只是一些基础概念和用法的整理,更完整的内容推荐去看看文档,英文,中文 (不过我个人认为,官方文档的例子相对来说太复杂了,很难让新手马上抓住重点) (官方的例子正

要和这个城市说再见了!

来到这个城市不到2年就要说再见了,有点不舍离开这座城市. 当然来到这个城市有好的一面让自己不愿离开,同时也有一些地方让自己非常怨恨!在这座城市里自己留给自己印象最深刻还是软件园和创业街及大学园,因为这里 才是那些创业者的家,是他们精神支柱的地方. 在软件园里工作有不同岗位的人,有的是白领,有的是创客,有的是员工. 在软件园溜达,仔细观察,有的人有着非房的气质,这样的人一定经历过痛苦的磨难或正在经历痛苦的磨难.当然也有一般的员工,也在拼命努力地工作.有时9点 多钟从外面回学校,她(他)们才刚刚下班

AMD:RX 480双卡就这样灭GTX 1080!

日前宣布新卡Radeon RX 480的时候,AMD做了一番性能演示,同时使用RX 480双卡.GTX 1080单卡跑DX12游戏<奇点灰烬>的基准测试,结果前者完胜. 要知道,GTX 1080只要199美元,两块加起来也不到400美元,GTX 1080的两个版本则是599/699美元. 那么,AMD是怎么做到的呢? AMD全球技术营销总监Robert Hallock特意对此做了详细解释,尤其是给出了测试平台配置: Core i7-5930K处理器.华擎X99M Killer主板.32GB D