आधुनिक वेब एप्लिकेशन बनाते समय, ऐप्स को तेज़ और प्रतिक्रियाशील बनाए रखने के लिए यूआई (यूजर इंटरफ़ेस) को कुशलतापूर्वक अपडेट करना आवश्यक है। कई फ़्रेमवर्क (जैसे रिएक्ट) में उपयोग की जाने वाली एक सामान्य रणनीति वर्चुअल DOM और घटकों का उपयोग करना है। यह आलेख समझाएगा कि वर्चुअल DOM का उपयोग करके घटकों को कैसे प्रस्तुत किया जाता है और हम कैसे री-रेंडरिंग को अनुकूलित कर सकते हैं ताकि वेब ऐप धीमा न हो।
DOM (डॉक्यूमेंट ऑब्जेक्ट मॉडल) एक पेड़ जैसी संरचना है जो एक वेबपेज पर सभी तत्वों का प्रतिनिधित्व करती है। हर बार जब आप किसी वेबपेज के साथ इंटरैक्ट करते हैं—बटन क्लिक करते हैं, टेक्स्ट टाइप करते हैं—ब्राउज़र को DOM को अपडेट करना पड़ता है, जो धीमा हो सकता है।
ए वर्चुअल डोम वास्तविक डोम की एक प्रति की तरह है लेकिन केवल मेमोरी में रहता है। हर बार कुछ बदलाव होने पर वास्तविक DOM को सीधे अपडेट करने के बजाय, हम पहले वर्चुअल DOM को अपडेट करते हैं। एक बार परिवर्तन किए जाने के बाद, वर्चुअल DOM खुद की तुलना पुराने संस्करण से करता है, अंतर पाता है (इसे diffing कहा जाता है), और वास्तविक DOM के केवल उन हिस्सों को अपडेट करता है जिन्हें बदलने की आवश्यकता होती है।
एक आधुनिक वेब ऐप में, घटक यूआई के निर्माण खंड हैं। इन्हें किसी वेबपेज के छोटे, पुन: प्रयोज्य भागों के रूप में सोचें। उदाहरण के लिए:
प्रत्येक घटक बताता है कि यूआई का कौन सा भाग कैसा दिखना चाहिए। एक घटक फ़ंक्शन एक वर्चुअल DOM पेड़ लौटाता है जो उस यूआई का प्रतिनिधित्व करता है।
आइए स्यूडोकोड का उपयोग करके एक सरल बटन घटक बनाएं। यह घटक टेक्स्ट वाला एक बटन और एक फ़ंक्शन लौटाएगा जो बटन क्लिक करने पर चलता है।
// Component to display a button function Button(props) { // The Button component returns a Virtual DOM node for a
इस उदाहरण में:
मान लें कि हम एक ऐप बनाना चाहते हैं जिसमें एक हेडर और एक बटन हो। इनमें से प्रत्येक भाग को घटकों के रूप में दर्शाया जा सकता है। ऐप की संरचना इस तरह दिख सकती है:
// App component with a header and button function App() { return new VirtualNode("div", {}, [ new Header(), // The Header component new Button({ text: "Click Me", onClick: handleClick }) // The Button component ]) } // Header component function Header() { return new VirtualNode("h1", {}, ["Welcome to the App!"]) } // Function to handle button clicks function handleClick() { console.log("Button clicked!") }
जब ऐप पहली बार चलता है, तो यह:
// Initial render of the app function renderApp() { let virtualDOM = App() // Render the app's Virtual DOM let realDOM = createRealDOM(virtualDOM) // Convert the Virtual DOM into real DOM elements attachToPage(realDOM) // Attach the real DOM elements to the webpage }
मान लीजिए कि ऐप में कुछ बदलता है, जैसे बटन टेक्स्ट। आम तौर पर, पूरे ऐप को दोबारा प्रस्तुत किया जाएगा, लेकिन अगर ऐप बड़ा है तो यह धीमा हो सकता है। इसके बजाय, हम केवल बदले हुए हिस्सों को अपडेट करके री-रेंडरिंग को अनुकूलित कर सकते हैं।
यहां बताया गया है कि जब पुनः प्रतिपादन होता है तो क्या होता है:
मान लें कि बटन टेक्स्ट "मुझे क्लिक करें" से "क्लिक किया गया!" में बदल जाता है। यहां बताया गया है कि हम बटन को फिर से कैसे प्रस्तुत करेंगे:
// New Button component with updated text function Button(props) { return new VirtualNode("button", { onClick: props.onClick }, [props.text]) } // Re-rendering with the new text let oldButton = Button({ text: "Click Me", onClick: handleClick }) let newButton = Button({ text: "Clicked!", onClick: handleClick }) // Diff the old and new Button let diffResult = diff(oldButton, newButton) // Patch the real DOM with the changes patch(realButtonDOM, diffResult)
री-रेंडरिंग को अनुकूलित करने का एक प्रमुख तरीका यह जांचना है कि किसी घटक को वास्तव में अपडेट करने की आवश्यकता है या नहीं। यदि घटक के props या state में कुछ भी नहीं बदला है, तो हम उस घटक को पुन: प्रस्तुत करना छोड़ सकते हैं। यहीं पर shouldComponentUpdate तर्क आता है।
// Function to check if a component should update function shouldComponentUpdate(oldProps, newProps) { return oldProps !== newProps // Only update if the props have changed }
अब, पुन: प्रस्तुत करने से पहले, हम जांचते हैं कि क्या घटक को अद्यतन करना चाहिए:
// Example: Optimized re-rendering of Button component function renderButtonIfNeeded(oldButton, newButton) { if (shouldComponentUpdate(oldButton.props, newButton.props)) { let realButton = createRealDOM(newButton) patch(realButton) } }
आइटमों की सूची प्रस्तुत करते समय (उदाहरण के लिए, बटनों की एक सूची), हम प्रत्येक आइटम को विशिष्ट रूप से पहचानने के लिए कुंजियों का उपयोग करके अनुकूलित कर सकते हैं। इससे अलग-अलग एल्गोरिदम को सूची में पुराने और नए आइटमों का मिलान करने और केवल आवश्यक परिवर्तन लागू करने में मदद मिलती है।
// List of buttons with unique keys function ButtonList(items) { return new VirtualNode("div", {}, items.map(item => new Button({ key: item.id, text: item.text, onClick: handleClick }) )) }
कुंजियों के साथ, यदि सूची में कोई आइटम बदलता है (जैसे बटन जोड़ना या हटाना), तो एल्गोरिदम तुरंत पहचान सकता है कि कौन सा बटन बदला है और केवल उसी को अपडेट कर सकता है।
घटकों का अपना राज्य भी हो सकता है। जब किसी घटक की स्थिति बदलती है, तो हम केवल उस विशिष्ट घटक को फिर से प्रस्तुत करना चाहते हैं, संपूर्ण ऐप को नहीं। यहां स्थिति वाले बटन का एक उदाहरण दिया गया है:
// Button component with state function ButtonWithState() { let [clicked, setClicked] = useState(false) // Create state for button function handleClick() { setClicked(true) // Update state when clicked } return new VirtualNode("button", { onClick: handleClick }, [clicked ? "Clicked!" : "Click Me"]) }
इस मामले में:
एक अन्य अनुकूलन केवल चाइल्ड घटक में परिवर्तन होने पर मूल घटकों को पुन: प्रस्तुत करने से बचना है। उदाहरण के लिए, यदि बटन बदलता है लेकिन हेडर वही रहता है, तो हम हेडर को दोबारा प्रस्तुत करना छोड़ सकते हैं।
// Optimized App component function App() { if (!shouldComponentUpdate(oldHeaderProps, newHeaderProps)) { return oldHeader // Reuse the old Header if it hasn't changed } return new VirtualNode("div", {}, [ new Header(), // Re-render the Header only if necessary new ButtonWithState() // Button re-renders based on state ]) }
संक्षेप में, हम वर्चुअल DOM का उपयोग करके घटकों को प्रस्तुत करने और अनुकूलित करने की प्रक्रिया को इन चरणों में विभाजित कर सकते हैं:
कब और क्या पुनः प्रस्तुत करना है, इस पर ध्यानपूर्वक विचार करके, हम यह सुनिश्चित कर सकते हैं कि जटिलता बढ़ने पर भी वेब एप्लिकेशन कुशल बने रहें। वर्चुअल डोम एक शक्तिशाली उपकरण है जो सरलता और प्रदर्शन के बीच संतुलन हासिल करने में मदद करता है!
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3