Apidog

All-in-one Collaborative API Development Platform

Design de API

Documentação de API

Depuração de API

Mock de API

Testes Automatizados de API

Inscreva-se gratuitamente
Home / Tutoriais / Cache de Respostas da API em React - Apidog

Cache de Respostas da API em React - Apidog

Uma técnica poderosa para otimizar o desempenho e melhorar a experiência do usuário é o cache de resposta da API, e neste artigo, aprenderemos mais sobre isso.

Neste artigo, vamos explorar o conceito de caching de API, discutir a criação de um componente de cache personalizado em React e examinar várias ferramentas e pacotes que simplificam o processo. Se você está procurando implementar uma solução de cache básica ou aproveitar ferramentas avançadas como React Query e SWR, este guia fornecerá os insights e passos práticos necessários para otimizar suas aplicações React com um cache de resposta de API eficiente.

Por que Cache de Resposta de API em React?

O caching de resposta de API é uma técnica crítica no desenvolvimento web moderno que pode melhorar significativamente o desempenho e a eficiência das aplicações. À medida que as aplicações se tornam mais complexas, elas dependem cada vez mais de APIs externas para buscar dados, tornando a gestão eficiente dos dados uma preocupação crítica. Uma técnica poderosa para otimizar o desempenho e melhorar a experiência do usuário é o caching de resposta de API. Ao armazenar respostas de chamadas de API, as aplicações podem reduzir significativamente a carga no servidor, minimizar os tempos de recuperação de dados e oferecer uma experiência fluida aos usuários.

Imagine um cenário em que um usuário revisita uma página que ele acessou anteriormente—em vez de fazer uma nova solicitação ao servidor e esperar que os dados sejam buscados novamente, a aplicação pode fornecer a resposta armazenada de forma quase instantânea. Isso não apenas economiza tempo precioso, mas também garante uma interface mais suave e responsiva.

Criando um Componente de Cache Personalizado

Criar um componente de cache personalizado em React permite controle preciso sobre como os dados são armazenados em cache e gerenciados. Esta seção fornece um guia passo a passo para construir tal componente, juntamente com uma discussão sobre suas desvantagens.

Configuração do Componente

Primeiro, configure um componente básico de React que será responsável por buscar e armazenar dados em cache.


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>Carregando...</div>;

  return (
    <div className='App'>
      <pre>{JSON.stringify(data, null, 2)}</pre>
    </div>
  );
};

Gerenciamento de Estado

O hook useState é utilizado para gerenciar tanto os dados em cache quanto os dados atuais sendo buscados. Isso permite que o componente determine se deve fornecer dados em cache ou fazer uma nova chamada de API.

Buscando e Armazenando Dados em Cache

O hook useEffect contém a lógica para verificar o cache antes de fazer uma solicitação de rede. Se os dados forem encontrados no cache, eles são usados diretamente; caso contrário, uma solicitação fetch é feita e o resultado é armazenado no cache.

Expiração de Dados

Para lidar com a invalidação do cache, você pode definir um tempo de vida (TTL) para os dados em cache. Isso garante que os dados sejam periodicamente atualizados e permaneçam atualizados.

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>Carregando...</div>;

  return (
    <div className='App'>
      <pre>{JSON.stringify(data, null, 2)}</pre>
    </div>
  );
};

Desvantagens do Caching Personalizado

Embora criar um componente de cache personalizado ofereça flexibilidade, ele também apresenta várias desvantagens:

  • Complexidade: A lógica de cache personalizada pode adicionar complexidade significativa ao código, dificultando a manutenção e depuração.
  • Manutenção: Atualizações e manutenções regulares são necessárias para garantir que a lógica de cache continue a funcionar corretamente à medida que a aplicação evolui.
  • Problemas de Escalabilidade: À medida que a aplicação cresce, gerenciar soluções de cache personalizadas pode se tornar cada vez mais difícil, levando potencialmente a gargalos de desempenho.

Ao entender esses desafios, os desenvolvedores podem tomar decisões informadas sobre quando implementar caching personalizado e quando aproveitar ferramentas mais avançadas.

