React Suspense'i ressursside dubleerimise vältimine: duplikaatpäringute ennetamine | MLOG | MLOG

Nüüd kontrollib UserResource, kas ressurss on juba cache'is olemas. Kui on, tagastatakse vahemälus olev ressurss. Vastasel juhul algatatakse uus päring ja tulemuseks olev promise salvestatakse vahemällu. See tagab, et iga unikaalse userId kohta tehakse ainult üks päring.

2. Spetsiaalse vahemäluteegi kasutamine (nt `lru-cache`)

Keerulisemate vahemälustsenaariumide jaoks kaaluge spetsiaalse vahemäluteegi, nagu lru-cache või sarnase, kasutamist. Need teegid pakuvad funktsioone nagu vahemälu tühjendamine, mis põhineb kõige vähem kasutatud (LRU) või muudel poliitikatel, mis võib olla mälu kasutuse haldamisel ülioluline, eriti suure hulga ressurssidega tegelemisel.

Esmalt paigaldage teek:

            
npm install lru-cache

            

Seejärel integreerige see oma UserResource'i:

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

const fetchUser = (userId) => {
  console.log(`Fetching user with ID: ${userId}`); // Simuleeri võrgupäringut
  return new Promise(resolve => {
    setTimeout(() => {
      resolve({ id: userId, name: `User ${userId}`, email: `user${userId}@example.com` });
    }, 1000); // Simuleeri võrgu latentsust
  });
};

const cache = new LRUCache({
  max: 100, // Maksimaalne elementide arv vahemälus
  ttl: 60000, // Eluiga millisekundites (1 minut)
});

const UserResource = (userId) => {
  if (!cache.has(userId)) {
    let promise = null;
    let status = 'pending'; // ootel, õnnestus, viga
    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 (
    

Kasutajaprofiil

ID: {user.id}

Nimi: {user.name}

E-post: {user.email}

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

Kasutaja andmed

ID: {user.id}

Nimi: {user.name}

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

See lähenemine annab rohkem kontrolli vahemälu suuruse ja aegumispoliitika üle.

3. Päringute ühendamine teekidega nagu `axios-extensions`

Teegid nagu axios-extensions pakuvad täpsemaid funktsioone, näiteks päringute ühendamist (request coalescing). Päringute ühendamine kombineerib mitu identset päringut üheks päringuks, optimeerides veelgi võrgukasutust. See on eriti kasulik stsenaariumides, kus päringud algatatakse ajaliselt väga lähestikku.

Esmalt paigaldage teek:

            
npm install axios axios-extensions

            

Seejärel konfigureerige Axios axios-extensions'i pakutava cache adapteriga.

Näide, kasutades `axios-extensions`'i ja luues ressurssi:

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

const instance = axios.create({
  baseURL: 'https://api.example.com', // Asenda oma API lõpp-punktiga
  adapter: cacheAdapterEnhancer(axios.defaults.adapter, { enabledByDefault: true }),
});

const fetchUser = async (userId) => {
  console.log(`Fetching user with ID: ${userId}`); // Simuleeri võrgupäringut
  const response = await instance.get(`/users/${userId}`);
  return response.data;
};


const UserResource = (userId) => {
    let promise = null;
    let status = 'pending'; // ootel, õnnestus, viga
    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 (
    

Kasutajaprofiil

ID: {user.id}

Nimi: {user.name}

E-post: {user.email}

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

Kasutaja andmed

ID: {user.id}

Nimi: {user.name}

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

See konfigureerib Axiose kasutama vahemälu adapterit, mis salvestab vastused automaatselt vahemällu vastavalt päringu konfiguratsioonile. Funktsioon cacheAdapterEnhancer pakub võimalusi vahemälu konfigureerimiseks, näiteks maksimaalse suuruse või aegumisaja määramiseks. throttleAdapterEnhancer'it saab kasutada ka serverile teatud aja jooksul tehtavate päringute arvu piiramiseks, mis optimeerib jõudlust veelgi.

Ressursside dubleerimise vältimise parimad praktikad

Globaalsed kaalutlused andmete pärimisel ja dubleerimise vältimisel

Globaalsele sihtrühmale andmete pärimise strateegiate väljatöötamisel tuleb arvesse võtta mitmeid tegureid:

Näiteks võib globaalsele sihtrühmale suunatud reisibroneerimissait kasutada CDN-i, et pakkuda lennu- ja hotellide saadavuse andmeid erinevates piirkondades asuvatest serveritest. Veebisait kasutaks ka valuutakonversiooni API-t, et kuvada hindu kasutaja kohalikus valuutas ja pakkuda võimalusi otsingutulemuste filtreerimiseks keele-eelistuste alusel.

Kokkuvõte

Ressursside dubleerimise vältimine on Suspense'i kasutavate Reacti rakenduste jaoks oluline optimeerimistehnika. Vältides andmete topeltpärimise päringuid, saate oluliselt parandada jõudlust, vähendada serveri koormust ja parandada kasutajakogemust. Olenemata sellest, kas valite lihtsa promise'i vahemälu rakendamise või kasutate täpsemaid teeke nagu lru-cache või axios-extensions, on oluline mõista aluspõhimõtteid ja valida lahendus, mis sobib kõige paremini teie konkreetsetele vajadustele. Pidage meeles arvestada globaalsete teguritega nagu CDN-id, lokaliseerimine ja juurdepääsetavus, kui kujundate oma andmete pärimise strateegiaid mitmekesisele sihtrühmale. Neid parimaid praktikaid rakendades saate luua kiiremaid, tõhusamaid ja kasutajasõbralikumaid Reacti rakendusi.