Автор Redux тут!
Redux НЕ що відрізняється від флюсу. В цілому він має таку ж архітектуру, але Redux здатний вирізати кути складності, використовуючи функціональну композицію, де Flux використовує реєстрацію зворотних викликів.
У Redux немає принципової різниці, але я вважаю, що це робить деякі абстракції простішими або, принаймні, можливими для реалізації, що було б важко або неможливо здійснити в Flux.
Склад редуктора
Візьмемо, наприклад, пагинацію. На прикладі мого маршрутизатора Flux + React обробляються сторінки, але код для цього жахливий. Однією з причин, що це жахливо, є те, що Flux робить неприродним повторне використання функціональних можливостей у магазинах. Якщо двом магазинам потрібно обробляти пагинацію у відповідь на різні дії, вони або повинні успадковуватись із загального базового магазину (погано! Ви замикаєтесь у певному дизайні, коли використовуєте спадкування), або зателефонуйте зовнішньо визначеній функції зсередини обробник подій, якому потрібно якось працювати в приватному стані магазину Flux. Вся справа безладна (хоча, безумовно, у царині можливого).
З іншого боку, падінація Redux природна завдяки складу редуктора. Це редуктори аж донизу, тому ви можете написати заводські редуктори, які генерують редуктори пагінації, а потім використовувати їх у вашому дереві редукторів . Ключовим моментом, чому це так просто, є те, що в магазинах Flux плоскі магазини, а в Redux, редуктори можуть вкладатись за допомогою функціональної композиції, як і вбудовані компоненти React.
Цей візерунок також дозволяє чудові функції, такі як скасування / повторення коду, який не використовується користувачем . Чи можете ви уявити, як підключення Undo / Redo до програми Flux має два рядки коду? Навряд чи. З Redux це - знову , завдяки схемі композиції редуктора. Мені потрібно підкреслити, що в цьому немає нічого нового - це шаблон, вперше розроблений та докладно описаний в Elm Architecture, на який саме впливав Flux.
Надання сервера
Люди рендерують на сервері прекрасно за допомогою Flux, але бачачи, що у нас є 20 бібліотек Flux, кожна з яких намагається зробити візуалізацію сервера “простішою”, можливо, у Flux є деякі нерівні краї на сервері. Правда в тому, що Facebook не робить багато серверного рендерінгу, тому вони не дуже переймаються цим і покладаються на екосистему, щоб зробити це простіше.
У традиційному магазині Flux магазини є однотонними. Це означає, що важко розділити дані для різних запитів на сервері. Не неможливо, але важко. Ось чому більшість бібліотек Flux (як і нові утиліти Flux ) тепер пропонують використовувати класи замість одинарних клавіш, щоб ви могли інстанціювати магазини за запитом.
Є ще такі проблеми, які потрібно вирішити в Flux (самостійно або за допомогою вашої улюбленої бібліотеки Flux, таких як Flummox або Alt ):
- Якщо магазини - це класи, як я можу створити та знищити їх за допомогою диспетчера за запитом? Коли я реєструю магазини?
- Як я зволожую дані з магазинів і пізніше регідратюю їх на клієнта? Чи потрібно для цього застосовувати спеціальні методи?
Справді, у Flux фреймворк (не ванільний Flux) вирішує ці проблеми, але я вважаю їх складними. Наприклад, Flummox просить вас реалізувати serialize()
і deserialize()
у своїх магазинах . Alt вирішує це приємніше, забезпечуючи, takeSnapshot()
що автоматично серіалізує ваш стан у дереві JSON.
Redux просто йде далі: оскільки існує лише один магазин (керується багатьма редукторами), вам не потрібен спеціальний API для управління (повторною) гідратацією. Вам не потрібно «змивати» або «зволожувати» магазини - є лише один магазин, і ви можете прочитати його поточний стан або створити новий магазин з новим станом. Кожен запит отримує окремий екземпляр магазину. Детальніше про надання сервера за допомогою Redux.
Знову ж таки, це можливо щось можливе як у Flux, так і в Redux, але бібліотеки Flux вирішують цю проблему, вводячи тону API та конвенцій, і Redux навіть не повинен її вирішувати, оскільки у неї немає цієї проблеми в перше місце завдяки концептуальній простоті.
Досвід розробників
Насправді я не мав наміру Redux стати популярною бібліотекою Flux - я написав це, коли працював над моєю розмовою ReactEurope щодо гарячого перезавантаження з подорожами у часі . У мене була одна головна мета: зробити можливим змінити код редуктора на ходу або навіть «змінити минуле», перекресливши дії, і переконатися, що держава перераховується.
Я не бачив жодної бібліотеки Flux, яка могла б це зробити. Реактивний гарячий навантажувач також не дозволяє вам цього робити, адже він редагується, якщо ви редагуєте магазини Flux, оскільки він не знає, що з ними робити.
Коли Redux потрібно перезавантажити код редуктора, він зателефонує replaceReducer()
, і програма працює з новим кодом. У Flux дані та функції заплутані у магазинах Flux, тому ви не можете просто замінити функції. Більше того, вам доведеться якось перереєструвати нові версії Dispatcher - чогось Redux навіть не має.
Екосистема
Redux має багату і швидко зростаючу екосистему . Це пояснюється тим, що він пропонує кілька точок розширення, таких як програмне забезпечення середнього рівня . Він був розроблений з урахуванням випадків використання, таких як ведення журналів , підтримка Обіцянь , Спостережних даних , маршрутизації , перевірки незмінності розробників , наполегливість тощо. Не все це виявиться корисним, але приємно мати доступ до набору інструментів, які можна легко поєднувати для спільної роботи.
Простота
Redux зберігає всі переваги Flux (запис та повторення дій, односпрямований потік даних, залежні мутації) та додає нові переваги (легке скасування повторного перезавантаження, гаряче перезавантаження) без введення диспетчера та реєстрації магазину.
Зробити це просто - це важливо, оскільки він забезпечує безпеку при здійсненні абстракцій вищого рівня.
На відміну від більшості бібліотек Flux, поверхня API Redux невелика. Якщо ви видалите попередження, коментарі та перевірку правильності розробника, це 99 рядків . Немає складного коду асинхронізації для налагодження.
Ви можете насправді прочитати його та зрозуміти все Redux.
Дивіться також мою відповідь щодо недоліків використання Redux порівняно з Flux .