हिन्दी

useMemo, useCallback, और React.memo का उपयोग करके रिएक्ट एप्लिकेशन के प्रदर्शन को अनुकूलित करने के लिए एक व्यापक गाइड। अनावश्यक री-रेंडर को रोकना और उपयोगकर्ता अनुभव को बेहतर बनाना सीखें।

रिएक्ट परफॉरमेंस ऑप्टिमाइज़ेशन: useMemo, useCallback, और React.memo में महारत हासिल करना

रिएक्ट, यूजर इंटरफेस बनाने के लिए एक लोकप्रिय जावास्क्रिप्ट लाइब्रेरी है, जो अपने कंपोनेंट-आधारित आर्किटेक्चर और डिक्लेरेटिव स्टाइल के लिए जानी जाती है। हालाँकि, जैसे-जैसे एप्लिकेशन जटिल होते जाते हैं, प्रदर्शन एक चिंता का विषय बन सकता है। कंपोनेंट्स के अनावश्यक री-रेंडर धीमे प्रदर्शन और खराब उपयोगकर्ता अनुभव का कारण बन सकते हैं। सौभाग्य से, रिएक्ट प्रदर्शन को अनुकूलित करने के लिए कई उपकरण प्रदान करता है, जिनमें useMemo, useCallback, और React.memo शामिल हैं। यह गाइड इन तकनीकों में गहराई से उतरता है, जिससे आपको उच्च-प्रदर्शन वाले रिएक्ट एप्लिकेशन बनाने में मदद करने के लिए व्यावहारिक उदाहरण और कार्रवाई योग्य अंतर्दृष्टि मिलती है।

रिएक्ट री-रेंडर्स को समझना

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

कंपोनेंट्स क्यों री-रेंडर होते हैं

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

useMemo का परिचय: महंगी गणनाओं को मेमोइज़ करना

useMemo एक रिएक्ट हुक है जो किसी गणना के परिणाम को मेमोइज़ करता है। मेमोइज़ेशन एक ऑप्टिमाइज़ेशन तकनीक है जो महंगी फंक्शन कॉल्स के परिणामों को संग्रहीत करती है और जब वही इनपुट दोबारा आते हैं तो उन परिणामों का पुन: उपयोग करती है। यह अनावश्यक रूप से फंक्शन को फिर से चलाने की आवश्यकता को रोकता है।

useMemo का उपयोग कब करें

useMemo कैसे काम करता है

useMemo दो आर्ग्यूमेंट्स लेता है:

  1. एक फंक्शन जो गणना करता है।
  2. डिपेंडेंसीज़ की एक ऐरे।

फंक्शन केवल तभी निष्पादित होता है जब ऐरे में से कोई एक डिपेंडेंसी बदल जाती है। अन्यथा, useMemo पहले से मेमोइज़ किया गया मान लौटाता है।

उदाहरण: फाइबोनैचि अनुक्रम की गणना

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


import React, { useState, useMemo } from 'react';

function Fibonacci({ n }) {
  const fibonacciNumber = useMemo(() => {
    console.log('Calculating Fibonacci...'); // Demonstrates when the calculation runs
    function calculateFibonacci(num) {
      if (num <= 1) {
        return num;
      }
      return calculateFibonacci(num - 1) + calculateFibonacci(num - 2);
    }
    return calculateFibonacci(n);
  }, [n]);

  return 

Fibonacci({n}) = {fibonacciNumber}

; } function App() { const [number, setNumber] = useState(5); return (
setNumber(parseInt(e.target.value))} />
); } export default App;

इस उदाहरण में, calculateFibonacci फंक्शन केवल तभी निष्पादित होता है जब n प्रॉप बदलता है। useMemo के बिना, फंक्शन Fibonacci कंपोनेंट के हर री-रेंडर पर निष्पादित होगा, भले ही n वही रहे। कल्पना कीजिए कि यह गणना एक वैश्विक वित्तीय डैशबोर्ड पर हो रही है - बाजार की हर टिक एक पूर्ण पुनर्गणना का कारण बनती है, जिससे महत्वपूर्ण लैग होता है। useMemo इसे रोकता है।

useCallback का परिचय: फंक्शन्स को मेमोइज़ करना

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

useCallback का उपयोग कब करें

useCallback कैसे काम करता है

useCallback दो आर्ग्यूमेंट्स लेता है:

  1. मेमोइज़ किया जाने वाला फंक्शन।
  2. डिपेंडेंसीज़ की एक ऐरे।

