DĂ©duplication des Ressources avec React Suspense : PrĂ©venir les RequĂȘtes en Double | MLOG | MLOG

Maintenant, le UserResource vĂ©rifie si une ressource existe dĂ©jĂ  dans le cache. Si c'est le cas, la ressource mise en cache est retournĂ©e. Sinon, une nouvelle requĂȘte est initiĂ©e et la promesse rĂ©sultante est stockĂ©e dans le cache. Cela garantit qu'une seule requĂȘte est effectuĂ©e pour chaque userId unique.

2. Utiliser une BibliothÚque de Cache Dédiée (ex: `lru-cache`)

Pour des scĂ©narios de mise en cache plus complexes, envisagez d'utiliser une bibliothĂšque de cache dĂ©diĂ©e comme lru-cache ou similaire. Ces bibliothĂšques offrent des fonctionnalitĂ©s telles que l'Ă©viction du cache basĂ©e sur le principe du "Moins RĂ©cemment UtilisĂ©" (LRU) ou d'autres politiques, ce qui peut ĂȘtre crucial pour gĂ©rer l'utilisation de la mĂ©moire, en particulier lorsqu'on traite un grand nombre de ressources.

D'abord, installez la bibliothĂšque :

            
npm install lru-cache

            

Ensuite, intégrez-la dans votre UserResource :

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

const fetchUser = (userId) => {
  console.log(`Fetching user with ID: ${userId}`); // Simule une requĂȘte rĂ©seau
  return new Promise(resolve => {
    setTimeout(() => {
      resolve({ id: userId, name: `User ${userId}`, email: `user${userId}@example.com` });
    }, 1000); // Simule la latence du réseau
  });
};

const cache = new LRUCache({
  max: 100, // Nombre maximum d'éléments dans le cache
  ttl: 60000, // Durée de vie en millisecondes (1 minute)
});

const UserResource = (userId) => {
  if (!cache.has(userId)) {
    let promise = null;
    let status = 'pending'; // en attente, succĂšs, erreur
    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;

Cette approche offre un meilleur contrĂŽle sur la taille et la politique d'expiration du cache.

3. Regroupement de RequĂȘtes avec des BibliothĂšques comme `axios-extensions`

Des bibliothĂšques comme axios-extensions offrent des fonctionnalitĂ©s plus avancĂ©es telles que le regroupement de requĂȘtes (request coalescing). Le regroupement de requĂȘtes combine plusieurs requĂȘtes identiques en une seule, optimisant davantage l'utilisation du rĂ©seau. C'est particuliĂšrement utile dans les scĂ©narios oĂč les requĂȘtes sont initiĂ©es trĂšs prĂšs les unes des autres dans le temps.

D'abord, installez la bibliothĂšque :

            
npm install axios axios-extensions

            

Ensuite, configurez Axios avec l'adaptateur cache fourni par axios-extensions.

Exemple utilisant `axios-extensions` et créant une ressource :

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

const instance = axios.create({
  baseURL: 'https://api.example.com', // Remplacez par votre point de terminaison d'API
  adapter: cacheAdapterEnhancer(axios.defaults.adapter, { enabledByDefault: true }),
});

const fetchUser = async (userId) => {
  console.log(`Fetching user with ID: ${userId}`); // Simule une requĂȘte rĂ©seau
  const response = await instance.get(`/users/${userId}`);
  return response.data;
};


const UserResource = (userId) => {
    let promise = null;
    let status = 'pending'; // en attente, succĂšs, erreur
    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;

Cela configure Axios pour utiliser un adaptateur de cache, mettant automatiquement en cache les rĂ©ponses en fonction de la configuration de la requĂȘte. La fonction cacheAdapterEnhancer offre des options pour configurer le cache, comme dĂ©finir une taille maximale ou un temps d'expiration. throttleAdapterEnhancer peut Ă©galement ĂȘtre utilisĂ© pour limiter le nombre de requĂȘtes effectuĂ©es au serveur dans un certain laps de temps, optimisant davantage les performances.

Meilleures Pratiques pour la Déduplication des Ressources

Considérations Globales pour la Récupération et la Déduplication de Données

Lors de la conception de stratégies de récupération de données pour un public mondial, plusieurs facteurs entrent en jeu :

Par exemple, un site web de réservation de voyages ciblant un public mondial pourrait utiliser un CDN pour servir les données de disponibilité des vols et des hÎtels à partir de serveurs situés dans différentes régions. Le site web utiliserait également une API de conversion de devises pour afficher les prix dans la devise locale de l'utilisateur et offrirait des options pour filtrer les résultats de recherche en fonction des préférences linguistiques.

Conclusion

La dĂ©duplication des ressources est une technique d'optimisation essentielle pour les applications React utilisant Suspense. En empĂȘchant les requĂȘtes de rĂ©cupĂ©ration de donnĂ©es en double, vous pouvez amĂ©liorer considĂ©rablement les performances, rĂ©duire la charge du serveur et amĂ©liorer l'expĂ©rience utilisateur. Que vous choisissiez de mettre en Ɠuvre un simple cache de promesses ou de tirer parti de bibliothĂšques plus avancĂ©es comme lru-cache ou axios-extensions, la clĂ© est de comprendre les principes sous-jacents et de choisir la solution qui correspond le mieux Ă  vos besoins spĂ©cifiques. N'oubliez pas de prendre en compte les facteurs globaux tels que les CDN, la localisation et l'accessibilitĂ© lors de la conception de vos stratĂ©gies de rĂ©cupĂ©ration de donnĂ©es pour un public diversifiĂ©. En mettant en Ɠuvre ces meilleures pratiques, vous pouvez crĂ©er des applications React plus rapides, plus efficaces et plus conviviales.