React Suspense Resource Deduplicatie: Dubbele Verzoeken Voorkomen | MLOG | MLOG

Nu controleert de UserResource of er al een resource in de cache bestaat. Als dat zo is, wordt de gecachte resource teruggegeven. Anders wordt een nieuw verzoek geïnitieerd en wordt de resulterende promise opgeslagen in de cache. Dit zorgt ervoor dat er slechts één verzoek wordt gedaan voor elke unieke userId.

2. Een Gespecialiseerde Caching-bibliotheek Gebruiken (bijv. `lru-cache`)

Voor complexere caching-scenario's kunt u overwegen een gespecialiseerde caching-bibliotheek zoals lru-cache of vergelijkbaar te gebruiken. Deze bibliotheken bieden functies zoals cache-evictie op basis van Least Recently Used (LRU) of andere beleidsregels, wat cruciaal kan zijn voor het beheren van geheugengebruik, vooral bij het omgaan met een groot aantal resources.

Installeer eerst de bibliotheek:

            
npm install lru-cache

            

Integreer het vervolgens in uw UserResource:

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

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

const cache = new LRUCache({
  max: 100, // Maximaal aantal items in de cache
  ttl: 60000, // Time-to-live in milliseconden (1 minuut)
});

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;

Deze aanpak biedt meer controle over de grootte en het verloopbeleid van de cache.

3. Request Coalescing met Bibliotheken zoals `axios-extensions`

Bibliotheken zoals axios-extensions bieden geavanceerdere functies zoals request coalescing. Request coalescing combineert meerdere identieke verzoeken in één enkel verzoek, waardoor het netwerkgebruik verder wordt geoptimaliseerd. Dit is met name handig in scenario's waar verzoeken zeer kort na elkaar worden geïnitieerd.

Installeer eerst de bibliotheek:

            
npm install axios axios-extensions

            

Configureer vervolgens Axios met de cache-adapter die wordt geleverd door axios-extensions.

Voorbeeld van het gebruik van `axios-extensions` en het creëren van een resource:

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

const instance = axios.create({
  baseURL: 'https://api.example.com', // Vervang door uw API-eindpunt
  adapter: cacheAdapterEnhancer(axios.defaults.adapter, { enabledByDefault: true }),
});

const fetchUser = async (userId) => {
  console.log(`Fetching user with ID: ${userId}`); // Simuleer netwerkverzoek
  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;

Dit configureert Axios om een cache-adapter te gebruiken, die automatisch antwoorden cachet op basis van de verzoekconfiguratie. De cacheAdapterEnhancer-functie biedt opties voor het configureren van de cache, zoals het instellen van een maximale cachegrootte of een verlooptijd. throttleAdapterEnhancer kan ook worden gebruikt om het aantal verzoeken naar de server binnen een bepaalde periode te beperken, wat de prestaties verder optimaliseert.

Best Practices voor Resource Deduplicatie

Globale Overwegingen voor Data Fetching en Deduplicatie

Bij het ontwerpen van data-fetching strategieën voor een wereldwijd publiek, spelen verschillende factoren een rol:

Een reisboekingswebsite die zich op een wereldwijd publiek richt, zou bijvoorbeeld een CDN kunnen gebruiken om vlucht- en hotelbeschikbaarheidsgegevens te serveren vanaf servers in verschillende regio's. De website zou ook een API voor valutaconversie gebruiken om prijzen in de lokale valuta van de gebruiker weer te geven en opties bieden voor het filteren van zoekresultaten op basis van taalvoorkeuren.

Conclusie

Resource deduplicatie is een essentiële optimalisatietechniek voor React-applicaties die Suspense gebruiken. Door dubbele data-fetching verzoeken te voorkomen, kunt u de prestaties aanzienlijk verbeteren, de serverbelasting verminderen en de gebruikerservaring verbeteren. Of u nu kiest voor het implementeren van een eenvoudige promise-cache of gebruikmaakt van geavanceerdere bibliotheken zoals lru-cache of axios-extensions, de sleutel is om de onderliggende principes te begrijpen en de oplossing te kiezen die het beste bij uw specifieke behoeften past. Vergeet niet om rekening te houden met wereldwijde factoren zoals CDN's, lokalisatie en toegankelijkheid bij het ontwerpen van uw data-fetching strategieën voor een divers publiek. Door deze best practices te implementeren, kunt u snellere, efficiëntere en gebruiksvriendelijkere React-applicaties bouwen.