फंक्शन केवल तभी फिर से बनाया जाता है जब ऐरे में से कोई एक डिपेंडेंसी बदल जाती है। अन्यथा, useCallback वही फंक्शन इंस्टेंस लौटाता है।

उदाहरण: एक बटन क्लिक को संभालना

आइए एक बटन के साथ एक कंपोनेंट बनाएं जो एक कॉलबैक फंक्शन को ट्रिगर करता है। हम कॉलबैक फंक्शन को मेमोइज़ करने के लिए useCallback का उपयोग करेंगे।


import React, { useState, useCallback } from 'react';

function Button({ onClick, children }) {
  console.log('Button re-rendered'); // Demonstrates when the Button re-renders
  return ;
}

const MemoizedButton = React.memo(Button);

function App() {
  const [count, setCount] = useState(0);

  const handleClick = useCallback(() => {
    console.log('Button clicked');
    setCount((prevCount) => prevCount + 1);
  }, []); // Empty dependency array means the function is only created once

  return (
    

Count: {count}

Increment
); } export default App;

इस उदाहरण में, handleClick फंक्शन केवल एक बार बनाया जाता है क्योंकि डिपेंडेंसी ऐरे खाली है। जब App कंपोनेंट count स्टेट में बदलाव के कारण री-रेंडर होता है, तो handleClick फंक्शन वही रहता है। MemoizedButton कंपोनेंट, जिसे React.memo के साथ लपेटा गया है, केवल तभी री-रेंडर होगा जब उसके प्रॉप्स बदलेंगे। क्योंकि onClick प्रॉप (handleClick) वही रहता है, Button कंपोनेंट अनावश्यक रूप से री-रेंडर नहीं होता है। एक इंटरैक्टिव मैप एप्लिकेशन की कल्पना करें। हर बार जब कोई उपयोगकर्ता इंटरैक्ट करता है, तो दर्जनों बटन कंपोनेंट्स प्रभावित हो सकते हैं। useCallback के बिना, ये बटन अनावश्यक रूप से री-रेंडर होंगे, जिससे एक लैगी अनुभव होगा। useCallback का उपयोग एक सहज इंटरैक्शन सुनिश्चित करता है।

React.memo का परिचय: कंपोनेंट्स को मेमोइज़ करना

React.memo एक हायर-ऑर्डर कंपोनेंट (HOC) है जो एक फंक्शनल कंपोनेंट को मेमोइज़ करता है। यह कंपोनेंट को री-रेंडर होने से रोकता है यदि उसके प्रॉप्स नहीं बदले हैं। यह क्लास कंपोनेंट्स के लिए PureComponent के समान है।

React.memo का उपयोग कब करें

React.memo कैसे काम करता है

React.memo एक फंक्शनल कंपोनेंट को लपेटता है और पिछले और अगले प्रॉप्स की सतही तुलना करता है। यदि प्रॉप्स समान हैं, तो कंपोनेंट री-रेंडर नहीं होगा।

उदाहरण: एक उपयोगकर्ता प्रोफ़ाइल प्रदर्शित करना

आइए एक कंपोनेंट बनाएं जो एक उपयोगकर्ता प्रोफ़ाइल प्रदर्शित करता है। हम अनावश्यक री-रेंडर को रोकने के लिए React.memo का उपयोग करेंगे यदि उपयोगकर्ता का डेटा नहीं बदला है।


import React from 'react';

function UserProfile({ user }) {
  console.log('UserProfile re-rendered'); // Demonstrates when the component re-renders
  return (
    

Name: {user.name}

Email: {user.email}

); } const MemoizedUserProfile = React.memo(UserProfile, (prevProps, nextProps) => { // Custom comparison function (optional) return prevProps.user.id === nextProps.user.id; // Only re-render if the user ID changes }); function App() { const [user, setUser] = React.useState({ id: 1, name: 'John Doe', email: 'john.doe@example.com', }); const updateUser = () => { setUser({ ...user, name: 'Jane Doe' }); // Changing the name }; return (
); } export default App;