Usando Pacotes NPM para Caching

Aproveitar pacotes NPM pode simplificar muito a implementação de caching em aplicações React. Aqui estão alguns pacotes populares que podem ajudá-lo a começar:

axios-cache-adapter

axios-cache-adapter integra capacidades de caching ao axios, um popular cliente HTTP.

Instalação:

npm install axios axios-cache-adapter

Uso:

// Importar dependências
import axios from 'axios'
import { setupCache } from 'axios-cache-adapter'

// Criar instância `axios-cache-adapter`
const cache = setupCache({
  maxAge: 15 * 60 * 1000
})

// Criar instância `axios` passando o `cache.adapter` recém-criado
const api = axios.create({
  adapter: cache.adapter
})

// Enviar uma solicitação GET para alguma API REST
api({
  url: 'http://some-rest.api/url',
  method: 'get'
}).then(async (response) => {
  // Fazer algo fantástico com response.data \o/
  console.log('Resposta da solicitação:', response)

  // Interagindo com o store, veja a API `localForage`.
  const length = await cache.store.length()

  console.log('Comprimento do store de cache:', length)
})

lru-cache

lru-cache implementa um cache de menos recentemente utilizado (LRU).

Instalação:

npm install lru-cache

Uso:

import LRU from 'lru-cache';

const cache = new LRU({ max: 100 }); // Número máximo de itens no cache

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 o armazenamento de pares chave-valor no IndexedDB, uma API de baixo nível para armazenamento do lado do cliente.

Instalação:

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;
};

Esses pacotes oferecem uma maneira direta de implementar caching em suas aplicações React, reduzindo a complexidade e o esforço necessários para gerenciar os dados em cache manualmente. Ao usar essas ferramentas, você pode se concentrar mais no desenvolvimento dos recursos de sua aplicação, enquanto garante uma recuperação de dados eficiente e um desempenho melhorado.

Introdução a Ferramentas Avançadas para Caching de API

Quando se trata de caching de respostas de API em React, ferramentas avançadas como React Query e SWR oferecem soluções robustas e ricas em recursos que superam as capacidades de mecanismos de caching personalizados. Essas ferramentas são projetadas para simplificar o gerenciamento de estado, aprimorar a busca de dados e garantir a consistência dos dados, tudo isso enquanto fornecem uma experiência de desenvolvedor fluida.

TanStack Query

TanStack Query (FKA React Query) é uma poderosa biblioteca de busca de dados para aplicações React que abstrai as complexidades de gerenciar dados do lado do servidor. React Query transforma a maneira como você lida com o estado do servidor em suas aplicações React. Ela oferece caching embutido, atualizações em segundo plano e suporte imediato para tratamento de erros, tornando mais fácil gerenciar a lógica de busca de dados sem a necessidade de lidar manualmente com caching e sincronização de estado.

Benefícios em Relação a Soluções Personalizadas:

Gerenciamento de Estado Simplificado:
React Query lida com as complexidades de caching e gerenciamento de estado, permitindo que os desenvolvedores se concentrem na lógica da aplicação. Ela abstrai as complexidades de caching, invalidação e nova busca de dados, fornecendo uma API limpa e intuitiva.

Atualização Automática em Segundo Plano:
React Query pode automaticamente buscar dados em segundo plano para mantê-los atualizados. Isso garante que sua aplicação sempre exiba os dados mais atuais sem a necessidade de gatilhos de atualização manual.

Atualizações Otimistas:
Com atualizações otimistas, o React Query pode refletir imediatamente as mudanças na UI antes que o servidor confirme a atualização. Isso proporciona uma experiência de usuário suave e responsiva, pois os usuários podem ver suas ações refletidas instantaneamente.

Exemplo:

npm install react-query // instalar o pacote

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 'Carregando...'

  if (error) return 'Ocorreu um erro: ' + error.message

  return (
    <div>
      <pre>{JSON.stringify(data, null, 2)}</pre>
    </div>
  )
}

