रिएक्ट सस्पेंस रिसोर्स डी डुप्लीकेशन: डुप्लीकेट रिक्वेस्ट को रोकना | MLOG | MLOG

अब, UserResource यह जांचता है कि क्या cache में कोई रिसोर्स पहले से मौजूद है। यदि ऐसा है, तो कैश्ड रिसोर्स लौटा दिया जाता है। अन्यथा, एक नया रिक्वेस्ट शुरू किया जाता है, और परिणामी प्रॉमिस को कैश में संग्रहीत किया जाता है। यह सुनिश्चित करता है कि प्रत्येक अद्वितीय userId के लिए केवल एक रिक्वेस्ट किया जाता है।

2. एक डेडिकेटेड कैशिंग लाइब्रेरी का उपयोग करना (जैसे, `lru-cache`)

अधिक जटिल कैशिंग परिदृश्यों के लिए, lru-cache या इसी तरह की एक डेडिकेटेड कैशिंग लाइब्रेरी का उपयोग करने पर विचार करें। ये लाइब्रेरीज़ लीस्ट रीसेंटली यूज़्ड (LRU) या अन्य नीतियों के आधार पर कैश इविक्शन जैसी सुविधाएँ प्रदान करती हैं, जो मेमोरी उपयोग के प्रबंधन के लिए महत्वपूर्ण हो सकती हैं, खासकर जब बड़ी संख्या में रिसोर्सेस से निपटना हो।

सबसे पहले, लाइब्रेरी स्थापित करें:

            
npm install lru-cache

            

फिर, इसे अपने UserResource में एकीकृत करें:

            
import React, { Suspense } from 'react';
import LRUCache from 'lru-cache';

const fetchUser = (userId) => {
  console.log(`Fetching user with ID: ${userId}`); // Simulate network request
  return new Promise(resolve => {
    setTimeout(() => {
      resolve({ id: userId, name: `User ${userId}`, email: `user${userId}@example.com` });
    }, 1000); // Simulate network latency
  });
};

const cache = new LRUCache({
  max: 100, // Maximum number of items in the cache
  ttl: 60000, // Time-to-live in milliseconds (1 minute)
});

const UserResource = (userId) => {
  if (!cache.has(userId)) {
    let promise = null;
    let status = 'pending'; // pending, success, error
    let result;

    const suspender = fetchUser(userId).then(
      (r) => {
        status = 'success';
        result = r;
        cache.set(userId, {
          read() {
            return result;
          },
        });
      },
      (e) => {
        status = 'error';
        result = e;
        cache.set(userId, {
          read() {
            throw result;
          },
        });
      }
    );

    cache.set(userId, {
        read() {
            if (status === 'pending') {
                throw suspender;
            } else if (status === 'error') {
                throw result;
            }
            return result;
        }
    });
  }

  return cache.get(userId);
};


const UserProfile = ({ userId }) => {
  const user = UserResource(userId).read();
  return (
    

User Profile

ID: {user.id}

Name: {user.name}

Email: {user.email}

); }; const UserDetails = ({ userId }) => { const user = UserResource(userId).read(); return (

User Details

ID: {user.id}

Name: {user.name}

); }; const App = () => { return ( Loading...
}> ); }; export default App;

यह दृष्टिकोण कैश के आकार और समाप्ति नीति पर अधिक नियंत्रण प्रदान करता है।

3. `axios-extensions` जैसी लाइब्रेरीज़ के साथ रिक्वेस्ट कोलेसिंग

axios-extensions जैसी लाइब्रेरीज़ रिक्वेस्ट कोलेसिंग जैसी अधिक उन्नत सुविधाएँ प्रदान करती हैं। रिक्वेस्ट कोलेसिंग कई समान रिक्वेस्ट को एक ही रिक्वेस्ट में जोड़ता है, जिससे नेटवर्क उपयोग को और अधिक अनुकूलित किया जाता है। यह उन परिदृश्यों में विशेष रूप से उपयोगी है जहां रिक्वेस्ट एक-दूसरे के बहुत करीब समय में शुरू किए जाते हैं।

सबसे पहले, लाइब्रेरी स्थापित करें:

            
npm install axios axios-extensions

            

फिर, axios-extensions द्वारा प्रदान किए गए cache एडॉप्टर के साथ Axios को कॉन्फ़िगर करें।

`axios-extensions` का उपयोग करके और एक रिसोर्स बनाने का उदाहरण:

            
import React, { Suspense } from 'react';
import axios from 'axios';
import { cacheAdapterEnhancer, throttleAdapterEnhancer } from 'axios-extensions';

