Busque em todas as páginas da documentação
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥
O SWR usa um cache em memória por padrão. Personalize o provedor de cache para armazenamento persistente, projete sua estratégia de chaves para obter o máximo de acertos de cache e aproveite a dedupicação para evitar requisições de rede redundantes.
"use client";
import { SWRConfig } from "swr";
function App({ children }: { children: React.ReactNode }) {
return (
<SWRConfig
value={{
provider: () => new Map(), // Cache padrão em memória
dedupingInterval: 2000, // Dedup requisições dentro de 2s
}}
>
{children}
</SWRConfig>
);
}"use client";
import { SWRConfig, Cache } from "swr";
import useSWR from "swr";
// Cache persistente com base no localStorage
function localStorageProvider(): Cache {
const map = new Map<string, any>(
JSON.parse(localStorage.getItem("swr-cache") || "[]")
);
// Persiste no localStorage antes de descarregar a página
window.addEventListener("beforeunload", () => {
const appCache = JSON.stringify(Array.from(map.entries()));
localStorage.setItem("swr-cache", appCache);
});
return {
get: (key: string) => map.get(key),
set: (key: string, value: any) => map.set(key, value),
delete: (key: string) => map.delete(key),
keys: () => map.keys(),
};
}
export function CachedApp({ children }: { children: React.ReactNode }) {
return (
<SWRConfig value={{ provider: localStorageProvider }}>
{children}
</SWRConfig>
);
}
// Componentes se beneficiam automaticamente do cache persistente
function UserProfile() {
const { data } = useSWR("/api/me", (url) => fetch(url).then((r) => r.json()));
return <div>{data?.name}</div>;
}useSWR(key) mapeia diretamente para uma entrada de cache.Map que vive na memória e é reiniciada ao recarregar a página.dedupingInterval ms, apenas um fetch é executado. Todos os hooks recebem a mesma promise.provider em SWRConfig é chamada uma vez ao montar e deve retornar um objeto compatível com Cache.Design de chaves para eficiência de cache:
// Bom: Chaves estáveis e serializáveis
useSWR(`/api/users/${id}`, fetcher);
useSWR(["/api/users", id, "posts"], fetcher);
// Ruim: Referências de objeto instáveis (não serializáveis)
useSWR({ url: "/api/users", id }, fetcher); // Não será cacheado corretamentePré-busca para o cache:
import { preload } from "swr";
const fetcher = (url: string) => fetch(url).then((r) => r.json());
// Pré-busca ao passar o mouse ou pré-busca de rota
function ProductCard({ id }: { id: string }) {
const handleMouseEnter = () => {
preload(`/api/products/${id}`, fetcher);
};
return (
<a href={`/products/${id}`} onMouseEnter={handleMouseEnter}>
Ver Produto
</a>
);
}Limpando o cache:
import { useSWRConfig } from "swr";
function LogoutButton() {
const { cache } = useSWRConfig();
const handleLogout = () => {
// Limpa todos os dados cacheados no logout
if (cache instanceof Map) {
cache.clear();
}
};
return <button onClick={handleLogout}>Logout</button>;
}Cache com TTL:
function ttlProvider(): Cache {
const cache = new Map<string, { value: any; expiry: number }>();
const TTL = 5 * 60 * 1000; // 5 minutos
return {
get: (key: string) => {
const entry = cache.get(key);
if (!entry) return undefined;
if (Date.now() > entry.expiry) {
cache.delete(key);
return undefined;
}
return entry.value;
},
set: (key: string, value: any) => {
cache.set(key, { value, expiry: Date.now() + TTL });
},
delete: (key: string) => cache.delete(key),
keys: () => cache.keys(),
};
}Cache de swr para tipar provedores personalizados.provider espera () => Cache.import type { Cache } from "swr";
const provider = (): Cache => {
const map = new Map();
return {
get: (key: string) => map.get(key),
set: (key: string, value: any) => map.set(key, value),
delete: (key: string) => map.delete(key),
keys: () => map.keys(),
};
};dedupingInterval apenas deduplica requisições concorrentes. Ele não impede re-fetches após o vencimento do intervalo.["/api/users", id] são serializadas para cache. A ordem dos elementos importa: [a, b] e [b, a] são chaves de cache diferentes.Cache completa, incluindo keys(). Métodos ausentes causarão erros em tempo de execução.set do seu provedor.SWRConfig em diferentes níveis de aninhamento; cada provedor cria seu próprio escopo.| Abordagem | Prós | Contras |
|---|---|---|
| Cache Map padrão | Zero configuração, rápido | Perdido ao recarregar |
| Provedor localStorage | Persiste entre sessões | Limite de 5MB, API síncrona bloqueia a thread principal |
| Provedor IndexedDB | Armazenamento grande, assíncrono | Implementação mais complexa |
| Sem cache (dedupingInterval: 0) | Dados sempre frescos | Mais requisições de rede |
O SWR usa uma instância Map em memória por padrão. Ela é reiniciada ao recarregar a página. Nenhuma configuração é necessária para cache básico.
Implemente um provedor de cache personalizado com base em localStorage ou IndexedDB. O provedor deve implementar a interface Cache (get, set, delete, keys). Persista em beforeunload e reidrate na inicialização.
dedupingInterval) previne requisições duplicadas concorrentes dentro de uma janela de tempo.Sim. ["/api/users", id] e [id, "/api/users"] são chaves de cache diferentes. O SWR serializa os elementos do array em ordem, então mudar a ordem cria uma entrada de cache diferente.
import { preload } from "swr";
const fetcher = (url: string) => fetch(url).then((r) => r.json());
// Pré-busca ao passar o mouse
const handleMouseEnter = () => {
preload(`/api/products/${id}`, fetcher);
};const { cache } = useSWRConfig();
const handleLogout = () => {
if (cache instanceof Map) {
cache.clear();
}
};Não. Referências de objeto não são serializáveis pelo SWR. Use strings ou arrays como chaves. useSWR({ url: "/api/users", id }, fetcher) não será cacheado corretamente.
A escrita falha silenciosamente. Implemente tratamento de erros no método set do seu provedor usando um try/catch e considere remover entradas antigas ou voltar para o armazenamento em memória.
import type { Cache } from "swr";
const provider = (): Cache => {
const map = new Map();
return {
get: (key: string) => map.get(key),
set: (key: string, value: any) => map.set(key, value),
delete: (key: string) => map.delete(key),
keys: () => map.keys(),
};
};A opção provider espera uma função do tipo () => Cache. Importe Cache de swr para tipar sua implementação personalizada. Métodos de interface ausentes (keys, delete) causarão erros em tempo de execução.
Armazene entradas com um timestamp de expiração. Em get, verifique se a entrada expirou e retorne undefined se for o caso. Isso força o SWR a tratá-la como uma falha de cache e a re-buscar os dados.
Revisado por Chris St. John·Última atualização: 7 de jul. de 2026
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