फेसबुक फ्लक्स पर Redux का उपयोग क्यों करें? [बन्द है]


1126

मैंने इस उत्तर को पढ़ा है , बॉयलरप्लेट को कम करते हुए , कुछ गिथबाउट उदाहरणों को देखा और यहां तक ​​कि थोड़ा सा (टूडू एप्स) रिडक्स की कोशिश की।

जैसा कि मैं समझता हूं, आधिकारिक redux डॉक्टर प्रेरणा पारंपरिक MVC आर्किटेक्चर की तुलना में पेशेवरों को प्रदान करते हैं। लेकिन यह सवाल का जवाब नहीं देता है:

आपको फेसबुक फ्लक्स पर Redux का उपयोग क्यों करना चाहिए?

क्या यह केवल प्रोग्रामिंग शैलियों का सवाल है: कार्यात्मक बनाम गैर-कार्यात्मक? या सवाल क्षमताओं / देव-औजारों में है जो Redux दृष्टिकोण से अनुसरण करते हैं? शायद स्केलिंग? या परीक्षण?

क्या मैं सही हूं अगर मैं यह कहूं कि रिडक्स उन लोगों के लिए एक प्रवाह है जो कार्यात्मक भाषाओं से आते हैं?

इस प्रश्न का उत्तर देने के लिए आप फ्लक्स बनाम रिडक्स पर कार्यान्वयन रिड्यूस के प्रेरणा बिंदुओं की जटिलता की तुलना कर सकते हैं।

यहाँ आधिकारिक redux डॉक्टर से प्रेरणा बिंदु हैं :

  1. आशावादी अपडेट्स को हैंडल करना ( जैसा कि मैं समझता हूं, यह मुश्किल से 5 वें बिंदु पर निर्भर करता है। क्या फेसबुक फ़्लक्स में इसे लागू करना कठिन है? )
  2. सर्वर पर निर्भरता ( फेसबुक फ्लक्स भी कर सकता है। Redux की तुलना में कोई लाभ? )
  3. मार्ग परिवर्तन करने से पहले डेटा प्राप्त करना ( फेसबुक फ़्लक्स में इसे प्राप्त क्यों नहीं किया जा सकता है? इसके क्या लाभ हैं? )
  4. हॉट रीलोड ( यह रिएक्ट हॉट रीलोड के साथ संभव है । हमें Redux की आवश्यकता क्यों है? )
  5. पूर्ववत करें / फिर से करें कार्यक्षमता
  6. कोई अन्य बिंदु? वर्तमान स्थिति की तरह ...

73
Redux "Facebook Flux" का एक कार्यान्वयन है। फ्लक्स एक पुस्तकालय या ढांचा नहीं है। यह केवल वेब अनुप्रयोगों के लिए एक अनुशंसित वास्तुकला है। मैं नहीं देखता कि आप अमूर्त अवधारणा के साथ एक ठोस कार्यान्वयन की तुलना कैसे कर सकते हैं जिसने इसे प्रेरित किया। फ़्लक्स आर्किटेक्चर का फेसबुक का वास्तविक कार्यान्वयन रिले है और ओपन सोर्स संस्करण अभी भी बहुत प्रारंभिक अवस्था में है। facebook.github.io/relay
चार्ली मार्टिन

2
@CharlieMartin FB फ्लक्स द्वारा मैं इस github.com/facebook/flux/tree/master/examples की तरह एप्लीकेटन का उल्लेख करता हूं । मेरी वर्तमान परियोजना एफबी फ्लक्स (एफबी फ्लक्स के कारण) पर लिखी गई है। यदि आप चाहते हैं कि आप एफबी फ्लक्स आर्किटेक्चर पर Redux आर्किटेक्चर के रूप में सोच सकते हैं।
VB_

2
मैं अब समझता हूँ। आप Redux के फ्लक्स कार्यान्वयन के साथ फेसबुक के उदाहरण फ्लक्स कार्यान्वयन की तुलना करना चाहते हैं
चार्ली मार्टिन

13
रिले फ्लक्स का क्रियान्वयन नहीं है - रिले / ग्राफक्यूएल सर्वर के साथ डेटा-फ़ेचिंग / क्वेरी को प्रबंधित करने के लिए अधिक चिंतित है जबकि फ्लक्स मुख्य रूप से क्लाइंट साइड डेटा मॉडल और व्यू घटकों के बीच डेटा प्रवाह को संरचित करने से संबंधित है। हालांकि कुछ ओवरलैप है: फेसबुक पर, हमारे पास पूरी तरह से रिले या दोनों के साथ फ्लक्स का उपयोग करके पूरी तरह से निर्मित ऐप हैं। एक पैटर्न जो हम उभरते हुए देख रहे हैं, वह रिले को एक अनुप्रयोग के लिए डेटा प्रवाह के थोक का प्रबंधन करने देता है, लेकिन आवेदन राज्य का सबसेट संभालने के लिए साइड स्टोर पर फ्लक्स स्टोर्स का उपयोग करना
Hal

