वर्चुअल डोम की रिएक्ट की अवधारणा को गंदे मॉडल की जाँच की तुलना में अधिक प्रदर्शनकारी क्यों कहा गया है?


372

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

मुझे वास्तव में वर्चुअल डोम (विशेष रूप से सर्वर-साइड रेंडरिंग) की संभावित शक्ति पसंद है, लेकिन मैं सभी पेशेवरों और विपक्षों को जानना चाहूंगा।


मुझे लगता है कि आप इस बात का भी उल्लेख कर सकते हैं youtube.com/watch?v=-DX3vJiqxm4 जहां वह विशेष रूप से बेंचमार्क के बारे में बात करता है।
इनाफाल्को

जवाबों:


493

मैं एक वर्चुअल-डोम मॉड्यूल का प्राथमिक लेखक हूं, इसलिए मैं आपके सवालों का जवाब देने में सक्षम हो सकता हूं। वास्तव में 2 समस्याएं हैं जिन्हें यहां हल करने की आवश्यकता है

  1. मैं पुन: रेंडर कब करूं? उत्तर: जब मैं देखता हूं कि डेटा गंदा है।
  2. मैं कुशलता से फिर से कैसे प्रस्तुत करूं? उत्तर: वास्तविक DOM पैच उत्पन्न करने के लिए वर्चुअल DOM का उपयोग करना

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

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

हम केवल आभासी पेड़ को फिर से प्रस्तुत करने का लक्ष्य रखते हैं जब राज्य बदलता है। इसलिए यह देखने के लिए कि राज्य बदल गया है या नहीं, पुन: रेंडरर्स को रोकने के लिए एक कारगर तरीका है, जिसके कारण बहुत सारे अनावश्यक पेड़ अलग हो जाते हैं। अगर कुछ नहीं बदला है, तो हम कुछ नहीं करते हैं।

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


1
क्या रिएक्ट कंपोनेंट प्रॉप्स पर गंदी जाँच करता है? मैं पूछता हूं क्योंकि कोई सेटप्रॉप्स () फ़ंक्शन नहीं है।
बेन्लिच

2
एक सेटप्रॉप्स है: facebook.github.io/react/docs/component-api.html#setprops
Marius

1
इसका उदाहरण क्या होगा unnecessary re-renders?
vsync

9
जब आप कहते हैं "तो जबकि आभासी डोम भिन्न / पैच एल्गोरिदम शायद इष्टतम समाधान नहीं है", क्या आपके पास सैद्धांतिक रूप से अधिक इष्टतम समाधान है?
CMCDragonkai

3
यह सवाल का जवाब देने के लिए काफी नहीं है। प्रतिक्रिया की आवश्यकता है कि आप सेटस्टैट का उपयोग करके संकेत दें कि राज्य बदल गया है। यदि आप ऐसा करने में सक्षम थे, this.state.cats = 99तब भी आपको मॉडल परिवर्तन की जांच करने के लिए गंदे चेकिंग की आवश्यकता होगी, जैसे कि एंगुलर गंदा $ स्कोप ट्री की जाँच करता है। यह दो तकनीकों की गति की तुलना नहीं है, यह केवल एक बयान है कि रिएक्ट गंदा जाँच नहीं करता है क्योंकि इसमें एक बैकबोन शैली सेटर है।
१४:५४ पर सुपरलुमिनी

133

मैंने हाल ही में रिएक्ट के अलग एल्गोरिथ्म के बारे में एक विस्तृत लेख यहाँ पढ़ा: http://calendar.perfplanet.com/2013/diff/ । मैं जो समझता हूं, उससे जो तेजी से प्रतिक्रिया होती है वह है:

  • बैच डोम पढ़ने / लिखने के संचालन।
  • केवल उप-वृक्ष का कुशल अद्यतन।

गंदे-जांच की तुलना में, IMO के मुख्य अंतर हैं:

  1. मॉडल गंदा-जाँच : प्रतिक्रिया घटक को स्पष्ट रूप से गंदा setStateकहा जाता है जब भी कहा जाता है, इसलिए यहाँ कोई तुलना (डेटा) की आवश्यकता नहीं है। गंदी-जाँच के लिए, तुलना (मॉडलों का) हमेशा प्रत्येक डाइजेस्ट लूप में होती है।

  2. DOM अपडेट : DOM ऑपरेशंस बहुत महंगे होते हैं क्योंकि DOM को मॉडिफाई करना CSS स्टाइल, लेआउट को भी लागू करेगा और कैलकुलेट करेगा। अनावश्यक DOM मॉडिफिकेशन से बचाया गया समय वर्चुअल DOM को अलग करने में लगने वाले समय से अधिक हो सकता है।

