Redux और एक स्टेट मशीन (जैसे xstate) के बीच वास्तविक अंतर क्या है?


85

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

हमने तय किया कि हमें आगे के रिफैक्टरिंग के दायरे में इस एप्लिकेशन के लिए कुछ प्रकार के स्टेट कंटेनर को लागू करने की आवश्यकता है। पहले मुझे Redux और ngrx स्टोर के साथ कुछ अनुभव था (जो वास्तव में समान सिद्धांतों का पालन करता है)।

Redux हमारे लिए एक विकल्प है, लेकिन डेवलपर्स में से एक ने राज्य-मशीन आधारित पुस्तकालय का उपयोग करने का प्रस्ताव दिया, विशेष रूप से xstate पुस्तकालय

मैंने कभी भी एक्सस्टेट के साथ काम नहीं किया है, इसलिए मैंने इसे दिलचस्प पाया और प्रलेखन पढ़ना और विभिन्न उदाहरणों को देखना शुरू कर दिया। होनहार और शक्तिशाली लग रहा था, लेकिन कुछ बिंदु पर मैं समझ गया कि मुझे इसके और redux के बीच कोई महत्वपूर्ण अंतर नहीं दिखता है।

मैंने घंटों का समय व्यतीत करने और एक्सटेट और रेडक्स की तुलना करने वाली किसी भी अन्य जानकारी को खोजने में लगा दिया। मुझे कोई स्पष्ट जानकारी नहीं मिली, जैसे कुछ लेखों को छोड़कर, जैसे "redux to a state machine" , या एक साथ पुस्तकालयों के लिंक redux और xstate का उपयोग करने पर ध्यान केंद्रित (काफी अजीब)।

यदि कोई व्यक्ति अंतर का वर्णन कर सकता है या मुझे बता सकता है कि डेवलपर्स को xstate कब चुनना चाहिए - आपका स्वागत है।


3
आधिकारिक डॉक्स वास्तव में कहते हैं कि आपको अपने redux reducers को एक राज्य मशीन redux.js.org/style-guide/… के
Yannic Hamann

मुझे लगता है कि आपके द्वारा उल्लेखित पुस्तकालय एक प्रभाव प्रबंधन प्रणाली के रूप में xstate का उपयोग करने के लिए हो सकता है (थंक, गाथा, महाकाव्य, आदि के लिए विकल्प)
अल्फ्रेड यंग

जवाबों:


188

मैंने XState का निर्माण किया, लेकिन मैं आपको यह नहीं बताने जा रहा हूं कि क्या एक दूसरे का उपयोग करना है; जो आपकी टीम पर निर्भर करता है। इसके बजाय, मैं कुछ प्रमुख अंतरों को उजागर करने का प्रयास करूँगा।

  • Redux अनिवार्य रूप से एक राज्य कंटेनर है जहां घटनाओं ( Redux में क्रियाएं ) को एक reducer को भेजा जाता है जो राज्य को अपडेट करता है।
  • XState एक राज्य कंटेनर भी है, लेकिन यह परिमित अवस्था (जैसे "loading", "success") को "अनंत अवस्था", या संदर्भ (जैसे, items: [...]) से अलग करता है।
  • Redux यह निर्धारित नहीं करता है कि आप अपने reducers को कैसे परिभाषित करते हैं। वे सादे कार्य हैं जो वर्तमान स्थिति और घटना (कार्रवाई) को देखते हुए अगले राज्य को वापस करते हैं।
  • XState एक "नियमों के साथ reducer" है - आप घटनाओं के कारण परिमित राज्यों के बीच कानूनी बदलाव को परिभाषित करते हैं, और यह भी कि कौन से कार्यों को एक संक्रमण में निष्पादित किया जाना चाहिए (या एक राज्य से प्रवेश / निकास पर)
  • Redux में साइड-इफेक्ट्स को संभालने का बिल्ट-इन तरीका नहीं है। कई समुदाय विकल्प हैं, जैसे कि रिडक्स-थंक, रेडक्स-सागा, आदि।
  • XState क्रियाओं (साइड-इफेक्ट्स) को घोषित और स्पष्ट बनाता है - वे उस Stateवस्तु का हिस्सा होते हैं जिसे प्रत्येक संक्रमण (वर्तमान स्थिति +) पर लौटाया जाता है।
  • Redux के पास वर्तमान में राज्यों के बीच बदलावों की कल्पना करने का कोई तरीका नहीं है, क्योंकि यह परिमित और अनंत स्थिति के बीच कोई अंतर नहीं करता है।
  • XState का एक विज़ुअलाइज़र है: https://statecharts.github.io/xstate-viz जो कि घोषणात्मक प्रकृति के कारण संभव है।
  • Redux reducers में प्रदर्शित निहित तर्क / व्यवहार को क्रमिक रूप से क्रमबद्ध नहीं किया जा सकता है (उदाहरण के लिए, JSON में)
  • XState की मशीन परिभाषाएँ, जो तर्क / व्यवहार का प्रतिनिधित्व करती हैं, को JSON में क्रमबद्ध किया जा सकता है, और JSON से पढ़ा जा सकता है। यह बाहरी उपकरणों द्वारा व्यवहार को बहुत पोर्टेबल और विन्यास योग्य बनाता है।
  • Redux सख्ती से एक राज्य मशीन नहीं है।
  • XState W3C SCXML विनिर्देश का सख्ती से पालन करता है: https://www.w3.org/TR/scxml/
  • Redux असंभव राज्यों को मैन्युअल रूप से रोकने के लिए डेवलपर पर निर्भर करता है।
  • XState स्वाभाविक रूप से घटनाओं को संभालने के लिए सीमाओं को परिभाषित करने के लिए राज्यचक्र का उपयोग करता है, जो असंभव राज्यों को रोकता है और इसका सांख्यिकीय विश्लेषण किया जा सकता है।
  • Redux एकल, "वैश्विक" परमाणु स्टोर के उपयोग को प्रोत्साहित करता है।
  • XState एक अभिनेता-मॉडल-जैसे दृष्टिकोण के उपयोग को प्रोत्साहित करता है, जहां कई पदानुक्रमित स्थिति / "सेवा" उदाहरण हो सकते हैं जो एक दूसरे के साथ संवाद करते हैं।