जवाबों:


1958

Redux लेखक यहाँ!

Redux फ्लक्स से अलग नहीं है । कुल मिलाकर इसकी समान वास्तुकला है, लेकिन Redux कार्यात्मक संरचना का उपयोग करके कुछ जटिलता कोनों को काटने में सक्षम है जहां फ्लक्स कॉलबैक पंजीकरण का उपयोग करता है।

Redux में कोई मूलभूत अंतर नहीं है, लेकिन मुझे लगता है कि यह कुछ अमूर्तताओं को आसान बनाता है, या कम से कम इसे लागू करना संभव है, जो फ्लक्स में लागू करना कठिन या असंभव होगा।

Reducer संरचना

उदाहरण के लिए, अंकुरण लीजिए। मेरा फ्लक्स + रिएक्ट राउटर उदाहरण पृष्ठांकन को संभालता है, लेकिन इसके लिए कोड भयानक है। एक कारण यह भयानक है कि फ्लक्स दुकानों में कार्यक्षमता का पुन: उपयोग करने के लिए अप्राकृतिक बनाता है। यदि दो दुकानों को अलग-अलग क्रियाओं के जवाब में पेजिनेशन को संभालने की आवश्यकता होती है, तो उन्हें या तो एक सामान्य आधार स्टोर से प्राप्त करने की आवश्यकता होती है (बुरा! आप अपने आप को एक विशेष डिजाइन में लॉक कर रहे हैं जब आप विरासत का उपयोग करते हैं), या बाहरी रूप से परिभाषित फ़ंक्शन को कॉल करें। ईवेंट हैंडलर, जिसे किसी तरह फ्लक्स स्टोर के निजी राज्य में काम करना होगा। पूरी बात गड़बड़ है (हालांकि संभव के दायरे में निश्चित रूप से)।

दूसरी ओर, Redux पृष्ठ पर अंक लगाना रचना के लिए प्राकृतिक धन्यवाद है। यह सभी तरह से नीचे की ओर reducers है, इसलिए आप एक reducer फैक्ट्री लिख सकते हैं, जो pagination reducers उत्पन्न करता है और फिर इसे अपने reducer के पेड़ में उपयोग करता है । यह इतना आसान क्यों है, इसकी कुंजी यह है कि फ्लक्स में, स्टोर सपाट होते हैं, लेकिन Redux में, रिड्यूसर को कार्यात्मक रचना के माध्यम से घोंसला बनाया जा सकता है, ठीक उसी तरह जैसे रिएक्ट घटकों को नेस्ट किया जा सकता है।

यह पैटर्न नो-यूजर-कोड अनडू / रीडो जैसी अद्भुत विशेषताओं को भी सक्षम बनाता है । क्या आप कोड के दो लाइन होने पर एक फ्लक्स ऐप में Undo / Redo को प्लग करने की कल्पना कर सकते हैं? मुश्किल से। Redux के साथ, यह है- redain, रचनाकार पैटर्न पैटर्न के लिए धन्यवाद। मुझे इस बारे में कुछ नया करने की ज़रूरत नहीं है - यह पैटर्न का बीड़ा उठाया है और एल्म आर्किटेक्चर में विस्तार से वर्णन किया गया है जो स्वयं फ्लक्स से प्रभावित था।

सर्वर रेंडरिंग

लोग फ़्लक्स के साथ सर्वर पर ठीक प्रतिपादन कर रहे हैं, लेकिन यह देखते हुए कि हमारे पास 20 फ़्लक्स लाइब्रेरी हैं, जो सर्वर रेंडरिंग को "आसान" बनाने का प्रयास कर रहे हैं, शायद फ़्लक्स के सर्वर पर कुछ खुरदरे किनारे हैं। सच्चाई यह है कि फेसबुक बहुत सर्वर रेंडरिंग नहीं करता है, इसलिए वे इसके बारे में बहुत चिंतित नहीं हैं, और इसे आसान बनाने के लिए पारिस्थितिकी तंत्र पर भरोसा करते हैं।