गैर-तुच्छ मॉडल के लिए दूसरा बिंदु और भी महत्वपूर्ण है जैसे कि बड़ी मात्रा में फ़ील्ड या बड़ी सूची। पूरे मॉडल / टेम्प्लेट के बजाय, उस फ़ील्ड को शामिल करने वाले DOM तत्वों के लिए आवश्यक संचालन के परिणामस्वरूप जटिल मॉडल का एक फ़ील्ड परिवर्तन होगा।


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

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

1
एंगुलर की बात करें, क्योंकि दर्शक भी पचाते समय राज्य को उत्परिवर्तित कर सकते हैं, $scope.$digestप्रति चक्र कई बार पचाने वाले चक्र को निष्पादित किया जाता है, इसलिए यह पूर्ण डेटा तुलना के कई बार होता है बनाम आंशिक वर्चुअल DOM ट्री तुलना का एकल समय।
तुंगड

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

@vsync DOM को स्क्रीन पर सामान प्रदर्शित करने की आवश्यकता है। एक आभासी डोम नहीं है। यहां तक ​​कि कुछ आदर्श प्रदर्शन वाले डोम के साथ, वर्चुअल डोम बनाने से भी तेज होगा।
जेहान

75

मुझे वास्तव में वर्चुअल डोम (विशेष रूप से सर्वर-साइड रेंडरिंग) की संभावित शक्ति पसंद है, लेकिन मैं सभी पेशेवरों और विपक्षों को जानना चाहूंगा।

- ओ.पी.

प्रतिक्रिया केवल DOM हेरफेर लाइब्रेरी नहीं है। मैं आपको इस लेख को Auth0 से इस लेख को पढ़कर समझने के लिए प्रोत्साहित करता हूं जिसमें विस्तृत विवरण और बेंचमार्क शामिल हैं। जैसा कि आपने पूछा, मैं उनके पेशेवरों और विपक्षों पर प्रकाश डालूंगा:

React.js का वर्चुअल डोम

यहां छवि विवरण दर्ज करें

पेशेवरों

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

कान्स

  • DOM की पूर्ण-मेमोरी कॉपी (उच्च मेमोरी उपयोग)
  • स्थिर और गतिशील तत्वों के बीच कोई अंतर नहीं है

Ember.js की झलक

यहां छवि विवरण दर्ज करें

पेशेवरों

  • तेज और कुशल अलग एल्गोरिथ्म
  • स्थिर और गतिशील तत्वों के बीच अंतर
  • एम्बर एपीआई के साथ 100% संगत (आप अपने मौजूदा कोड को प्रमुख अपडेट के बिना लाभ प्राप्त करते हैं)
  • DOM का लाइटवेट इन-मेमोरी प्रतिनिधित्व

कान्स

  • मतलब केवल एम्बर में इस्तेमाल किया जाएगा
  • केवल एक दृश्य उपलब्ध है

वृद्धिशील डोम

यहां छवि विवरण दर्ज करें

पेशेवरों

  • याददाश्त का कम होना
  • सरल एपीआई
  • आसानी से कई मोर्चे और चौखटे के साथ एकीकृत करता है (शुरुआत से एक टेम्पलेट इंजन बैकेंड के रूप में)

कान्स

  • अन्य पुस्तकालयों की तरह तेज़ नहीं (यह यकीनन है, नीचे दिए गए मानदंड देखें)
  • कम माइंडशेयर और सामुदायिक उपयोग

ReactJS के डोम हेरफेर का प्रतिनिधित्व मुझे बहुत कम लगता है। ReactJS का वर्चुअल DOM वह है जो पूरी तरह से बदलता है, न कि वास्तविक DOM - सही? मैं संदर्भित लेख के मूल लेख को देख रहा हूं और यहां वही है जो मैं देख रहा हूं - teropa.info/images/onchange_vdom_change.svgteropa.info/blog/2015/03/02/…
smile.al.d.way

35

यहाँ रिएक्ट टीम के सदस्य सेबेस्टियन मार्कबैज की एक टिप्पणी है जो कुछ प्रकाश डालती है:

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

कोणीय मॉडल संदर्भात्मक पारदर्शिता को संरक्षित नहीं करता है और इसलिए स्वाभाविक रूप से परिवर्तनशील है। आप परिवर्तनों को ट्रैक करने के लिए मौजूदा मॉडल को म्यूट करते हैं। क्या होगा यदि आपका डेटा स्रोत हर बार अपरिवर्तनीय डेटा या एक नई डेटा संरचना है (जैसे कि JSON प्रतिक्रिया)?

डर्टी चेकिंग और Object.observe क्लोजर स्कोप स्टेट्स पर काम नहीं करता है।

