Redux और RxJS, कोई समानताएं?


113

मुझे पता है कि Redux फ्लक्स का एक बेहतर "कार्यान्वयन" है, या बेहतर है कि यह चीजों को सरल बनाने के लिए एक नया स्वरूप है (एप्लिकेशन राज्य प्रबंधन)।

मैंने प्रतिक्रियात्मक प्रोग्रामिंग (आरएक्सजेएस) के बारे में बहुत कुछ सुना है, लेकिन मैंने अभी तक इसे सीखने की हिम्मत नहीं की है।

तो मेरा सवाल यह है कि क्या इस दो तकनीकों के बीच कोई चौराहा (कुछ भी सामान्य) है या वे पूरक हैं? ... या बिलकुल अलग?

जवाबों:


185

संक्षेप में, वे बहुत अलग उद्देश्यों के लिए बहुत अलग पुस्तकालय हैं, लेकिन हां कुछ अस्पष्ट समानताएं हैं।

Redux पूरे एप्लिकेशन को प्रबंधित करने के लिए एक उपकरण है। यह आमतौर पर यूआई के लिए एक वास्तुकला के रूप में उपयोग किया जाता है। इसे (आधा) कोणीय के विकल्प के रूप में सोचें।

RxJS एक प्रतिक्रियाशील प्रोग्रामिंग लाइब्रेरी है। यह आमतौर पर जावास्क्रिप्ट में अतुल्यकालिक कार्यों को पूरा करने के लिए एक उपकरण के रूप में उपयोग किया जाता है। इसे प्रोमिस के विकल्प के रूप में सोचें।


रिएक्टिव प्रोग्रामिंग एक प्रतिमान (काम करने और सोचने का तरीका) है जहां डेटा परिवर्तन दूर से देखे जाते हैं । डेटा को दूर से नहीं बदला जाता है

यहाँ दूर से परिवर्तित का एक उदाहरण है :

// In the controller.js file
model.set('name', 'George');

मॉडल बदल गया है नियंत्रक से।

यहाँ दूर से देखा गया एक उदाहरण है :

// logger.js
store.subscribe(function (data) {
    console.log(data);
});

लकड़हारे में, हम स्टोर (दूर से) में होने वाले डेटा परिवर्तनों का अवलोकन करते हैं, और कंसोल पर लिखते हैं।


Redux प्रतिक्रियाशील प्रतिमान का उपयोग थोड़े ही करता है: स्टोर प्रतिक्रियाशील है। आप इसकी सामग्री को दूर से सेट नहीं करते हैं। इसलिए store.set()Redux में नहीं है। स्टोर दूर से ही क्रियाओं को देखता है, और स्वयं को बदलता है। और स्टोर दूसरों को अपने डेटा को दूर से देखने की अनुमति देता है।

RxJS भी रिएक्टिव प्रतिमान का उपयोग करता है, लेकिन इसके बजाय एक वास्तुकला होने का, तो यह आपको बुनियादी निर्माण घटक, देता observables , इस "दूर से देख कर" पैटर्न पूरा करने के लिए।

निष्कर्ष निकालने के लिए, विभिन्न उद्देश्यों के लिए बहुत अलग चीजें, लेकिन कुछ विचारों को साझा करें।


4
नहीं, आपको उन्हें एक साथ उपयोग नहीं करना चाहिए। लोगों ने Rx का उपयोग करके Redux का अनुकरण किया है। एक त्वरित Google आपके लिए उदाहरण ढूंढेगा। यदि आप अपने प्रतिक्रियाशील UI के लिए Rx का उपयोग करना चाहते हैं, तो Cycle.js, आंद्रे के ढांचे की जांच करें। मैं हाल ही में इसका इस्तेमाल कर रहा हूं और यह शानदार है। एपीआई हाल ही में बहुत कुछ बदल रहा है, लेकिन मेरा मानना ​​है कि वह आखिरकार इसके कुछ हिस्सों को फ्रीज करना शुरू कर रहा है।
जोएल डेंटिसी