पारंपरिक फ्लक्स में, स्टोर एकल हैं। इसका मतलब है कि सर्वर पर अलग-अलग अनुरोधों के लिए डेटा को अलग करना मुश्किल है। असंभव नहीं, लेकिन कठिन है। यही कारण है कि अधिकांश फ्लक्स लाइब्रेरी (और साथ ही नए फ्लक्स यूटिल्स ) अब आपको एकल के बजाय कक्षाओं का उपयोग करने का सुझाव देते हैं, इसलिए आप प्रति अनुरोध स्टोर को तुरंत कर सकते हैं।

अभी भी निम्नलिखित समस्याएं हैं जिन्हें आपको फ्लक्स में हल करने की आवश्यकता है (या तो स्वयं या अपने पसंदीदा फ्लक्स लाइब्रेरी जैसे फ्लूमॉक्स या ऑल्ट की मदद से ):

  • यदि स्टोर कक्षाएं हैं, तो मैं अनुरोध के अनुसार डिस्पैचर के साथ उन्हें कैसे बनाऊं और नष्ट कर दूं? मैं स्टोर कब पंजीकृत करूं?
  • मैं दुकानों से डेटा को कैसे हाइड करता हूं और बाद में इसे क्लाइंट पर रीहाइड्रेट करता हूं? क्या मुझे इसके लिए विशेष तरीकों को लागू करने की आवश्यकता है?

बेशक फ्लक्स फ्रेमवर्क (वेनिला फ्लक्स नहीं) के पास इन समस्याओं का समाधान है, लेकिन मुझे लगता है कि वे अधूरे हैं। उदाहरण के लिए, फ्लुमॉक्स आपको लागू करने serialize()और deserialize()अपने स्टोर में करने के लिए कहता है । ऑल्ट इस शिलालेख को यह प्रदान करके हल करता है takeSnapshot()कि स्वचालित रूप से आपके राज्य को JSON के पेड़ में क्रमबद्ध करता है।

Redux अभी और आगे बढ़ता है: चूंकि सिर्फ एक स्टोर (कई रिड्यूसर द्वारा प्रबंधित) है, इसलिए आपको (पुनः) हाइड्रेशन को प्रबंधित करने के लिए किसी विशेष एपीआई की आवश्यकता नहीं है। आपको "फ्लश" या "हाइड्रेट" स्टोर करने की आवश्यकता नहीं है - बस एक ही स्टोर है, और आप इसकी वर्तमान स्थिति पढ़ सकते हैं, या एक नए राज्य के साथ एक नया स्टोर बना सकते हैं। प्रत्येक अनुरोध को एक अलग स्टोर उदाहरण मिलता है। Redux के साथ सर्वर रेंडरिंग के बारे में और पढ़ें।

फिर, यह फ्लक्स और रेडक्स दोनों में कुछ संभव है, लेकिन फ्लक्स पुस्तकालयों ने एक टन एपीआई और सम्मेलनों को पेश करके इस समस्या को हल किया है, और रेडक्स को भी इसे हल करने की आवश्यकता नहीं है क्योंकि इसमें वह समस्या नहीं है। वैचारिक सरलता के लिए पहला स्थान धन्यवाद।

डेवलपर का अनुभव

मैंने वास्तव में Redux को एक लोकप्रिय फ़्लक्स लाइब्रेरी बनने का इरादा नहीं दिया था - मैंने इसे लिखा था क्योंकि मैं समय की यात्रा के साथ हॉट रीलोडिंग पर अपने रिएक्टयूरोप बात पर काम कर रहा था । मेरा एक मुख्य उद्देश्य था: कार्रवाई को पार करते हुए मक्खी पर रेड्यूसर कोड को बदलना या यहां तक ​​कि "अतीत को बदलना" संभव है, और राज्य को पुनर्गणित होते हुए देखें।

मैंने एक भी फ्लक्स लाइब्रेरी नहीं देखी है जो ऐसा करने में सक्षम है। रिएक्ट हॉट लोडर आपको ऐसा करने की अनुमति नहीं देता है - वास्तव में यदि आप फ्लक्स स्टोर को संपादित करते हैं तो यह टूट जाता है क्योंकि यह नहीं जानता कि उनके साथ क्या करना है।

जब Redux को reducer कोड को पुनः लोड करने की आवश्यकता होती है, तो यह कॉल करता है replaceReducer(), और ऐप नए कोड के साथ चलता है। फ्लक्स में, डेटा और फ़ंक्शंस फ़्लक्स स्टोर्स में उलझे हुए हैं, इसलिए आप "केवल फ़ंक्शन को प्रतिस्थापित नहीं कर सकते"। इसके अलावा, आपको किसी तरह डिस्पैचर के साथ नए संस्करणों को फिर से पंजीकृत करना होगा- कुछ Redux के पास भी नहीं है।