ये दो चीजें स्पष्ट रूप से कार्यात्मक पैटर्न तक सीमित हैं।

इसके अतिरिक्त, जब आपका मॉडल जटिलता बढ़ता है, तो गंदे ट्रैकिंग करना बहुत महंगा हो जाता है। हालाँकि, यदि आप केवल रिएक्ट की तरह दृश्य पेड़ पर अलग-अलग करते हैं, तो यह उतना नहीं बढ़ता है जितना कि आप किसी भी बिंदु पर स्क्रीन पर दिखाए जाने वाले डेटा की मात्रा UI द्वारा सीमित है। ऊपर पीट का लिंक संपूर्ण लाभ के अधिक कवर करता है।

https://news.ycombinator.com/item?id=6937668


2
वास्तव में अंतिम पैराग्राफ के बारे में: यह गलत होना चाहिए: मॉडल वर्चुअल डोम से बड़ा है क्योंकि प्रत्येक मॉडल मूल्य के लिए (ज्यादातर मामलों में) कम से कम एक वर्चुअल डोम तत्व है (और आमतौर पर एक से अधिक)। मुझे ऐसा मॉडल क्यों चाहिए जो दिखाया नहीं गया है?
डेनियल

2
पेजिंग कैश्ड संग्रह।
21

-2

वर्चुअल डोम का आविष्कार प्रतिक्रिया से नहीं हुआ है। यह HTML डोम का हिस्सा है। यह ब्राउज़र-विशिष्ट कार्यान्वयन विवरण से हल्का और अलग है।

हम HTML DOM को React की स्थानीय और HTML DOM की सरलीकृत प्रतिलिपि के रूप में सोच सकते हैं। यह प्रतिक्रिया को इस अमूर्त दुनिया के भीतर अपनी गणना करने और "वास्तविक" डोम संचालन को छोड़ने की अनुमति देता है, अक्सर धीमा और ब्राउज़र-विशिष्ट। दरअसल DOM और VIRTUAL DOM के बीच कोई बड़ा अंतर नहीं है।

नीचे कुछ बिंदु दिए गए हैं कि वर्चुअल डोम का उपयोग क्यों किया जाता है ( ReactJS में वर्चुअल डोम ):

जब तुम करोगे:

document.getElementById('elementId').innerHTML = "New Value" Following thing happens:
  1. ब्राउज़र को HTML को पार्स करने की आवश्यकता है
  2. यह तत्व तत्व के बच्चे के तत्व को निकालता है
  3. नए मूल्य के साथ DOM मान को अपडेट करता है
  4. माता-पिता और बच्चे के लिए सीएसएस की फिर से गणना करें
  5. लेआउट को अपडेट करें यानी प्रत्येक तत्व स्क्रीन पर सटीक समन्वय करता है
  6. रेंडर ट्री को ट्रैप करें और ब्राउज़र डिस्प्ले पर पेंट करें

CSS और बदले हुए लेआउट को रिकॉल करना जटिल एल्गोरिथ्म का उपयोग करता है और वे प्रदर्शन को प्रभावित करते हैं।

साथ ही DOM प्रॉपर्टीज को अपडेट कर रहा है। मान। यह एक एल्गोरिथ्म का अनुसरण करता है।

अब, मान लें कि यदि आप DOM 10 बार सीधे अपडेट करते हैं, तो उपरोक्त सभी चरण एक-एक करके चलेंगे और DOM एल्गोरिदम को अपडेट करने में DOM वैल्यू को अपडेट करने में समय लगेगा।

यह, यही कारण है कि रियल डोम आभासी डोम की तुलना में धीमा है।


3
उदाहरण के बारे में, यदि आप डोम को सीधे या वर्चुअल डोम के माध्यम से संशोधित कर रहे हैं, तो अंत में दोनों मामलों के लिए आप डोम को बदल रहे हैं।
मैगलैन्स

हाँ दोनों ही मामलों में हम डोम को अपडेट कर रहे हैं लेकिन वर्चुअल डोम के मामले में यह विशेष रूप से अपडेट करता है कि कुंजी (विशिष्ट रूप से प्रतिक्रिया से अलग एल्गोरिथ्म द्वारा परिभाषित) फ़ील्ड या एलिमेंट टैग। जबकि डोम अपडेट को अपडेट करने या पूरे डोम को पूरी तरह से रिफ्रेश कर देता है।
हेमंत नागरकोटी

11
मैंने यह लेख hackernoon.com/virtual-dom-in-reactjs-43a3fdb1.1130 से देखा है । शायद स्रोत को इंगित करना बेहतर है यदि आप लेखक नहीं हैं।
जिंगगंग

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