17
आधिकारिक redux डॉक्स के अनुसार , "वे एक साथ शानदार काम करते हैं।"
galki

12
वे एक साथ महान काम करते हैं! एक Redux मिडिलवेयर है जो आपको Redux क्रियाओं के लिए RxJS और ऑब्ज़र्वबल्स का उपयोग करने का अवसर देता है। github.com/redux-observable/redux-observable इसके अतिरिक्त मैंने कैसे के बारे में एक ब्लॉग पोस्ट लिखा है: robinwieruch.de/redux-observable-rxjs
Robin Wieruch

1
Redux प्रतिमान ने मेरे Android प्रोजेक्ट कोडबेस को और अधिक प्रतिक्रियाशील बनाने में मदद की। RxJava के संयोजन में, स्टेट्स को अपडेट करने के लिए हमारे डेटा प्रवाह बटन और अन्य क्षेत्रों से आते हैं, हमारी पठनीयता और प्रदर्शन को सुपरचार्ज करते हैं। पुस्तकालय निश्चित रूप से अच्छी तरह से एक साथ चलते हैं, और उनके लाभ भाषा-अज्ञेय हैं।
केनी वर्डेन

वे एक साथ महान काम करते हैं, लेकिन व्यवहार में आपके लिए प्रतिक्रियाशील कर सकते हैं कि Redux क्या करेगा - अपने घटकों की स्थिति को मॉडल में सिंक करें, इसलिए अक्सर दोनों का उपयोग करने के लिए बहुत समझ में नहीं आता है
फिलिप सोबाकक

32

वे बहुत अलग चीजें हैं।

RxJS का उपयोग रिएक्टिव प्रोग्रामिंग करने के लिए किया जा सकता है और यह 250+ ऑपरेटरों के साथ एक बहुत गहन पुस्तकालय है।

और Redux github रेपो पर वर्णित है "Redux जावास्क्रिप्ट ऐप्स के लिए एक पूर्वानुमानित राज्य कंटेनर है"।

Redux एप्स में राज्य को संभालने के लिए सिर्फ एक उपकरण है। लेकिन तुलना में आप सिर्फ RxJS में एक पूर्ण ऐप बना सकते हैं।

उम्मीद है की यह मदद करेगा :)


3
आपका जवाब अच्छा है @cmdv जब मैं अपना लिख ​​रहा था तब मैंने इसे नहीं देखा था।
एंड्रे स्टाल्ट्ज

4

Redux एक राज्य प्रबंधन पुस्तकालय है जो अद्यतन परिचालनों के लिए अच्छी तरह से परिभाषित मानकों के साथ आता है। जहाँ तक आप मानकों से चिपके रहते हैं, आप अपने डेटा प्रवाह को सरल और तर्क के लिए आसान रख सकते हैं। यह बिचौलियों और स्टोर एन्हांसर्स के साथ डेटा प्रवाह को बढ़ाने की क्षमता भी लाता है।

RxJS प्रतिक्रियाशील प्रोग्रामिंग के लिए एक टूलकिट है। आप वास्तव में एक स्ट्रीम के रूप में अपने ऐप में होने वाली हर चीज के बारे में सोच सकते हैं। RxJS उन धाराओं को प्रबंधित करने के लिए एक बहुत ही समृद्ध उपकरण सेट करता है।

RxJS और Redux ने कहां इंटरसेप्ट किया? Redux में आप अपने राज्य को क्रियाओं के साथ अपडेट करते हैं और जाहिर है कि इन क्रियाओं को धाराओं के रूप में माना जा सकता है। Redux-observable (आपके पास नहीं है) जैसे मिडिलवेयर का उपयोग करके आप अपने तथाकथित "बिजनेस लॉजिक" को प्रतिक्रियात्मक तरीके से लागू कर सकते हैं। एक और बात यह है कि आप अपने redux स्टोर से एक अवलोकन कर सकते हैं जो कभी-कभी एक बढ़ाने वाले का उपयोग करने की तुलना में आसान हो सकता है।