पारिस्थितिकी तंत्र

Redux में एक समृद्ध और तेजी से बढ़ता पारिस्थितिकी तंत्र है । ऐसा इसलिए है क्योंकि यह मिडलवेयर जैसे कुछ विस्तार बिंदु प्रदान करता है । इसका उपयोग लॉगिंग , प्रोमिस , ऑब्ज़र्वबल्स के लिए समर्थन , रूटिंग , अपरिवर्तनीयता देव जाँच , दृढ़ता , आदि जैसे मामलों को ध्यान में रखकर किया गया था। ये सभी उपयोगी नहीं होंगे, लेकिन ऐसे उपकरणों का एक सेट तक पहुंचना अच्छा है जिन्हें आसानी से एक साथ काम करने के लिए जोड़ा जा सकता है।

सादगी

Redux फ़्लक्स के सभी लाभों (रिकॉर्डिंग और पुनरावृत्ति, यूनिडायरेक्शनल डेटा फ्लो, निर्भर म्यूटेशन) को संरक्षित करता है और डिस्पैचर और स्टोर पंजीकरण शुरू किए बिना नए लाभ (आसान पूर्ववत करना, हॉट रीलोडिंग) जोड़ता है।

इसे सरल रखना महत्वपूर्ण है क्योंकि उच्च स्तर के अमूर्त को लागू करते समय यह आपको सन्न रखता है।

अधिकांश फ्लक्स लाइब्रेरी के विपरीत, Redux API की सतह छोटी है। यदि आप डेवलपर की चेतावनियों, टिप्पणियों और पवित्रता की जाँच को हटा देते हैं, तो यह 99 पंक्तियाँ हैं । डीबग करने के लिए कोई ट्रिकी async कोड नहीं है।

आप वास्तव में इसे पढ़ सकते हैं और सभी Redux को समझ सकते हैं।


फ्लक्स की तुलना में Redux का उपयोग करने के डाउनसाइड पर मेरा उत्तर भी देखें ।


3
उत्तर के लिए धन्यवाद ... मैं js..in में नया हूं। आपके उत्तर में आपने कहा है कि फ्लक्स सिंगलटन डिजाइन पैटर्न का उपयोग कर रहा है ... क्या आप मुझे बता सकते हैं कि वे किस तरह के डिजाइन पैटर्न का उपयोग कर रहे हैं ... और फ्लक्स में कर सकते हैं क्या आप मुझे बता जहां वे सिंगलटन पद्धति का उपयोग कर रहे हैं ... आप दोनों एक उदाहरण देना कर सकते हैं ... मैं समझ गया कि क्या यहां से डिजाइन पैटर्न करता सिंगलटन

2
मैंने अपना एंड्रॉइड / जावा कार्यान्वयन (फ्लक्सएक्सन) फ्लक्सएक्सोर (मूल रूप से शुद्ध प्रवाह) पर आधारित शुरू किया। एक बार जब मैंने redux को देखा, तो मुझे बेच दिया गया। कुछ अंश हैं जिन्हें मैंने विशुद्ध रूप से प्रवाहित किया है, लेकिन मनुष्य, आपका दायित्व बहुत बढ़िया है!
०ous पर ठंढाईदार

5
क्या आप Redux सीखना चाहते हैं? बस इस वीडियो को देखें
gsalgadotoledo

5
हमने चुना है कि यह फ्लक्स की तुलना में अधिक राय वाला है। हम लगातार इस बारे में लड़ रहे थे कि कैसे / जहां कुछ निश्चित कोड जाना चाहिए, आदि। Redux ने हमारे लिए उस भ्रम को दूर कर दिया। हमने वेब और प्रतिक्रिया-मूल के लिए Redux के साथ एप्लिकेशन बनाए हैं और यह अद्भुत है !!
चीज

1
लाइन github.com/reactjs/redux/blob/… उस प्रश्न का उत्तर था जिसे मैं एक सप्ताह से खोज रहा था: स्टोर और रिड्यूसर को कैसे तैयार किया जाए, ताकि विभिन्न संदर्भों में उपयोग किए जाने वाले पुन: प्रयोज्य घटक के कई उदाहरणों को बिना डुप्लिकेट किए संभाला जा सके। तर्क। उत्तर ऐसा प्रतीत होता है: तीन स्तरों के गहरे भंडार का उपयोग करें: पहला स्तर: घटक का नाम ("पृष्ठांकन"), दूसरा स्तर: कंटेनर का नाम ("स्टारगेज़र्सबायरेपो"), 3 स्तर: कंटेनर की अद्वितीय कुंजी / आईडी ( ${login}/${name})। आपका बहुत बहुत धन्यवाद!
1963 को क़ुबलेक

