Redux autore qui!
Redux non è così diverso da Flux. Nel complesso ha la stessa architettura, ma Redux è in grado di tagliare alcuni angoli di complessità utilizzando la composizione funzionale in cui Flux utilizza la registrazione di callback.
Non c'è una differenza fondamentale in Redux, ma trovo che renda alcune astrazioni più facili, o almeno possibili da implementare, che sarebbe difficile o impossibile da implementare in Flux.
Composizione del riduttore
Prendi, ad esempio, l'impaginazione. Il mio esempio Flux + React Router gestisce l'impaginazione, ma il codice è terribile. Uno dei motivi per cui è orribile è che Flux rende innaturale il riutilizzo delle funzionalità nei negozi. Se due negozi devono gestire l'impaginazione in risposta a diverse azioni, o devono ereditare da un negozio di base comune (male! Ti stai bloccando in un particolare progetto quando usi l'ereditarietà) o chiamare una funzione definita esternamente dall'interno gestore di eventi, che dovrà in qualche modo operare nello stato privato del negozio Flux. Il tutto è disordinato (anche se sicuramente nel regno del possibile).
D'altra parte, con l'impaginazione Redux è naturale grazie alla composizione del riduttore. Si tratta di riduttori fino in fondo, quindi puoi scrivere una fabbrica di riduttori che genera riduttori di impaginazione e quindi utilizzarli nell'albero dei riduttori . La chiave per cui è così facile è perché in Flux i negozi sono piatti, ma in Redux i riduttori possono essere nidificati tramite composizione funzionale, proprio come i componenti di React possono essere nidificati.
Questo modello abilita anche funzioni meravigliose come annulla / ripristina senza codice utente . Riesci a immaginare di collegare Annulla / Ripristina a un'app Flux come due righe di codice? Quasi. Con Redux, lo è ancora, grazie al modello di composizione del riduttore. Devo evidenziare che non c'è nulla di nuovo in questo: questo è il modello sperimentato e descritto in dettaglio in Elm Architecture che è stato a sua volta influenzato da Flux.
Rendering del server
Le persone hanno eseguito correttamente il rendering sul server con Flux, ma visto che abbiamo 20 librerie Flux ognuna delle quali tenta di rendere il rendering del server "più semplice", forse Flux ha dei bordi irregolari sul server. La verità è che Facebook non esegue molto il rendering dei server, quindi non ne sono stati molto preoccupati e si basano sull'ecosistema per renderlo più semplice.
Nel Flux tradizionale, i negozi sono singoli. Ciò significa che è difficile separare i dati per diverse richieste sul server. Non impossibile, ma difficile. Questo è il motivo per cui la maggior parte delle librerie Flux (così come le nuove Utilità Flux ) ora suggeriscono di utilizzare le classi anziché i singoli, in modo da poter creare istanze di negozi per richiesta.
Ci sono ancora i seguenti problemi che devi risolvere in Flux (da solo o con l'aiuto della tua libreria Flux preferita come Flummox o Alt ):
- Se i negozi sono classi, come posso crearli e distruggerli con il dispatcher per richiesta? Quando registro i negozi?
- Come posso idratare i dati dai negozi e successivamente reidratarli sul client? Devo implementare metodi speciali per questo?
Devo ammettere che i framework Flux (non Vanilla Flux) hanno soluzioni a questi problemi, ma li trovo troppo complicati. Ad esempio, Flummox ti chiede di implementare serialize()
e deserialize()
nei tuoi negozi . Alt risolve questo problema fornendo takeSnapshot()
che serializza automaticamente il tuo stato in un albero JSON.
Redux va oltre: poiché esiste un solo negozio (gestito da molti riduttori), non è necessaria alcuna API speciale per gestire la (ri) idratazione. Non è necessario "svuotare" o "idratare" i negozi: esiste un solo negozio e puoi leggere il suo stato corrente o creare un nuovo negozio con un nuovo stato. Ogni richiesta ottiene un'istanza del negozio separata. Ulteriori informazioni sul rendering del server con Redux.
Ancora una volta, questo è un caso di qualcosa di possibile sia in Flux che in Redux, ma le librerie Flux risolvono questo problema introducendo una tonnellata di API e convenzioni e Redux non deve nemmeno risolverlo perché non ha quel problema nel primo posto grazie alla semplicità concettuale.
Esperienza degli sviluppatori
In realtà non volevo che Redux diventasse una popolare libreria Flux: l'ho scritto mentre stavo lavorando al mio discorso su ReactEurope sul caldo ricaricare con i viaggi nel tempo . Avevo un obiettivo principale: rendere possibile cambiare al volo il codice del riduttore o addirittura "cambiare il passato" barrando le azioni e vedere lo stato ricalcolato.
Non ho visto una singola libreria Flux in grado di farlo. React Hot Loader inoltre non ti consente di farlo, infatti si rompe se modifichi i negozi Flux perché non sa cosa farne.
Quando Redux deve ricaricare il codice del riduttore, chiama replaceReducer()
e l'app viene eseguita con il nuovo codice. In Flux, i dati e le funzioni sono intrecciati nei negozi Flux, quindi non è possibile "semplicemente sostituire le funzioni". Inoltre, dovresti in qualche modo registrare nuovamente le nuove versioni con Dispatcher, cosa che Redux non ha nemmeno.
Ecosistema
Redux ha un ecosistema ricco e in rapida crescita . Questo perché fornisce alcuni punti di estensione come il middleware . È stato progettato tenendo conto di casi d'uso come registrazione , supporto per promesse , osservabili , routing , controlli di sviluppo dell'immutabilità , persistenza , ecc. Non tutti si riveleranno utili, ma è bello avere accesso a una serie di strumenti che possono essere facilmente combinati per lavorare insieme.
Semplicità
Redux conserva tutti i vantaggi di Flux (registrazione e riproduzione di azioni, flusso di dati unidirezionale, mutazioni dipendenti) e aggiunge nuovi vantaggi (annullamento della ripetizione, ricarica a caldo) senza introdurre Dispatcher e la registrazione del negozio.
Mantenerlo semplice è importante perché ti mantiene sano mentre implementi le astrazioni di livello superiore.
A differenza della maggior parte delle librerie Flux, la superficie dell'API Redux è minuscola. Se rimuovi gli avvisi, i commenti e i controlli di integrità dello sviluppatore, sono 99 righe . Non esiste un codice asincrono complicato per il debug.
Puoi effettivamente leggerlo e capire tutto di Redux.
Vedi anche la mia risposta agli aspetti negativi dell'utilizzo di Redux rispetto a Flux .