Skip to content
Documentação
SSG e SSR com Next.js

Usando com Next.js

App Router

Server Components

No App Router do Next.js, todos os componentes são React Server Components (RSC) por padrão. Você só pode importar as APIs de serialização de chave do SWR em RSCs.

app/page.tsx
import { unstable_serialize } from 'swr' // ✅ Disponível em server components
import { unstable_serialize as infinite_unstable_serialize } from 'swr/infinite' // ✅ Disponível em server components
🚫

Você não pode importar nenhuma outra API do SWR, pois elas não estão disponíveis em RSCs.

app/page.tsx
import useSWR from 'swr' // ❌ Isso não está disponível em components

Client Components

Você pode marcar seus componentes com a diretiva 'use client' ou importar o SWR de componentes do cliente, ambos os caminhos permitirão que você use os hooks de busca de dados do cliente SWR.

app/page.tsx
'use client'
import useSWR from 'swr'
 
export default Page() {
  const { data } = useSWR('/api/user', fetcher)
  return <h1>{data.name}</h1>
}

If you need to use SWRConfig to configure global settings in server components layout or page, creating a separate provider client component to setup the provider and configuration then use it in the server component pages.

Se você precisar usar SWRConfig para configurar as configurações globais em componentes do servidor layout ou page, crie um componente de provedor separado para configurar o provedor e a configuração e, em seguida, use-o nas páginas do componente do servidor.

app/swr-provider.tsx
'use client';
import { SWRConfig } from 'swr'
export const SWRProvider = ({ children }) => {
  return <SWRConfig>{children}</SWRConfig>
};
app/page.tsx
// This is still a server component
import { SWRProvider } from './swr-provider'
export default Page() {
  return (
    <SWRProvider>
      <h1>ola SWR</h1>
    </SWRProvider>
  )
}

Obtendo dados em Client-side

Se a sua página contém dados que atualizam frequentemente, e você não precisa pré-renderizar os dados, o SWR é perfeito e não precisa de configuração especial: apenas importe o useSWR e use o hook dentro de qualquer componente que use os dados.

Funciona assim:

  • Primeiro, imediatamente mostre a página sem dados. Você pode mostrar estados de carregamento para dados que estão faltando.
  • Então, busque os dados no lado do cliente e exiba-os quando estiver pronto.

Essa estratégia funciona bem para páginas de dashboard de usuário, por exemplo. Como a página do dashboard é uma página privada e específica do usuário, o SEO não é relevante e a página não precisa ser pré-renderizada. Os dados são atualizados com frequência, o que requer a busca de dados no momento da solicitação.

Pré-rendedrizando com dados padrão

Se a página precisa ser pré-renderizada, o Next.js suporta 2 formas de pré-renderização (opens in a new tab): Geração Estática (SSG) e Renderização Server-side (SSR).

Junto com o SWR, você pode pré-renderizar a página para SEO e também ter recursos como cache, revalidação, rastreamento de foco, refetching em intervalo no lado do cliente.

Você pode usar a opção fallback de SWRConfig para passar os dados pré-buscados como o valor inicial de todos os hooks SWR.

Por exemplo, com o getStaticProps:

 export async function getStaticProps () {
  // `getStaticProps` é executado no lado do servidor.
  const article = await getArticleFromAPI()
  return {
    props: {
      fallback: {
        '/api/article': article
      }
    }
  }
}
 
function Article() {
  // `data` estará sempre disponível, pois está em `fallback`.
  const { data } = useSWR('/api/article', fetcher)
  return <h1>{data.title}</h1>
}
 
export default function Page({ fallback }) {
  // Hooks SWR dentro do limites do `SWRConfig` usarão esses valores.
  return (
    <SWRConfig value={{ fallback }}>
      <Article />
    </SWRConfig>
  )
}

A página ainda é pré-renderizada. É amigável para SEO, rápida para responder, mas também totalmente alimentada pelo SWR no lado do cliente. Os dados podem ser dinâmicos e atualizados automaticamente ao longo do tempo.

💡

O componente Article irá renderizar os dados pré-gerados primeiro e, após a página ser hidratada, ele buscará novamente os dados mais recentes para mantê-los atualizados.

Chaves Complexas

useSWR podem ser usadas com chaves que são do tipo array ou function. Utilizar dados pré-obtidos com esses tipos de chaves requer serializar as chaves fallback usando o unstable_serialize.

import useSWR, { unstable_serialize } from 'swr'
 
export async function getStaticProps () {
  const article = await getArticleFromAPI(1)
  return {
    props: {
      fallback: {
        // chave de lista usando unstable_serialize()
        [unstable_serialize(['api', 'article', 1])]: article,
      }
    }
  }
}
 
function Article() {
  // usando uma chave de estilo de array.
  const { data } = useSWR(['api', 'article', 1], fetcher)
  return <h1>{data.title}</h1>
}
 
export default function Page({ fallback }) {
  return (
    <SWRConfig value={{ fallback }}>
      <Article />
    </SWRConfig>
  )
}