101

Quora में, कोई कहता है :

सबसे पहले, फ्लक्स के बिना रिएक्ट के साथ एप्लिकेशन लिखना पूरी तरह से संभव है।

इसके अलावा यह दृश्य आरेख, जिसे मैंने दोनों के त्वरित दृश्य को दिखाने के लिए बनाया है, संभवतः उन लोगों के लिए एक त्वरित उत्तर है जो पूरे उत्तर को नहीं पढ़ना चाहते हैं: फ्लक्स बनाम रेडक्स

लेकिन अगर आप अभी भी अधिक जानने में रुचि रखते हैं, तो पढ़ें।

मेरा मानना ​​है कि आपको शुद्ध प्रतिक्रिया से शुरू करना चाहिए, फिर Redux और Flux सीखें। आपके पास रिएक्ट के साथ कुछ वास्तविक अनुभव होने के बाद, आप देखेंगे कि Redux आपके लिए सहायक है या नहीं।

हो सकता है कि आपको लगेगा कि Redux आपके ऐप के लिए है और हो सकता है कि आपको पता चले, कि Redux एक ऐसी समस्या को हल करने की कोशिश कर रहा है जिसे आप वास्तव में अनुभव नहीं कर रहे हैं।

यदि आप सीधे Redux से शुरू करते हैं, तो आप ओवर-इंजीनियर कोड के साथ अंत कर सकते हैं, कोड को बनाए रखने के लिए और अधिक बग के साथ और Redux की तुलना में कठिन हो सकता है।

से Redux डॉक्स :

प्रेरणा
जावास्क्रिप्ट एकल पृष्ठ अनुप्रयोगों के लिए आवश्यकताओं के रूप में तेजी से जटिल हो गए हैं, हमारे कोड पहले से कहीं अधिक राज्य का प्रबंधन करना चाहिए। इस राज्य में सर्वर प्रतिक्रियाएं और कैश्ड डेटा, साथ ही स्थानीय रूप से बनाए गए डेटा शामिल हो सकते हैं जो अभी तक सर्वर पर बरकरार नहीं हैं। UI स्थिति भी जटिलता में बढ़ रही है, क्योंकि हमें सक्रिय मार्गों, चयनित टैब, स्पिनरों, पृष्ठ पर नियंत्रण और इतने पर प्रबंधन करने की आवश्यकता है।

इस बदलते राज्य का प्रबंधन कठिन है। यदि कोई मॉडल किसी अन्य मॉडल को अपडेट कर सकता है, तो एक दृश्य एक मॉडल को अपडेट कर सकता है, जो किसी अन्य मॉडल को अपडेट करता है, और यह बदले में, किसी अन्य दृश्य को अपडेट करने का कारण हो सकता है। कुछ बिंदु पर, आप अब यह नहीं समझते हैं कि आपके ऐप में क्या होता है क्योंकि आपने कब, क्यों और कैसे इसकी स्थिति पर नियंत्रण खो दिया है। जब एक प्रणाली अपारदर्शी और गैर-नियतात्मक होती है, तो बग को पुन: पेश करना या नई सुविधाओं को जोड़ना मुश्किल होता है।

जैसे कि यह बहुत बुरा नहीं था, सामने के उत्पाद विकास में आम हो रही नई आवश्यकताओं पर विचार करें। डेवलपर्स के रूप में, हमें आशावादी अपडेट, सर्वर-साइड रेंडरिंग, रूट ट्रांज़ैक्शन करने से पहले डेटा लाने, और इसी तरह से संभालने की उम्मीद है। हम खुद को एक ऐसी जटिलता का प्रबंधन करने की कोशिश कर रहे हैं जिसे हमें पहले कभी नहीं देखना पड़ा है, और हम अनिवार्य रूप से सवाल पूछते हैं: क्या यह हार मानने का समय है? जवाब न है।

इस जटिलता को संभालना मुश्किल है क्योंकि हम दो अवधारणाओं को मिला रहे हैं जो मानव मन के लिए बहुत कठिन हैं: उत्परिवर्तन और अतुल्यकालिकता। मैं उन्हें मेंटोस और कोक कहता हूं। अलग होने पर दोनों महान हो सकते हैं, लेकिन साथ में एक गड़बड़ पैदा करते हैं। पुस्तकालय जैसी प्रतिक्रियाएँ इस समस्या को दृश्य परत में असिंक्रोनस और डायरेक्ट डोम हेरफेर को दूर करने का प्रयास करती हैं। हालाँकि, आपके डेटा की स्थिति को प्रबंधित करना आपके लिए शेष है। यह वह जगह है जहाँ Redux आता है।

