En este artículo, exploraremos el concepto de almacenamiento en caché de API, discutiremos la creación de un componente de almacenamiento en caché personalizado en React y examinaremos varias herramientas y paquetes que simplifican el proceso. Ya sea que esté buscando implementar una solución básica de almacenamiento en caché o aprovechar herramientas avanzadas como React Query y SWR, esta guía le proporcionará los conocimientos y los pasos prácticos necesarios para optimizar sus aplicaciones React con un almacenamiento en caché eficiente de las respuestas de la API.
¿Por qué almacenar en caché las respuestas de la API en React?
El almacenamiento en caché de las respuestas de la API es una técnica fundamental en el desarrollo web moderno que puede mejorar significativamente el rendimiento y la eficiencia de las aplicaciones. A medida que las aplicaciones se vuelven más complejas, dependen cada vez más de las API externas para obtener datos, lo que hace que la gestión eficiente de los datos sea una preocupación fundamental. Una técnica poderosa para optimizar el rendimiento y mejorar la experiencia del usuario es el almacenamiento en caché de las respuestas de la API. Al almacenar las respuestas de las llamadas a la API, las aplicaciones pueden reducir significativamente la carga del servidor, minimizar los tiempos de recuperación de datos y brindar una experiencia perfecta a los usuarios.
Imagine un escenario en el que un usuario vuelve a visitar una página a la que accedió anteriormente: en lugar de realizar una nueva solicitud al servidor y esperar a que se recuperen los datos nuevamente, la aplicación puede servir la respuesta almacenada casi instantáneamente. Esto no solo ahorra un tiempo valioso, sino que también garantiza una interfaz más fluida y receptiva.
Creación de un componente de almacenamiento en caché personalizado
Crear un componente de almacenamiento en caché personalizado en React permite un control preciso sobre cómo se almacenan en caché y se gestionan los datos. Esta sección proporciona una guía paso a paso para construir dicho componente, junto con una discusión sobre sus desventajas.
Configuración del componente
Primero, configure un componente React básico que será responsable de obtener y almacenar en caché los datos.
import React, { useState, useEffect } from 'react';
const useCustomCache = (apiUrl) => {
const [data, setData] = useState(null);
const [cache, setCache] = useState({});
useEffect(() => {
if (cache[apiUrl]) {
setData(cache[apiUrl]);
} else {
fetch(apiUrl)
.then(response => response.json())
.then(result => {
setCache(prevCache => ({ ...prevCache, [apiUrl]: result }));
setData(result);
});
}
}, [apiUrl, cache]);
return data;
};
export function App(props) {
const apiUrl = 'https://jsonplaceholder.typicode.com/users';
const data = useCustomCache(apiUrl);
if (!data) return <div>Cargando...</div>;
return (
<div className='App'>
<pre>{JSON.stringify(data, null, 2)}</pre>
</div>
);
};
Gestión del estado
El hook useState se utiliza para gestionar tanto los datos almacenados en caché como los datos actuales que se están obteniendo. Esto permite que el componente determine si debe servir datos almacenados en caché o realizar una nueva llamada a la API.
Obtención y almacenamiento en caché de datos
El hook useEffect contiene la lógica para verificar la caché antes de realizar una solicitud de red. Si los datos se encuentran en la caché, se utilizan directamente; de lo contrario, se realiza una solicitud fetch y el resultado se almacena en la caché.
Caducidad de los datos
Para gestionar la invalidación de la caché, puede establecer un tiempo de vida (TTL) para los datos almacenados en caché. Esto garantiza que los datos se actualicen periódicamente y se mantengan actualizados.
import React, { useState, useEffect } from 'react';
const useCustomCache = (apiUrl, ttl = 60000) => {
const [data, setData] = useState(null);
const [cache, setCache] = useState({});
useEffect(() => {
const cachedData = cache[apiUrl];
if (cachedData && (Date.now() - cachedData.timestamp < ttl)) {
setData(cachedData.data);
} else {
fetch(apiUrl)
.then(response => response.json())
.then(result => {
setCache(prevCache => ({ ...prevCache, [apiUrl]: { data: result, timestamp: Date.now() } }));
setData(result);
});
}
}, [apiUrl, cache, ttl]);
return data;
};
export function App(props) {
const apiUrl = 'https://jsonplaceholder.typicode.com/users';
const data = useCustomCache(apiUrl);
if (!data) return <div>Cargando...</div>;
return (
<div className='App'>
<pre>{JSON.stringify(data, null, 2)}</pre>
</div>
);
};
Desventajas del almacenamiento en caché personalizado
Si bien la creación de un componente de almacenamiento en caché personalizado ofrece flexibilidad, también conlleva varias desventajas:
- Complejidad: la lógica de almacenamiento en caché personalizada puede agregar una complejidad significativa a la base de código, lo que dificulta su mantenimiento y depuración.
- Mantenimiento: se requieren actualizaciones y mantenimiento regulares para garantizar que la lógica de almacenamiento en caché continúe funcionando correctamente a medida que evoluciona la aplicación.
- Problemas de escalabilidad: a medida que la aplicación crece, la gestión de soluciones de almacenamiento en caché personalizadas puede volverse cada vez más difícil, lo que podría provocar cuellos de botella en el rendimiento.
Al comprender estos desafíos, los desarrolladores pueden tomar decisiones informadas sobre cuándo implementar el almacenamiento en caché personalizado y cuándo aprovechar herramientas más avanzadas.
Uso de paquetes NPM para el almacenamiento en caché
Aprovechar los paquetes NPM puede simplificar enormemente la implementación del almacenamiento en caché en las aplicaciones React. Aquí hay algunos paquetes populares que pueden ayudarlo a comenzar:
axios-cache-adapter
axios-cache-adapter integra capacidades de almacenamiento en caché en axios, un cliente HTTP popular.
Instalación:
npm install axios axios-cache-adapter
Uso:
// Import dependencies
import axios from 'axios'
import { setupCache } from 'axios-cache-adapter'
// Create `axios-cache-adapter` instance
const cache = setupCache({
maxAge: 15 * 60 * 1000
})
// Create `axios` instance passing the newly created `cache.adapter`
const api = axios.create({
adapter: cache.adapter
})
// Send a GET request to some REST api
api({
url: 'http://some-rest.api/url',
method: 'get'
}).then(async (response) => {
// Do something fantastic with response.data \o/
console.log('Request response:', response)
// Interacting with the store, see `localForage` API.
const length = await cache.store.length()
console.log('Cache store length:', length)
})lru-cache
lru-cache implementa una caché de "usado menos recientemente" (LRU).
Instalación:
npm install lru-cache
Uso:
import LRU from 'lru-cache';
const cache = new LRU({ max: 100 }); // Número máximo de elementos en la caché
const fetchData = async (url) => {
if (cache.has(url)) {
return cache.get(url);
}
const response = await fetch(url);
const data = await response.json();
cache.set(url, data);
return data;
};
idb-keyval
idb-keyval simplifica el almacenamiento de pares clave-valor en IndexedDB, una API de bajo nivel para el almacenamiento del lado del cliente.
Instalación:
npm install idb-keyval
Uso:
import { get, set } from 'idb-keyval';
const fetchData = async (url) => {
const cachedData = await get(url);
if (cachedData) {
return cachedData;
}
const response = await fetch(url);
const data = await response.json();
await set(url, data);
return data;
};
Estos paquetes ofrecen una forma sencilla de implementar el almacenamiento en caché en sus aplicaciones React, lo que reduce la complejidad y el esfuerzo necesarios para gestionar los datos almacenados en caché manualmente. Al usar estas herramientas, puede concentrarse más en el desarrollo de las características de su aplicación al tiempo que garantiza una recuperación de datos eficiente y un rendimiento mejorado.
Introducción a herramientas avanzadas para el almacenamiento en caché de API
Cuando se trata de almacenar en caché las respuestas de la API en React, las herramientas avanzadas como React Query y SWR ofrecen soluciones sólidas y ricas en funciones que superan las capacidades de los mecanismos de almacenamiento en caché personalizados. Estas herramientas están diseñadas para simplificar la gestión del estado, mejorar la obtención de datos y garantizar la coherencia de los datos, al tiempo que brindan una experiencia de desarrollador perfecta.
TanStack Query
TanStack Query (anteriormente React Query) es una poderosa biblioteca de obtención de datos para aplicaciones React que abstrae las complejidades de la gestión de datos del lado del servidor. React Query transforma la forma en que gestiona el estado del servidor en sus aplicaciones React. Ofrece almacenamiento en caché integrado, actualizaciones en segundo plano y soporte listo para usar para el manejo de errores, lo que facilita la gestión de la lógica de obtención de datos sin la necesidad de gestionar manualmente el almacenamiento en caché y la sincronización del estado.
Beneficios sobre las soluciones personalizadas:
Gestión de estado simplificada:
React Query gestiona las complejidades del almacenamiento en caché y la gestión del estado, lo que permite a los desarrolladores centrarse en la lógica de la aplicación. Abstrae las complejidades del almacenamiento en caché, la invalidación y la recuperación de datos, proporcionando una API limpia e intuitiva.
Actualización automática en segundo plano:
React Query puede volver a obtener datos automáticamente en segundo plano para mantenerlos actualizados. Esto garantiza que su aplicación siempre muestre los datos más actuales sin la necesidad de activadores de actualización manuales.
Actualizaciones optimistas:
Con las actualizaciones optimistas, React Query puede reflejar inmediatamente los cambios en la interfaz de usuario antes de que el servidor confirme la actualización. Esto proporciona una experiencia de usuario fluida y receptiva, ya que los usuarios pueden ver sus acciones reflejadas al instante.
Ejemplo:
npm install react-query // install the package
import { QueryClient, QueryClientProvider, useQuery } from 'react-query'
const queryClient = new QueryClient()
export default function App() {
return (
<QueryClientProvider client={queryClient}>
<Example />
</QueryClientProvider>
)
}
function Example() {
const { isPending, error, data } = useQuery({
queryKey: ['repoData'],
queryFn: () =>
fetch('https://jsonplaceholder.typicode.com/users').then((res) =>
res.json(),
),
})
console.log(data)
if (isPending) return 'Cargando...'
if (error) return 'Ha ocurrido un error: ' + error.message
return (
<div>
<pre>{JSON.stringify(data, null, 2)}</pre>
</div>
)
}
El código anterior es de la página de documentación oficial, y explica la forma básica de obtener datos. Como puede ver en los códigos anteriores, TanStack Query nos facilita la obtención de datos y también el almacenamiento en caché de esos datos fácilmente.
SWR (Stale-While-Revalidate)
SWR, desarrollado por Vercel, es otra biblioteca popular de obtención de datos para React que enfatiza la simplicidad y la eficiencia. El nombre "SWR" significa "stale-while-revalidate", una estrategia de almacenamiento en caché que sirve datos obsoletos mientras obtiene datos nuevos en segundo plano.
SWR proporciona una API altamente intuitiva para la obtención y el almacenamiento en caché de datos. Garantiza que su aplicación muestre los datos inmediatamente (datos obsoletos) y luego los vuelva a validar obteniendo datos nuevos en segundo plano. Esta estrategia proporciona un equilibrio entre el rendimiento y la frescura de los datos.
Beneficios sobre las soluciones personalizadas:
Facilidad de uso:
La API de SWR es simple y fácil de usar, lo que la hace accesible para desarrolladores de todos los niveles de habilidad. Gestiona la obtención de datos, el almacenamiento en caché, la sincronización y el manejo de errores con una configuración mínima.
Coherencia de los datos:
SWR garantiza que los datos de su aplicación estén siempre actualizados. Vuelve a validar automáticamente los datos en segundo plano, proporcionando a los usuarios la información más actualizada sin necesidad de actualizaciones manuales.
Manejo de errores:
El manejo de errores integrado en SWR facilita la gestión de errores durante la obtención de datos. Proporciona hooks para mostrar mensajes de error o componentes de interfaz de usuario de reserva cuando falla la obtención de datos.
Ejemplo:
npm install swr // install the package
import useSWR from 'swr';
const fetcher = (url) => fetch(url).then((res) => res.json());
export default Example = () => {
const apiUrl = 'https://jsonplaceholder.typicode.com/users';
const { data, error } = useSWR(apiUrl, fetcher);
if (!data) return <div>Cargando...</div>;
if (error) return <div>Error: {error.message}</div>;
return (
<div>
<pre>{JSON.stringify(data, null, 2)}</pre>
</div>
);
};
Tanto React Query como SWR proporcionan soluciones integrales para la gestión de datos del lado del servidor en aplicaciones React. Simplifican el proceso de obtención, almacenamiento en caché y sincronización de datos, ofreciendo potentes funciones que reducen la necesidad de una lógica de almacenamiento en caché personalizada. Al aprovechar estas herramientas, los desarrolladores pueden garantizar que sus aplicaciones sean eficientes, tengan un buen rendimiento y brinden una experiencia de usuario perfecta.
Trabajando con Apidog

