RxJS in azione, dominare eventi e stati in JavaScript

RxJS, acronimo di Reactive Extensions for JavaScript, è una libreria progettata per la programmazione reattiva che utilizza gli Observable per gestire sequenze di eventi e dati asincroni.

RxJS in azione, dominare eventi e stati in JavaScript

In questo articolo, analizzeremo due casi di utilizzo: uno in un ambiente JavaScript puro e l'altro integrato in un'applicazione React, per dimostrare come RxJS ottimizza la gestione degli eventi e degli stati, migliorando significativamente l'efficienza e la reattività delle applicazioni.

Perché utilizzare RxJS oggi

Efficienza e reattività: offre un modello di programmazione basato sugli Observable che consente di gestire flussi di dati e eventi in modo più efficiente e reattivo. Ciò risulta particolarmente utile in applicazioni web dove la gestione asincrona e la reattività sono critiche, come nelle Single Page Applications (SPA) o in applicazioni real-time

Scalabilità e manutenibilità: il codice tende a essere più scalabile e facile da mantenere. Gli Observable aiutano a gestire stati complessi e sequenze di eventi in modo più prevedibile e meno soggetto a errori rispetto ai callback o alle promesse tradizionali

Composizione e riutilizzo del codice: promuove una programmazione dichiarativa, dove è possibile creare flussi di dati altamente componibili e riutilizzabili. Questo riduce il boilerplate e migliora la modularità del codice

Plain JavaScript

Crea una cartella per il tuo progetto e naviga all'interno

Terminal
mkdir rxjs-example cd rxjs-example

Inizializza un nuovo progetto Node.js

JavaScript
npm init -y npm install rxjs

Supponiamo di voler creare un flusso di dati che reagisce ai clic su un bottone

HTML
<button id="myButton">Cliccami</button>
JavaScript
import { fromEvent } from 'rxjs'; import { scan } from 'rxjs/operators'; const button = document.getElementById('myButton'); const clicks$ = fromEvent(button, 'click'); const subscription = clicks$.pipe( scan(count => count + 1, 0) ).subscribe(count => console.log(`Cliccato: ${count} volte`)); // Ricorda di disiscriverti quando non serve più // subscription.unsubscribe();

Utilizzando fromEvent, generiamo un Observable che reagisce agli eventi di click del bottone

L'operatore scan viene poi applicato per accumulare un conteggio incrementale ogni volta che il bottone viene cliccato, partendo da zero. Questo conteggio viene visualizzato nella console ogni volta che avviene un clic

È importante ricordarsi di disiscriversi dall'Observable con unsubscribe() quando non è più necessario, per evitare perdite di memoria, specialmente in applicazioni con molti componenti o che necessitano di pulizia delle risorse

RxJS con ReactJs

Crea un nuovo progetto React usando Create React App

Terminal
npx create-react-app react-rxjs-example cd react-rxjs-example

Installazione di RxJS

Terminal
npm install rxjs
JavaScript
// click-counter.component.js import React, { useEffect } from 'react'; import { fromEvent } from 'rxjs'; import { scan } from 'rxjs/operators'; const ClickCounter = () => { useEffect(() => { const button = document.getElementById('myButton'); const clicks$ = fromEvent(button, 'click'); const subscription = clicks$.pipe( scan(count => count + 1, 0) ).subscribe(count => console.log(`Cliccato: ${count} volte`)); return () => { subscription.unsubscribe(); }; }, []); return <button id="myButton">Cliccami</button>; }; export default ClickCounter;

Assicurati di includere il componente ClickCounter in App.js o in un altro componente container.

JavaScript
import React from 'react'; import ClickCounter from './click-counter.component'; export const App = () => { return ( <div className="App"> <ClickCounter /> </div> ); } export default App;

RxJS emerge come una soluzione potente e versatile per la gestione di eventi e dati asincroni nelle applicazioni moderne. L'adozione di questa libreria può trasformare significativamente l'approccio alla programmazione reattiva, sia in contesti JavaScript puri sia in quelli basati su framework come React!

Grazie agli Observable e agli operatori di RxJS, gli sviluppatori possono costruire applicazioni più pulite, manutenibili e performanti, gestendo flussi di dati complessi con maggiore eleganza e meno codice boilerplate

E tu? Utilizzi RxJS o conosci qualche sua alternativa?