2

इसे संक्षेप में रखने के लिए:

Redux: फ्लक्स प्रेरित लाइब्रेरी जिसका इस्तेमाल राज्य प्रबंधन के लिए किया जाता है ।

RxJS: यह प्रतिक्रियाशील प्रोग्रामिंग दर्शन पर आधारित एक और जावास्क्रिप्ट लाइब्रेरी है, जिसका उपयोग "स्ट्रीम" (वेधशाला, आदि) से निपटने के लिए किया जाता है [स्ट्रीम अवधारणाओं को समझने के लिए प्रतिक्रियाशील प्रोग्रामिंग के बारे में पढ़ें]।


1

जब मैंने Redux से प्रेरित RxJS- कोड किया तो मैं कुछ व्यावहारिक अंतर जोड़ना चाहता था।

मैंने प्रत्येक एक्शन टाइप को सब्जेक्ट इंस्टेंस पर मैप किया। प्रत्येक स्टेटफुल कंपोनेंट में एक सब्जेक्ट होगा, जिसे बाद में रिड्यूसर फंक्शन में मैप किया जाएगा। सभी रिड्यूसर धाराएँ संयुक्त हैं mergeऔर फिर scanराज्य को आउटपुट करती हैं। डिफ़ॉल्ट मान के startWithठीक पहले सेट किया गया है scan। मैं publishReplay(1)राज्यों के लिए इस्तेमाल करता था , लेकिन बाद में इसे हटा सकता था।

प्रतिक्रिया शुद्ध रेंडर फ़ंक्शन केवल उस स्थान पर होगा जहां आप सभी उत्पादकों / विषयों में भेजकर इवेंट डेटा का उत्पादन करेंगे।

यदि आपके पास बाल घटक हैं, तो आपको यह वर्णन करने की आवश्यकता है कि उन राज्यों को आपके साथ कैसे जोड़ा जाता है। combineLatestउस के लिए एक अच्छा प्रारंभिक बिंदु हो सकता है।

कार्यान्वयन में उल्लेखनीय अंतर:

  • कोई मिडलवेयर नहीं, बस आरएक्सजे ऑपरेटर। मुझे लगता है कि यह सबसे बड़ी शक्ति और कमजोरी है। आप अभी भी अवधारणाओं को उधार ले सकते हैं, लेकिन मुझे Redux और cycle.js जैसे बहन समुदायों की मदद लेना मुश्किल है क्योंकि यह अभी तक एक और कस्टम समाधान है। इसलिए मुझे इस पाठ में "हम" के बजाय "मैं" लिखना होगा।

  • कार्रवाई प्रकारों के लिए कोई स्विच / केस या तार नहीं। आपके पास क्रियाओं को अलग करने का एक अधिक गतिशील तरीका है।

  • rxjs को एक उपकरण के रूप में कहीं और इस्तेमाल किया जा सकता है, और यह राज्य प्रबंधन के लिए निहित नहीं है।

  • कार्रवाई प्रकार (?) की तुलना में उत्पादकों की कम संख्या। मुझे इस बारे में निश्चित नहीं है, लेकिन आपके पास माता-पिता के घटकों में कई प्रतिक्रियाएं हो सकती हैं जो बाल घटकों को सुनती हैं। इसका मतलब है कि कम जरूरी कोड, और कम जटिलता।

  • आप समाधान के मालिक हैं। किसी ढांचे की जरूरत नहीं। अच्छा और बुरा। आप किसी भी तरह से अपनी खुद की रूपरेखा लिखना समाप्त कर देंगे।

  • यह बहुत अधिक भग्न है, और आप आसानी से उप-ट्री, या ऐप स्टेट ट्री के कई हिस्सों से परिवर्तन की सदस्यता ले सकते हैं।

    • लगता है कि रेडिक्स-ऑब्जर्वर के रूप में महाकाव्यों को करना कितना आसान है? वास्तव में आसान।

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