मैं इस सप्ताह डॉक्स में अधिक महत्वपूर्ण अंतर जोड़ूंगा।


5
अंत में सामने के विकास के लिए FSM और SCXML का उपयोग करने वाला कोई व्यक्ति ... जिस आदमी ने मेरी जान बचाई, मैं आपकी लाइब्रेरी का अध्ययन करने जा रहा हूं। मुझे कुछ कारणों से रिडक्स पसंद नहीं है (पहले यह घटना और कार्रवाई की शर्तों को भ्रमित करता है) और दूसरा इसे "मॉडल" जटिल राज्यों में मिलियन झंडे (क्रिया और गलत)।
कार्लोस

1
@ माइक76 XState Redux देव टूल के साथ एकीकृत करता है।
डेविड खुर्शीद

संकेत के लिए धन्यवाद, मैं उस पर गौर करूंगा।
15:76 बजे माइक76

1
मैंने अब XState + Redux DevTools आज़माया है। यह काफी अच्छी तरह से काम करता है, लेकिन कुछ फीचर्स गायब हैं। उदाहरण के लिए, XState + Redux DevTools "स्टेट रीप्ले" जैसी सुविधाओं का समर्थन नहीं करता है, जहां पिछले राज्यों का एक क्रम फिर से दोहराया जाता है। क्या यह कार्यान्वयन सीमाओं के कारण है?
माइक at६

20

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

राज्य मशीनों के साथ सावधान रहें, अगर किसी कारण से (बाहरी एपीआई निर्भरता आदि ...), तो संभावना है कि ऐप उस स्थिति में बंद हो सकता है जहां यह किसी अन्य राज्य में बाधाओं के कारण संक्रमण नहीं कर सकता है, आपको इसे हल करना होगा।

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


दूसरी ओर, Redux है यूनिडायरेक्शनल वास्तुकला रूपरेखा । यूनिडायरेक्शनल आर्किटेक्चर आपको डेटा प्रवाह की एकल दिशा के लिए लागू करता है। Redux में, इसके साथ शुरू होता है User->View->(Action)->Store->Reducer->(Middleware)->Store->(State)->View। स्टेट मशीन की तरह, आप Redux में मिडलवेर्स के साथ साइड इफेक्ट ट्रिगर कर सकते हैं। यदि आप चाहते हैं, तो आप राज्य परिवर्तनों को रोक सकते हैं / रोक सकते हैं। राज्य मशीन से अलग , Redux यूनिडायरेक्शनल डेटा प्रवाह को शुद्ध करता है ! रिड्यूसर फ़ंक्शंस, अपरिवर्तनीय स्टेट ऑब्जेक्ट्स, सिंगल ऑब्जर्वेबल ऐप स्टेट।

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