Busque em todas as páginas da documentação
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥
Instale o SWR, envolva seu aplicativo com SWRConfig e defina padrões globais para que cada chamada useSWR herde um fetcher e opções compartilhados.
npm install swr// app/providers.tsx
"use client";
import { SWRConfig } from "swr";
const fetcher = (url: string) => fetch(url).then((res) => res.json());
export function SWRProvider({ children }: { children: React.ReactNode }) {
return (
<SWRConfig
value={{
fetcher,
revalidateOnFocus: true,
dedupingInterval: 2000,
}}
>
{children}
</SWRConfig>
);
}// app/layout.tsx
import { SWRProvider } from "./providers";
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html lang="en">
<body>
<SWRProvider>{children}</SWRProvider>
</body>
</html>
);
}"use client";
import useSWR from "swr";
function UserProfile({ userId }: { userId: string }) {
// fetcher é herdado de SWRConfig
const { data, error, isLoading } = useSWR(`/api/users/${userId}`);
if (isLoading) return <div>Carregando...</div>;
if (error) return <div>Falha ao carregar</div>;
return <div>Olá, {data.name}!</div>;
}SWRConfig usa React Context internamente para propagar valores de configuração pela árvore de componentes.useSWR sem um fetcher explícito recorrerá ao fetcher do provedor SWRConfig mais próximo.SWRConfig podem ser aninhados; valores internos se mesclam e substituem valores externos.dedupingInterval impede requisições duplicadas para a mesma chave dentro dos milissegundos especificados.revalidateOnFocus aciona uma revalidação em segundo plano quando a aba do navegador recupera o foco.Fetcher customizado com cabeçalhos:
const authedFetcher = (url: string) =>
fetch(url, {
headers: { Authorization: `Bearer ${getToken()}` },
}).then((res) => {
if (!res.ok) throw new Error("Falha ao buscar");
return res.json();
});Configuração aninhada com substituição:
<SWRConfig value={{ fetcher: globalFetcher }}>
<SWRConfig value={{ refreshInterval: 3000 }}>
{/* Componentes aqui recebem globalFetcher + 3s de refresh */}
</SWRConfig>
</SWRConfig>Configuração funcional (acessa o pai):
<SWRConfig
value={(parentConfig) => ({
...parentConfig,
refreshInterval: 5000,
})}
>
{children}
</SWRConfig>SWRConfig aceita value tipado como Partial<SWRConfiguration> ou uma função que retorna um.SWRConfiguration de swr para tipar objetos de configuração explicitamente.import type { SWRConfiguration } from "swr";
const config: SWRConfiguration = {
fetcher: (url: string) => fetch(url).then((r) => r.json()),
revalidateOnFocus: false,
};"use client" no arquivo do provedor no Next.js App Router causará um erro em tempo de execução porque SWRConfig usa React Context.error sempre será undefined, mesmo em respostas 404.dedupingInterval não é o mesmo que cache. Ele apenas deduplica requisições em andamento dentro da janela de intervalo.refreshInterval no nível global se aplica a todos os hooks. Prefira definir por hook, a menos que você realmente precise de polling global.| Abordagem | Prós | Contras |
|---|---|---|
| SWRConfig Global | Configuração única, padrões consistentes | Todos os hooks compartilham a configuração; pode ser muito amplo |
| Configuração por hook | Controle granular por consulta | Declarações repetitivas de fetcher |
| Wrapper de hook customizado | Lógica centralizada com flexibilidade | Camada de abstração extra |
SWRConfig usa React Context internamente, que é uma API do lado do cliente. Sem "use client", o Next.js trata o arquivo como um Server Component e lança um erro em tempo de execução quando o Context é usado.
useSWR com a mesma chave dentro dessa janela, apenas uma requisição de rede será feita.Valores internos de SWRConfig se mesclam e substituem valores externos. Por exemplo, um provedor interno pode definir refreshInterval enquanto herda o fetcher do provedor externo.
O SWR tratará a resposta como dados bem-sucedidos. O valor error será sempre undefined, mesmo em respostas 404 ou 500. Sempre verifique res.ok no seu fetcher e lance um erro se for falso.
Passe uma função em vez de um objeto para a prop value:
<SWRConfig
value={(parentConfig) => ({
...parentConfig,
refreshInterval: 5000,
})}
>
{children}
</SWRConfig>Funciona, mas aplica polling a todos os hooks useSWR na árvore. Prefira definir refreshInterval por hook, a menos que você realmente precise que todas as consultas façam polling na mesma taxa.
Importe SWRConfiguration de swr e use-o como tipo:
import type { SWRConfiguration } from "swr";
const config: SWRConfiguration = {
fetcher: (url: string) => fetch(url).then((r) => r.json()),
revalidateOnFocus: false,
};Aceita Partial<SWRConfiguration> ou uma função (parentConfig: SWRConfiguration) => SWRConfiguration que recebe a configuração pai e retorna uma nova.
Sim. Defina um fetcher customizado que inclua cabeçalhos:
const authedFetcher = (url: string) =>
fetch(url, {
headers: { Authorization: `Bearer ${getToken()}` },
}).then((res) => {
if (!res.ok) throw new Error("Falha ao buscar");
return res.json();
});Se não houver um provedor SWRConfig envolvendo o componente (ou se o provedor não definir um fetcher), useSWR não terá um fetcher e silenciosamente nunca buscará dados. Sempre garanta que um provedor com um fetcher exista acima dos seus componentes.
Envolva-o em {children} no seu app/layout.tsx raiz para que todas as páginas e componentes herdem a configuração compartilhada.
Revisado por Chris St. John·Última atualização: 19 de jul. de 2026
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