इस उदाहरण में, MemoizedUserProfile कंपोनेंट केवल तभी री-रेंडर होगा जब user.id प्रॉप बदलता है। भले ही user ऑब्जेक्ट के अन्य गुण बदल जाएं (जैसे, नाम या ईमेल), कंपोनेंट तब तक री-रेंडर नहीं होगा जब तक कि आईडी अलग न हो। `React.memo` के भीतर यह कस्टम तुलना फंक्शन कंपोनेंट के री-रेंडर होने पर सटीक नियंत्रण की अनुमति देता है। लगातार अपडेट होने वाले उपयोगकर्ता प्रोफाइल वाले एक सोशल मीडिया प्लेटफॉर्म पर विचार करें। `React.memo` के बिना, उपयोगकर्ता की स्थिति या प्रोफ़ाइल चित्र बदलने से प्रोफ़ाइल कंपोनेंट का पूरा री-रेंडर हो जाएगा, भले ही मुख्य उपयोगकर्ता विवरण वही रहें। `React.memo` लक्षित अपडेट की अनुमति देता है और प्रदर्शन में काफी सुधार करता है।

useMemo, useCallback, और React.memo को मिलाना

ये तीनों तकनीकें तब सबसे प्रभावी होती हैं जब एक साथ उपयोग की जाती हैं। useMemo महंगी गणनाओं को मेमोइज़ करता है, useCallback फंक्शन्स को मेमोइज़ करता है, और React.memo कंपोनेंट्स को मेमोइज़ करता है। इन तकनीकों को मिलाकर, आप अपने रिएक्ट एप्लिकेशन में अनावश्यक री-रेंडर की संख्या को काफी कम कर सकते हैं।

उदाहरण: एक जटिल कंपोनेंट

आइए एक और जटिल कंपोनेंट बनाएं जो यह प्रदर्शित करता है कि इन तकनीकों को कैसे मिलाया जाए।


import React, { useState, useCallback, useMemo } from 'react';

function ListItem({ item, onUpdate, onDelete }) {
  console.log(`ListItem ${item.id} re-rendered`); // Demonstrates when the component re-renders
  return (
    
  • {item.text}
  • ); } const MemoizedListItem = React.memo(ListItem); function List({ items, onUpdate, onDelete }) { console.log('List re-rendered'); // Demonstrates when the component re-renders return (
      {items.map((item) => ( ))}
    ); } const MemoizedList = React.memo(List); function App() { const [items, setItems] = useState([ { id: 1, text: 'Item 1' }, { id: 2, text: 'Item 2' }, { id: 3, text: 'Item 3' }, ]); const handleUpdate = useCallback((id) => { setItems((prevItems) => prevItems.map((item) => item.id === id ? { ...item, text: `Updated ${item.text}` } : item ) ); }, []); const handleDelete = useCallback((id) => { setItems((prevItems) => prevItems.filter((item) => item.id !== id)); }, []); const memoizedItems = useMemo(() => items, [items]); return (
    ); } export default App;

    इस उदाहरण में:

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

    अतिरिक्त ऑप्टिमाइज़ेशन तकनीकें

    हालांकि useMemo, useCallback, और React.memo शक्तिशाली उपकरण हैं, वे रिएक्ट प्रदर्शन को अनुकूलित करने के लिए एकमात्र विकल्प नहीं हैं। यहां कुछ अतिरिक्त तकनीकें हैं जिन पर विचार किया जाना चाहिए:

    ऑप्टिमाइज़ेशन के लिए वैश्विक विचार

    वैश्विक दर्शकों के लिए रिएक्ट एप्लिकेशन को अनुकूलित करते समय, नेटवर्क लेटेंसी, डिवाइस क्षमताओं और स्थानीयकरण जैसे कारकों पर विचार करना महत्वपूर्ण है। यहां कुछ युक्तियां दी गई हैं:

    निष्कर्ष

    एक सहज और उत्तरदायी उपयोगकर्ता अनुभव प्रदान करने के लिए रिएक्ट एप्लिकेशन के प्रदर्शन को अनुकूलित करना महत्वपूर्ण है। useMemo, useCallback, और React.memo जैसी तकनीकों में महारत हासिल करके, और वैश्विक अनुकूलन रणनीतियों पर विचार करके, आप उच्च-प्रदर्शन वाले रिएक्ट एप्लिकेशन बना सकते हैं जो एक विविध उपयोगकर्ता आधार की जरूरतों को पूरा करने के लिए मापनीय हैं। प्रदर्शन की बाधाओं की पहचान करने और इन अनुकूलन तकनीकों को रणनीतिक रूप से लागू करने के लिए अपने एप्लिकेशन को प्रोफाइल करना याद रखें। समय से पहले अनुकूलन न करें - उन क्षेत्रों पर ध्यान केंद्रित करें जहां आप सबसे महत्वपूर्ण प्रभाव प्राप्त कर सकते हैं।

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