O código acima é da página de documentação oficial, e explica a maneira básica de buscar dados. Como você pode ver nos códigos acima, o TanStack Query facilita a busca de dados e também o armazenamento desses dados de forma fácil.

SWR (Stale-While-Revalidate)

SWR, desenvolvido pela Vercel, é outra biblioteca popular de busca de dados para React que enfatiza simplicidade e eficiência. O nome "SWR" significa "stale-while-revalidate", uma estratégia de caching que serve dados desatualizados enquanto busca dados novos em segundo plano.

SWR fornece uma API altamente intuitiva para busca e caching de dados. Ele garante que sua aplicação exiba dados imediatamente (dados desatualizados) e depois revalida buscando novos dados em segundo plano. Essa estratégia oferece um equilíbrio entre desempenho e frescor dos dados.

Benefícios em Relação a Soluções Personalizadas:

Facilidade de Uso:
A API do SWR é simples e fácil de usar, tornando-o acessível para desenvolvedores de todos os níveis de habilidade. Ele lida com busca de dados, caching, sincronização e tratamento de erros com configuração mínima.

Consistência dos Dados:
O SWR garante que os dados da sua aplicação estejam sempre atualizados. Ele revalida automaticamente os dados em segundo plano, fornecendo aos usuários as informações mais recentes sem exigir atualizações manuais.

Tratamento de Erros:
O tratamento de erros embutido no SWR facilita o gerenciamento de erros durante a busca de dados. Ele fornece hooks para exibir mensagens de erro ou componentes de UI em caso de falha na busca de dados.

Exemplo:

npm install swr // instalar o pacote

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>Carregando...</div>;
  if (error) return <div>Erro: {error.message}</div>;

  return (
    <div>
      <pre>{JSON.stringify(data, null, 2)}</pre>
    </div>
  );
};

Tanto o React Query quanto o SWR fornecem soluções abrangentes para gerenciar dados do lado do servidor em aplicações React. Eles simplificam o processo de busca, caching e sincronização dos dados, oferecendo recursos poderosos que reduzem a necessidade de lógica de caching personalizada. Ao aproveitar essas ferramentas, os desenvolvedores podem garantir que suas aplicações sejam eficientes, performáticas e ofereçam uma experiência de usuário fluida.

Trabalhando com Apidog

Página inicial do Apidog

Apidog melhora a segurança da API ao oferecer documentação robusta, testes automatizados e monitoramento em tempo real. O Apidog também ajuda na conformidade com padrões da indústria como GDPR e HIPAA, garantindo que suas APIs protejam os dados dos usuários de forma eficaz.

Além disso, o Apidog suporta colaboração em equipe, promovendo um ambiente de desenvolvimento focado em segurança. Ao integrar o Apidog, você pode construir APIs seguras, confiáveis e em conformidade, protegendo seus dados e usuários de várias ameaças à segurança.

botão

Conclusão

Otimizar os tempos de resposta da API é crucial para melhorar o desempenho e a experiência do usuário em aplicações web modernas. O caching de respostas de API pode reduzir significativamente a carga no servidor e melhorar as velocidades de recuperação de dados. Embora a construção de componentes de cache personalizados em React ofereça flexibilidade, aproveitar ferramentas avançadas como React Query e SWR pode agilizar o processo e fornecer recursos adicionais, como atualizações automáticas em segundo plano e tratamento de erros.

Além disso, usar pacotes NPM como axios-cache-adapter, lru-cache e idb-keyval pode simplificar implementações de caching e reduzir a complexidade de gerenciar dados em cache. Para gerenciamento abrangente de APIs, ferramentas como Apidog oferecem soluções robustas para design, teste e monitoramento de APIs, garantindo confiabilidade e eficiência ao longo do ciclo de desenvolvimento.

Ao incorporar essas ferramentas e estratégias, os desenvolvedores podem criar aplicações responsivas e de alto desempenho que oferecem uma experiência de usuário fluida.

Junte-se à Newsletter da Apidog

Inscreva-se para ficar atualizado e receber os últimos pontos de vista a qualquer momento.