Redux & RxJS, ¿alguna similitud?


Sé que Redux es una mejor "implementación" de Flux, o mejor dicho, es un rediseño para simplificar las cosas (administración del estado de la aplicación).

He oído mucho acerca de la programación reactiva (RxJS), pero no he buceado para aprenderlo todavía.

Así que mi pregunta es: ¿hay alguna intersección (algo en común) entre estas dos tecnologías o son complementarias? ...o totalmente diferentes?

Author: ROMANIA_engineer, 2015-12-28

5 answers

En resumen, son bibliotecas muy diferentes para propósitos muy diferentes, pero sí hay algunas similitudes vagas.

Redux es una herramienta para administrar el estado en toda la aplicación. Se utiliza generalmente como una arquitectura para UIs. Piense en ello como una alternativa a (la mitad de) Angular.

RxJS es una biblioteca de programación reactiva. Por lo general se utiliza como una herramienta para realizar tareas asíncronas en JavaScript. Piensa en ello como una alternativa a las Promesas.


Reactivo la programación es un paradigma (forma de trabajar y pensar) donde los cambios de datos son observados desde una distancia. Los datos no se cambian desde una distancia.

Aquí hay un ejemplo de cambiado desde una distancia :

// In the controller.js file
model.set('name', 'George');

El Modelo se cambia del Controlador.

Aquí hay un ejemplo de observado desde una distancia :

// logger.js
store.subscribe(function (data) {
    console.log(data);
});

En el Registrador, observamos los cambios de datos que ocurren en la tienda (desde la distancia), y escribimos a la consola.


Redux utiliza el paradigma Reactivo solo un poco: la Tienda es reactiva. Usted no establece su contenido desde la distancia. Es por eso que no hay store.set() en Redux. La Tienda observa las acciones desde la distancia y se cambia a sí misma. Y la Tienda permite a otros observar sus datos a distancia.

RxJS también utiliza el paradigma Reactivo, pero en lugar de ser una arquitectura, te da bloques de construcción básicos, Observables , para lograr esto " observando desde un distancia " patrón.

Para concluir, cosas muy diferentes para diferentes propósitos, pero compartir algunas ideas.

 120
Author: André Staltz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-13 07:07:30

Son cosas muy diferentes.

RxJS se puede usar para hacer Programación Reactiva y es una biblioteca muy completa con más de 250 operadores.

Y Redux es como se describe en el repositorio de github "Redux es un contenedor de estado predecible para aplicaciones JavaScript".

Redux es solo una herramienta para manejar el estado en las aplicaciones. Pero en comparación, podría construir una aplicación completa en solo RxJS.

Espero que esto ayude :)

 23
Author: cmdv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-28 22:36:48

Para resumirlo:

Redux: Biblioteca inspirada en Flux usada para Administración de Estado.

RxJS: Es otra librería Javascript basada en la filosofía de programación reactiva, utilizada para tratar con "Streams" (Observables, etc.) [Lea acerca de la programación reactiva para entender los conceptos de flujo].

 2
Author: kg11,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-16 12:54:04

Solo quería agregar algunas diferencias pragmáticas de cuando hice código RxJS inspirado en Redux.

Asigné cada tipo de acción a una instancia de Sujeto. Cada componente con estado tendrá un Sujeto que luego se asigna a una función reductora. Todas las corrientes reductoras se combinan con merge y luego scan genera el estado. El valor predeterminado se establece con startWith justo antes de scan. Usé publishReplay(1) para los estados, pero podría eliminarlo más adelante.

La función react pure render solo será lugar donde se producen los datos del evento enviando a todos los productores / Sujetos.

Si tiene componentes secundarios, debe describir cómo se combinan esos estados en el suyo. combineLatest podría ser un buen punto de partida para eso.

Diferencias notables en la implementación:

  • Sin middleware, solo operadores rxjs. Creo que este es el mayor poder y debilidad. Todavía puedes tomar conceptos prestados, pero me resulta difícil obtener ayuda de comunidades hermanas como redux y cycle.js ya que es otra solución personalizada. Es por eso que necesito escribir "Yo" en lugar de "nosotros" en este texto.

  • No hay interruptor / caso o cadenas para los tipos de acción. Tienes una forma más dinámica de separar las acciones.

  • Rxjs se puede utilizar como una herramienta en otro lugar, y no está contenida en la administración estatal.

  • Menos número de productores que tipos de acción (?). No estoy seguro de esto, pero puede tener muchas reacciones en los componentes de los padres que escuchan al niño componente. Eso significa menos código imperativo, y menos complejidad.

  • La solución es tuya. No se necesita marco. Bueno y malo. Terminarás escribiendo tu propio framework de todos modos.

  • Es mucho más fractal, y puede suscribirse fácilmente a los cambios de un sub-árbol, o varias partes del árbol de estado de la aplicación.

    • Adivina lo fácil que es hacer épicas como lo hacen redux-obseravble? Muy fácil.

También estoy trabajando en mucho más grande beneficios donde los componentes secundarios se describen como flujos. Esto significa que no tenemos que completar los estados padre e hijo en los reductores, ya que podemos combinar recursivamente los estados basados en la estructura de componentes.

También pienso en saltarme react e ir con snabbdom o algo más hasta que React maneje mejor los estados reactivos. ¿Por qué debemos construir nuestro estado hacia arriba solo para descomponerlo a través de accesorios de nuevo? Así que voy a tratar de hacer una versión 2 de este patrón con Snabbdom.

Aquí hay un fragmento más avanzado pero pequeño donde el estado.el archivo ts construye el flujo de estado. Este es el estado del componente ajax-form que obtiene un objeto de campos (entradas) con reglas de validación y estilos css. En este archivo solo usamos los nombres de campo (claves de objeto) para combinar todos los estados de los hijos en el estado del formulario.

export default function create({
  Observable,
  ajaxInputs
}) {
  const fieldStreams = Object.keys(ajaxInputs)
  .map(function onMap(fieldName) {
    return ajaxInputs[fieldName].state.stream
    .map(function onMap(stateData) {
      return {stateData, fieldName}
    })
  })

  const stateStream = Observable.combineLatest(...fieldStreams)
  .map(function onMap(fieldStreamDataArray) {
    return fieldStreamDataArray.reduce(function onReduce(acc, fieldStreamData) {
    acc[fieldStreamData.fieldName] = fieldStreamData.stateData
    return acc
  }, {})
  })

  return {
    stream: stateStream
  }
}

Si bien el código puede no decir mucho de forma aislada, muestra cómo se puede construir el estado hacia arriba y cómo se pueden producir eventos dinámicos con facilidad. El precio a pagar es que necesitas entender un estilo de código diferente. Y me encanta pagar ese precio.

 1
Author: Marcus Nielsen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-18 10:37:57

Puede "implementar" Redux en una línea de RxJS. Si está pensando en Rx por otras razones (para promesas de piel, para usarlo en el servidor y el cliente), entonces omita Redux y vaya todo Rx.

 0
Author: bbsimonbb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-02 15:06:47