फ़्लक्स, CQRS और इवेंट सोर्सिंग के नक्शेकदम पर चलते हुए, Redux स्टेट्स म्यूटेशन का अनुमान लगाने का प्रयास करता है कि कैसे और कब अपडेट हो सकते हैं। ये प्रतिबंध Redux के तीन सिद्धांतों में परिलक्षित होते हैं।

Redux डॉक्स से भी :

कोर कॉन्सेप्ट्स
Redux अपने आप में बहुत सरल है।

कल्पना कीजिए कि आपके ऐप की स्थिति को एक सादे वस्तु के रूप में वर्णित किया गया है। उदाहरण के लिए, एक टूडू ऐप की स्थिति इस तरह दिख सकती है:

{
  todos: [{
    text: 'Eat food',
    completed: true
  }, {
    text: 'Exercise',
    completed: false
  }],
  visibilityFilter: 'SHOW_COMPLETED'
}

यह ऑब्जेक्ट एक "मॉडल" की तरह है सिवाय इसके कि कोई सेटर नहीं है। ऐसा इसलिए है ताकि कोड के अलग-अलग हिस्से राज्य में मनमाने ढंग से बदलाव न कर सकें, जिससे हार्ड-टू-रिप्रेजेंट बग्स हो सकते हैं।

राज्य में कुछ बदलने के लिए, आपको एक कार्रवाई भेजने की आवश्यकता है। एक क्रिया एक सामान्य जावास्क्रिप्ट ऑब्जेक्ट है (ध्यान दें कि हम किसी भी जादू का परिचय कैसे नहीं देते?) जो बताता है कि क्या हुआ। यहां कुछ उदाहरण दिए गए हैं:

{ type: 'ADD_TODO', text: 'Go to swimming pool' }
{ type: 'TOGGLE_TODO', index: 1 }
{ type: 'SET_VISIBILITY_FILTER', filter: 'SHOW_ALL' }

यह देखते हुए कि हर परिवर्तन को एक कार्रवाई के रूप में वर्णित किया गया है, हमें ऐप में क्या चल रहा है, इसकी स्पष्ट समझ है। अगर कुछ बदला है, तो हम जानते हैं कि यह क्यों बदला। क्रियाएँ ब्रेडक्रंब की तरह होती हैं जो कि हुआ है। अंत में, राज्य और कार्यों को एक साथ जोड़ने के लिए, हम एक रिड्यूसर नामक एक फ़ंक्शन लिखते हैं। फिर, इसके बारे में कुछ भी जादू नहीं है - यह सिर्फ एक फ़ंक्शन है जो तर्क के रूप में राज्य और कार्रवाई करता है, और ऐप की अगली स्थिति देता है। एक बड़े ऐप के लिए ऐसा फ़ंक्शन लिखना कठिन होगा, इसलिए हम राज्य के कुछ हिस्सों को प्रबंधित करने के लिए छोटे कार्य लिखते हैं:

function visibilityFilter(state = 'SHOW_ALL', action) {
  if (action.type === 'SET_VISIBILITY_FILTER') {
    return action.filter;
  } else {
    return state;
  }
}

function todos(state = [], action) {
  switch (action.type) {
  case 'ADD_TODO':
    return state.concat([{ text: action.text, completed: false }]);
  case 'TOGGLE_TODO':
    return state.map((todo, index) =>
      action.index === index ?
        { text: todo.text, completed: !todo.completed } :
        todo
   )
  default:
    return state;
  }
}

और हम एक और reducer लिखते हैं जो हमारे ऐप की संपूर्ण स्थिति को संबंधित राज्य कुंजी के लिए उन दो reducers को कॉल करके प्रबंधित करता है:

function todoApp(state = {}, action) {
  return {
    todos: todos(state.todos, action),
    visibilityFilter: visibilityFilter(state.visibilityFilter, action)
  };
}