मैं भी प्रतिक्रिया लंघन के बारे में सोचता हूं और जब तक प्रतिक्रिया प्रतिक्रियाशील राज्यों को बेहतर ढंग से संभालती है, तब तक स्नैबडोम या कुछ और के साथ जाएं। हम अपने राज्य को ऊपर की ओर क्यों बनाएं ताकि इसे फिर से सहारा के माध्यम से विभाजित किया जा सके? इसलिए मैं Snabbdom के साथ इस पैटर्न का एक संस्करण 2 बनाने की कोशिश करूंगा।

यहाँ एक और अधिक उन्नत लेकिन छोटा स्निपेट है जहाँ स्टेट स्ट्रीम फ़ाइल स्टेट स्ट्रीम बनाता है। यह अजाक्स-प्रपत्र घटक की स्थिति है जिसे सत्यापन नियमों और सीएसएस शैलियों के साथ फ़ील्ड्स (इनपुट्स) का एक ऑब्जेक्ट मिलता है। इस फाइल में हम सभी बच्चों के राज्यों को फॉर्म स्टेट में मिलाने के लिए सिर्फ फील्ड नेम (ऑब्जेक्ट की) का उपयोग करते हैं।

export default function create({
  Observable,
  ajaxInputs
}) {
  const fieldStreams = Object.keys(ajaxInputs)
  .map(function onMap(fieldName) {
    return ajaxInputs[fieldName].state.stream
    .map(function onMap(stateData) {
      return {stateData, fieldName}
    })
  })

  const stateStream = Observable.combineLatest(...fieldStreams)
  .map(function onMap(fieldStreamDataArray) {
    return fieldStreamDataArray.reduce(function onReduce(acc, fieldStreamData) {
    acc[fieldStreamData.fieldName] = fieldStreamData.stateData
    return acc
  }, {})
  })

  return {
    stream: stateStream
  }
}

हालांकि कोड अलगाव में बहुत कुछ नहीं कह सकता है, यह दर्शाता है कि आप राज्य को ऊपर की ओर कैसे बना सकते हैं, और आप आसानी से गतिशील घटनाओं का उत्पादन कैसे कर सकते हैं। भुगतान करने की कीमत यह है कि आपको कोड की एक अलग शैली को समझने की आवश्यकता है। और मुझे वह कीमत चुकानी पड़ी।


यह एक साल बाद है, मैंने अभी आपका उत्तर पाया है और लगता है कि यह अभी भी मान्य है! मैंने भी कुछ ऐसा ही किया और आपकी सभी बातों से सहमत हूं। लेकिन किसी भी तरह एक सवाल: क्या आप आज भी वही सोचते हैं, या आप कब से आगे बढ़ रहे हैं?
Xceno

1
मुझे Redux में स्विच / केस और एक्शन टाइप पर क्रिटिक को संशोधित करने की आवश्यकता है। मैं अभी भी उसी तरह से कोड करता हूं, लेकिन यह काम करने की कोशिश कर रहा है कि यह कैसे काम कर रहा है सर्वर-साइड। जब यह रिएक्ट कोड की बात आती है, तो मैं एक छोटा सा उपयोग करने में कामयाब रहा हूं जो रीड्यूसर / अपडेटैटर्स बनाने में मदद करता है। तो मैं अब भी वही काम कर रहा हूं, लेकिन थोड़ा और पॉलिश। सबसे बड़ा परिवर्तन यह है कि मैंने प्रत्येक पत्ती नोड को घटक पर स्ट्रीम करने की अनुमति दे दी हैमुद्रित करें और घटक पर सदस्यता समाप्त करें। मैं एक प्रतिक्रियाशील सेवा परत भी प्राप्त करना चाहता हूं जो कि फ्रंटएंड और बैकएंड पर काम करती है। वहां प्रगति कर रहा है।
मार्कस रैडेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.