Apidog mejora la seguridad de la API al ofrecer documentación sólida, pruebas automatizadas y monitoreo en tiempo real. Apidog también ayuda a cumplir con los estándares de la industria como GDPR y HIPAA, asegurando que sus API protejan los datos del usuario de manera efectiva.
Además, Apidog admite la colaboración en equipo, fomentando un entorno de desarrollo centrado en la seguridad. Al integrar Apidog, puede crear API seguras, confiables y compatibles, protegiendo sus datos y usuarios de diversas amenazas de seguridad.
Conclusión
Optimizar los tiempos de respuesta de la API es crucial para mejorar el rendimiento y la experiencia del usuario de las aplicaciones web modernas. El almacenamiento en caché de las respuestas de la API puede reducir significativamente la carga del servidor y mejorar las velocidades de recuperación de datos. Si bien la creación de componentes de almacenamiento en caché personalizados en React ofrece flexibilidad, aprovechar herramientas avanzadas como React Query y SWR puede optimizar el proceso y proporcionar características adicionales como actualizaciones automáticas en segundo plano y manejo de errores.
Además, el uso de paquetes NPM como axios-cache-adapter, lru-cache e idb-keyval puede simplificar las implementaciones de almacenamiento en caché y reducir la complejidad de la gestión de datos almacenados en caché. Para la gestión integral de API, herramientas como Apidog ofrecen soluciones sólidas para el diseño, las pruebas y el monitoreo de API, lo que garantiza la confiabilidad y la eficiencia durante todo el ciclo de vida del desarrollo.
Al incorporar estas herramientas y estrategias, los desarrolladores pueden crear aplicaciones receptivas y de alto rendimiento que brinden una experiencia de usuario perfecta.