यह मूल रूप से Redux का पूरा विचार है। ध्यान दें कि हमने किसी Redux API का उपयोग नहीं किया है। इस पैटर्न को सुविधाजनक बनाने के लिए कुछ उपयोगिताओं के साथ आता है, लेकिन मुख्य विचार यह है कि आप यह वर्णन करते हैं कि कार्रवाई की वस्तुओं के जवाब में समय के साथ आपका राज्य कैसे अपडेट किया जाता है, और आपके द्वारा लिखे गए कोड का 90% सिर्फ सादे जावास्क्रिप्ट है, जिसमें Redux का कोई उपयोग नहीं है। स्वयं, इसके एपीआई या कोई जादू।


57

डैन अब्रामोव द्वारा इस पोस्ट को पढ़ने से आप सबसे अच्छी शुरुआत कर सकते हैं, जहाँ वह फ्लक्स के विभिन्न कार्यान्वयनों और उनके व्यापार-बंदों के बारे में चर्चा करते हैं, जब वे रिडक्स लिख रहे थे: द एवोल्यूशन ऑफ़ फ्लक्स फ्रेमवर्क

दूसरी बात यह है कि आप जिस पेज को लिंक करते हैं, वह वास्तव में Redux की प्रेरणाओं पर चर्चा नहीं करता है, इसलिए फ्लक्स (और रिएक्ट) के पीछे की प्रेरणाएँ। तीन सिद्धांतों अधिक Redux विशिष्ट हालांकि अभी भी मानक फ्लक्स वास्तुकला से कार्यान्वयन मतभेद से निपटने नहीं करता है।

मूल रूप से, फ्लक्स के पास कई स्टोर हैं जो घटकों के साथ UI / API इंटरैक्शन के लिए राज्य परिवर्तन की गणना करते हैं और इन परिवर्तनों को उन घटनाओं के रूप में प्रसारित करते हैं जो घटक सदस्यता ले सकते हैं। Redux में, केवल एक स्टोर है जिसे हर घटक सब्सक्राइब करता है। IMO को कम से कम ऐसा लगता है जैसे Redux आगे डेटा को एकीकृत (या कम करके, जैसा कि Redux कहेगा) के डेटा के प्रवाह को आसान बनाता है और घटकों को वापस करता है - जबकि फ्लक्स डेटा प्रवाह के दूसरे पक्ष को एकीकृत करने पर ध्यान केंद्रित करता है - देखें नमूना।


27

मैं एक प्रारंभिक अपनाने वाला हूं और फेसबुक फ्लक्स लाइब्रेरी का उपयोग करके एक मध्य-बड़े एकल पृष्ठ के आवेदन को लागू किया है।

जैसा कि मैंने बातचीत में थोड़ी देर की है, मैं सिर्फ इतना बताऊंगा कि मेरी सबसे अच्छी उम्मीदों के बावजूद फेसबुक उनके फ्लक्स कार्यान्वयन को अवधारणा का प्रमाण मानता है और इस पर कभी ध्यान नहीं दिया गया।

मैं आपको इसके साथ खेलने के लिए प्रोत्साहित करता हूं, क्योंकि यह फ्लक्स आर्किटेक्चर के आंतरिक कामकाज को अधिक उजागर करता है जो काफी शैक्षिक है, लेकिन साथ ही यह कई लाभ प्रदान नहीं करता है जो कि Redux जैसी लाइब्रेरी प्रदान करते हैं (जो नहीं हैं छोटी परियोजनाओं के लिए महत्वपूर्ण है, लेकिन बड़े लोगों के लिए बहुत मूल्यवान बन जाते हैं)।

हमने तय किया है कि आगे बढ़ते हुए हम Redux जा रहे हैं और मेरा सुझाव है कि आप भी ऐसा ही करें;


मैं छह महीने से फेसबुक फ्लक्स ऐप विकसित कर रहा हूं। और मुझे अभी भी यकीन नहीं है कि एक प्रवास समय लाभ Redux प्रदान करने के लायक है। मैं FB फ्लक्स पर Redux के पेशेवरों / विपक्षों के बारे में आपकी सभी टिप्पणियों की सराहना करूँगा!
VB_

1
@VolodymyrBakhmatiuk हमारे लिए यह ज्यादातर बॉयलरप्लेट की मात्रा को कम करने के बारे में है, जिसे हमें लिखना होगा + बेहतर त्रुटि से निपटने (उदाहरण के लिए, यदि आप अपनी निरंतर सूची में परिभाषित नहीं किए गए थे तो एक्शन फायर करते हैं, तो एफएलबी फ्लॉप नहीं होगा और यह सभी का कारण बन सकता है) समस्याओं का प्रकार) फ्लक्स में कुछ और उन्नत क्षमताएं हैं, लेकिन मैंने अभी तक उनका उपयोग नहीं किया है
लड़के नेशर

