Redux yazarı burada!
Redux değil o Flux farklıdır. Genel olarak aynı mimariye sahiptir, ancak Redux, Flux'un geri arama kaydını kullandığı fonksiyonel kompozisyonu kullanarak bazı karmaşıklık köşelerini kesebilir.
Redux'da temel bir fark yoktur, ancak Flux'ta uygulanması zor veya imkansız olan belirli soyutlamaları kolaylaştırmayı veya en azından uygulamayı mümkün kıldığını düşünüyorum.
Redüktör Bileşimi
Örneğin, sayfalandırmayı ele alalım. Benim Akı + Router örnek Tepki kolları sayfa numaralarını ama bunun için kod korkunç. Korkunç olmasının nedenlerinden biri, Flux'un mağazalar arasında işlevselliği yeniden kullanmayı doğallaştırmamasıdır. İki mağazanın farklı eylemlere yanıt olarak sayfalandırmayı ele alması gerekiyorsa, ortak bir temel mağazadan miras almaları gerekir (kötü! Kalıtım kullandığınızda kendinizi belirli bir tasarıma kilitlersiniz) veya harici olarak tanımlanmış bir işlevi bir şekilde Flux mağazasının özel durumunda çalışması gereken olay işleyicisi. Her şey dağınık (kesinlikle mümkün olmasına rağmen).
Öte yandan Redux paginasyonu ile redüktör bileşimi sayesinde doğaldır. Düşürücüler tamamen aşağı, böylece sayfalama azaltıcıları üreten bir redüktör fabrikası yazabilir ve ardından redüktör ağacınızda kullanabilirsiniz . Neden bu kadar kolay olmasının anahtarı , Flux'ta mağazaların düz olması, ancak Redux'da, indirgeyiciler, React bileşenlerinin yuvalanabileceği gibi fonksiyonel bileşim yoluyla iç içe yerleştirilebilir.
Bu model ayrıca kullanıcı kodu geri alma / yineleme gibi harika özelliklere de olanak tanır . Geri Al / Yinele'yi iki satır kodlu bir Flux uygulamasına takmayı hayal edebiliyor musunuz? Zorlukla. Redux ile, redüktör kompozisyon modeli sayesinde tekrar kazanılır. Bu konuda yeni bir şey olmadığını vurgulamalıyım - bu, Elm Mimarisinde , Flux'tan etkilenen öncü ve ayrıntılı olarak açıklanan model .
Sunucu Oluşturma
İnsanlar Flux ile sunucuda iyi işlemektedir, ancak her biri sunucu işlemeyi daha kolay hale getirmeye çalışan 20 Flux kütüphanesine sahip olduğumuzu görünce, belki Flux'un sunucuda bazı kaba kenarları vardır. Gerçek şu ki, Facebook çok fazla sunucu oluşturma işlemi yapmıyor, bu yüzden bu konuda çok endişe etmediler ve daha kolay hale getirmek için ekosisteme güveniyorlar.
Geleneksel Flux'ta mağazalar tek tonludur. Bu, sunucudaki farklı istekler için verileri ayırmanın zor olduğu anlamına gelir. İmkansız değil, zor. Bu nedenle, çoğu Flux kütüphanesi (ve yeni Flux Utils ) artık tek tektonlar yerine sınıflar kullanmanızı önerir, böylece istek başına depoları başlatabilirsiniz.
Flux'ta çözmeniz gereken aşağıdaki sorunlar hala var (kendiniz veya Flummox veya Alt gibi en sevdiğiniz Flux kütüphanesinin yardımıyla ):
- Mağazalar sınıfsa, istek başına dağıtıcı ile nasıl oluşturabilir ve yok edebilirim? Mağazalara ne zaman kayıt olurum?
- Mağazalardaki verileri nasıl hidratlayabilir ve daha sonra istemcide rehidrate edebilirim? Bunun için özel yöntemler uygulamam gerekir mi?
Kuşkusuz Flux çerçevelerinin (vanilya Flux değil) bu sorunlara çözümleri var, ancak onları aşırı karmaşık buluyorum. Örneğin, şaşırtmak uygulamak ister serialize()
ve deserialize()
mağazalarınızda . Alt takeSnapshot()
, durumunuzu bir JSON ağacında otomatik olarak serileştirerek bu güzelliği çözer .
Redux daha da ileri gidiyor: sadece bir mağaza (birçok redüktör tarafından yönetiliyor) olduğundan, (yeniden) hidrasyonu yönetmek için herhangi bir özel API'ye ihtiyacınız yok. Mağazaları “yıkamanıza” veya “nemlendirmenize” gerek yoktur; yalnızca tek bir mağaza vardır ve mevcut durumunu okuyabilir veya yeni bir durumla yeni bir mağaza oluşturabilirsiniz. Her istek ayrı bir mağaza örneği alır. Redux ile sunucu oluşturma hakkında daha fazla bilgi edinin.
Yine, bu hem Flux hem de Redux'da mümkün olan bir şey örneğidir, ancak Flux kütüphaneleri bu sorunu bir ton API ve konvansiyon getirerek çözmektedir ve Redux bunu çözmek zorunda bile değildir, çünkü kavramsal sadelik sayesinde birincilik.
Geliştirici Deneyimi
Aslında Redux'u popüler bir Flux kütüphanesi olmaya niyet etmedim - ReactEurope konuşmamda zaman yolculuğu ile sıcak yeniden yükleme konusundaki çalışmamı yazdım . Bir ana hedefim vardı: redüktör kodunu anında değiştirmeyi, hatta eylemleri geçerek "geçmişi değiştirmeyi" mümkün kıl ve devletin yeniden hesaplandığını gör.
Bunu yapabilen tek bir Flux kütüphanesi görmedim. React Hot Loader da bunu yapmanıza izin vermez - aslında Flux depolarını düzenlerseniz kırılır, çünkü onlarla ne yapacağını bilmez.
Redux'un redüktör kodunu yeniden yüklemesi gerektiğinde, arar replaceReducer()
ve uygulama yeni kodla çalışır. Flux'ta, veriler ve işlevler Flux depolarına dolanır, bu nedenle “sadece işlevleri değiştiremezsiniz”. Dahası, yeni sürümleri bir şekilde Dispatcher'a yeniden kaydettirmeniz gerekir - Redux'un sahip olmadığı bir şey.
Ekosistem
Redux, zengin ve hızlı büyüyen bir ekosisteme sahiptir . Bunun nedeni, ara katman yazılımı gibi birkaç uzantı noktası sağlamasıdır . Bu gibi kullanım durumları ile tasarlanmış günlük , destek Promises , gözlenebilirlerin , yönlendirme , değişmezlik dev kontrolleri , sebat akılda, vb. Bunların hepsi yararlı olmayacak, ancak birlikte çalışmak için kolayca birleştirilebilecek bir dizi araca erişime sahip olmak güzel.
Basitlik
Redux, Flux'un (eylemlerin kaydedilmesi ve yeniden oynatılması, tek yönlü veri akışı, bağımlı mutasyonlar) tüm avantajlarını korur ve Dispatcher ve mağaza kaydı eklemeden yeni faydalar (kolay geri alma, sıcak yeniden yükleme) ekler.
Basit tutmak önemlidir, çünkü daha yüksek seviyeli soyutlamalar uygularken sizi aklı başında tutar.
Çoğu Flux kütüphanesinin aksine, Redux API yüzeyi çok küçüktür. Geliştirici uyarılarını, yorumları ve akıl sağlığı kontrollerini kaldırırsanız, bu 99 satırdır . Hata ayıklamak için zor bir zaman uyumsuz kod yok.
Aslında bunu okuyabilir ve tüm Redux'ları anlayabilirsiniz.
Ayrıca , Flux'a kıyasla Redux kullanmanın olumsuz yönlerindeki cevabımı da görün .