const instance = axios.create({
  baseURL: 'https://api.example.com', // Replace with your API endpoint
  adapter: cacheAdapterEnhancer(axios.defaults.adapter, { enabledByDefault: true }),
});

const fetchUser = async (userId) => {
  console.log(`Fetching user with ID: ${userId}`); // Simulate network request
  const response = await instance.get(`/users/${userId}`);
  return response.data;
};


const UserResource = (userId) => {
    let promise = null;
    let status = 'pending'; // pending, success, error
    let result;

    const suspender = fetchUser(userId).then(
        (r) => {
            status = 'success';
            result = r;
        },
        (e) => {
            status = 'error';
            result = e;
        }
    );

    return {
        read() {
            if (status === 'pending') {
                throw suspender;
            } else if (status === 'error') {
                throw result;
            }
            return result;
        },
    };
};


const UserProfile = ({ userId }) => {
  const user = UserResource(userId).read();
  return (
    

User Profile

ID: {user.id}

Name: {user.name}

Email: {user.email}

); }; const UserDetails = ({ userId }) => { const user = UserResource(userId).read(); return (

User Details

ID: {user.id}

Name: {user.name}

); }; const App = () => { return ( Loading...
}> ); }; export default App;

यह Axios को कैश एडॉप्टर का उपयोग करने के लिए कॉन्फ़िगर करता है, जो रिक्वेस्ट कॉन्फ़िगरेशन के आधार पर स्वचालित रूप से रिस्पांस को कैश करता है। cacheAdapterEnhancer फ़ंक्शन कैश को कॉन्फ़िगर करने के लिए विकल्प प्रदान करता है, जैसे कि अधिकतम कैश आकार या समाप्ति समय निर्धारित करना। throttleAdapterEnhancer का उपयोग एक निश्चित समय अवधि के भीतर सर्वर पर किए गए रिक्वेस्ट की संख्या को सीमित करने के लिए भी किया जा सकता है, जिससे प्रदर्शन को और अधिक अनुकूलित किया जा सकता है।

रिसोर्स डी डुप्लीकेशन के लिए सर्वोत्तम अभ्यास

डेटा फ़ेचिंग और डी डुप्लीकेशन के लिए वैश्विक विचार

जब एक वैश्विक दर्शक के लिए डेटा फ़ेचिंग रणनीतियाँ डिज़ाइन की जाती हैं, तो कई कारक सामने आते हैं:

उदाहरण के लिए, एक वैश्विक दर्शकों को लक्षित करने वाली एक यात्रा बुकिंग वेबसाइट विभिन्न क्षेत्रों में स्थित सर्वरों से उड़ान और होटल उपलब्धता डेटा प्रदान करने के लिए एक CDN का उपयोग कर सकती है। वेबसाइट उपयोगकर्ता की स्थानीय मुद्रा में कीमतें प्रदर्शित करने के लिए एक मुद्रा रूपांतरण API का भी उपयोग करेगी और भाषा वरीयताओं के आधार पर खोज परिणामों को फ़िल्टर करने के लिए विकल्प प्रदान करेगी।

निष्कर्ष

रिएक्ट सस्पेंस का उपयोग करने वाले रिएक्ट एप्लिकेशन के लिए रिसोर्स डी डुप्लीकेशन एक आवश्यक ऑप्टिमाइज़ेशन तकनीक है। डुप्लीकेट डेटा फ़ेचिंग रिक्वेस्ट को रोककर, आप प्रदर्शन में उल्लेखनीय सुधार कर सकते हैं, सर्वर लोड को कम कर सकते हैं, और उपयोगकर्ता अनुभव को बढ़ा सकते हैं। चाहे आप एक साधारण प्रॉमिस कैश लागू करना चुनें या lru-cache या axios-extensions जैसी अधिक उन्नत लाइब्रेरी का लाभ उठाएं, कुंजी अंतर्निहित सिद्धांतों को समझना और उस समाधान को चुनना है जो आपकी विशिष्ट आवश्यकताओं के लिए सबसे उपयुक्त है। एक विविध दर्शक वर्ग के लिए अपनी डेटा फ़ेचिंग रणनीतियों को डिजाइन करते समय CDNs, स्थानीयकरण और पहुंच जैसे वैश्विक कारकों पर विचार करना याद रखें। इन सर्वोत्तम प्रथाओं को लागू करके, आप तेज, अधिक कुशल और अधिक उपयोगकर्ता-अनुकूल रिएक्ट एप्लिकेशन बना सकते हैं।