1
@GuyNesher को अपरिभाषित कार्रवाई का संकलन-समय पर पता लगाया जाना चाहिए, न कि रन-टाइम पर। प्रवाह (एक और फेसबुक योगदान) आपको ऐसा करने की अनुमति देता है।
डॉमिनिक परेट्टी

@DominiquePERETTI - सच (लाइनिंग का उपयोग भी कर सकते हैं), लेकिन यह इस तथ्य को नहीं बदलता है कि रन टाइम पर त्रुटि को पकड़ना
दयालु नहीं है

मैंने FBFlux से निपटने के लिए कुछ सरल सहायकों को लिखा था, और यह वास्तव में कम बॉयलरप्लेट और ऐप लगता है जो मेरे द्वारा पाए गए Redux ऐप के सभी उदाहरणों से अधिक है। दो देवों के बीच 9+ महीने तक एक ऐप पर काम किया और आर्किटेक्चर के साथ कभी भी कोई समस्या नहीं हुई।
रोब 2 डी

20

यहाँ फ्लक्स पर Redux की सरल व्याख्या दी गई है। Redux में डिस्पैचर नहीं है। यह reducers नामक शुद्ध कार्यों पर निर्भर करता है। इसे डिस्पैचर की जरूरत नहीं है। प्रत्येक क्रिया एकल स्टोर को अपडेट करने के लिए एक या अधिक reducers द्वारा नियंत्रित की जाती है। चूंकि डेटा अपरिवर्तनीय है, इसलिए reducers एक नया अपडेटेड स्टेट लौटाते हैं जो स्टोर को अपडेट करता हैयहां छवि विवरण दर्ज करें

अधिक जानकारी के लिए फ्लक्स बनाम रेडक्स


से अधिक दुकानों के बारे में, अब Redux में कुछ संभव है, में प्रतिक्रिया-redux आप अलग दुकानों के लिए एक महत्वपूर्ण जोड़ सकते हैं: redux.js.org/faq/storesetup काम कर नमूना: github.com/Lemoncode/redux-multiple-stores
Braulio

6

मैंने फ्लक्स के साथ काफी लंबा समय काम किया और अब रेडक्स का उपयोग करते हुए काफी लंबा समय है। जैसा कि डैन ने बताया कि दोनों आर्किटेक्चर इतने अलग नहीं हैं। बात यह है कि Redux चीजों को सरल और साफ बनाता है। यह आपको फ्लक्स के शीर्ष पर कुछ चीजें सिखाता है। उदाहरण के लिए फ्लक्स एक-दिशा डेटा प्रवाह का एक आदर्श उदाहरण है। चिंताओं का पृथक्करण जहां हमारे पास डेटा है, इसकी जोड़तोड़ और दृश्य परत अलग हो गई है। Redux में हमारे पास समान चीजें हैं लेकिन हम अपरिवर्तनीयता और शुद्ध कार्यों के बारे में भी सीखते हैं।


5

2018 के मध्य में एक्सटीजेएस से (कुछ वर्षों में) पलायन की एक नई प्रतिक्रिया / रिड्यूक अपनाने वाले से:

Redux लर्निंग कर्व के पीछे की ओर खिसकने के बाद मेरे पास एक ही सवाल था और सोचा था कि शुद्ध प्रवाह ओपी की तरह सरल होगा।

मैंने जल्द ही फ्लक्स पर रेडक्स के लाभों को ऊपर दिए गए उत्तरों के रूप में नोट किया, और इसे अपने पहले ऐप में काम कर रहा था।

बॉयलर की प्लेट पर फिर से पकड़ बनाते हुए, मैंने कुछ अन्य राज्य प्रबंधन के कामों की कोशिश की, जो सबसे अच्छा मुझे मिला वह था रीमैच

यह बहुत अधिक सहज था तब वेनिला रेडक्स, यह बॉयलरप्लेट के 90% को काट देता है और 75% उस समय को काट देता है जो मैं रेडक्स पर खर्च कर रहा था (मुझे लगता है कि एक पुस्तकालय करना चाहिए), मुझे एक युगल उद्यम ऐप मिल रहा था अभी जा रहा है।

यह भी उसी redux टूलिंग के साथ चलता है। यह एक अच्छा लेख है जिसमें कुछ लाभों को शामिल किया गया है।

तो किसी और के लिए जो "सरल Redux" खोजते हुए इस SO पोस्ट पर पहुंचे, मैं इसे सभी लाभों के साथ Redux के सरल विकल्प और बॉयलरप्लेट के 1/4 भाग के रूप में आज़माने की सलाह देता हूं।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.