Como migrar para o React Router v7 e usar seus novos recursos (SSR, Type Safety)

Rocketseat

Rocketseat

5 min de leitura
react
Faaala, dev! Se você respira React no dia a dia, sabe que o ecossistema está sempre em movimento. Mas de vez em quando, surge uma mudança que não é apenas uma atualização, é uma transformação. E é exatamente isso que está acontecendo com o React Router v7.
Já imaginou ter o poder do Server-Side Rendering (SSR), type safety de primeira e otimizações de performance automáticas, sem precisar sair da biblioteca de roteamento que você já conhece e confia? Pois é, o React Router v7 chegou para mudar o jogo, deixando de ser "apenas um roteador" para se tornar um verdadeiro framework full-stack.
Se você está se perguntando o que isso significa, como migrar seu projeto do v6 sem quebrar tudo, e quais os novos recursos que você ganha com essa versão, se liga! Preparamos este material completo para desbravar cada detalhe do v7.
Bora codar e impulsionar seus apps para o próximo nível?

De biblioteca a framework full-stack

Até hoje, pensávamos no React Router como o especialista em gerenciar rotas no navegador (client-side). A versão 7 expande esse horizonte de forma impressionante, abraçando também o lado do servidor.

O que é e como funciona o "framework mode"?

A grande estrela dessa nova versão é o "framework mode". É como um conjunto de funcionalidades avançadas que você pode habilitar para construir aplicações completas e performáticas. Ao ativá-lo, você ganha acesso a recursos que antes exigiriam outras ferramentas ou configurações complexas:
  • Server-Side Rendering (SSR) nativo: melhore o SEO e a percepção de velocidade renderizando suas páginas no servidor.
  • Pré-renderização estática: gere HTML estático em tempo de build para páginas como landing pages ou posts de blog.
  • Code splitting automático: a biblioteca otimiza seu bundle de forma inteligente, dividindo o código por rota para um carregamento mais rápido.
  • Streaming com Suspense: aproveite o poder do React 18+ para criar interfaces mais fluidas e responsivas.
Para começar, basta um arquivo de configuração simples:
// react-router.config.ts import type { Config } from "@react-router/dev/config"; export default { ssr: true, // Habilita Server-Side Rendering appDirectory: "src", async prerender() { // Rotas que serão pré-renderizadas como HTML estático return ["/", "/about", "/contact"]; }, } satisfies Config;

As mudanças de arquitetura que você precisa dominar

Para sustentar essa evolução, algumas peças-chave da arquitetura foram repensadas. Dominar esses conceitos tornará sua jornada muito mais tranquila.

Um pacote para todos: react-router-dom agora é react-router

Finalmente, uma simplificação que a gente pedia! O React Router v7 unifica tudo em um único pacote: react-router.
Antes (v6):
npm install react-router-dom
Depois (v7):
npm install react-router
Isso significa que a maioria dos seus imports virá de "react-router". Para funcionalidades específicas do DOM, como o RouterProvider, o caminho agora é "react-router/dom".

Loaders e actions aprimorados

Os loaders e actions, que já eram ótimos na v6.4, ficaram ainda mais poderosos. A grande novidade é a separação entre server loaders e client loaders, permitindo um controle fino sobre onde sua lógica de carregamento de dados executa.
  • loader: roda apenas no servidor. Perfeito para buscar dados de um banco ou usar chaves de API secretas.
  • clientLoader: roda apenas no navegador, recebe os dados do server loader e pode enriquecê-los com chamadas de API no lado do cliente.
// Server loader (roda apenas no servidor) export async function loader({ params }: Route.LoaderArgs) { return await getProductFromDatabase(params.id); } // Client loader (roda apenas no browser, tem prioridade) export async function clientLoader({ serverLoader, params }: Route.ClientLoaderArgs) { const serverData = await serverLoader(); const additionalData = await fetchClientData(params.id); return { ...serverData, ...additionalData }; }

Recursos que vão fazer a diferença no seu código

Com a nova arquitetura, o v7 entrega soluções elegantes para desafios comuns do dia a dia.

Adeus, any! Type safety automática com TypeScript

Se você é fã de TypeScript, prepare-se para sorrir. O React Router v7 introduz um sistema que gera tipos automaticamente para os parâmetros de rota, os dados retornados pelos loaders e muito mais. É o fim do any e da tipagem manual nessas áreas!
Com uma pequena configuração no tsconfig.json, a mágica acontece:
// tsconfig.json { "include": [".react-router/types/**/*"], "compilerOptions": { "rootDirs": [".", "./.react-router/types"] } }
E seu código fica assim, seguro e autocompletável:
import type { Route } from "./+types/product"; export async function loader({ params }: Route.LoaderArgs) { // params.id é automaticamente tipado como string! return { productName: await fetchProduct(params.id) }; } export default function Component({ loaderData }: Route.ComponentProps) { // loaderData.productName tem o tipo inferido corretamente! return <h1>{loaderData.productName}</h1>; }

CSR, SSR e pré-renderização estática na prática

O v7 te dá liberdade total para escolher a estratégia de renderização ideal para cada parte da sua aplicação, podendo combinar todas no mesmo projeto:
  1. Client-Side Rendering (CSR): o modelo clássico de SPA, ótimo para dashboards e áreas logadas.
  1. Server-Side Rendering (SSR): renderização no servidor a cada requisição, ideal para conteúdo dinâmico que precisa de SEO.
  1. Pré-renderização estática: gera HTML puro no build, perfeito para páginas de marketing e blogs, garantindo performance máxima.

code splitting automático por rota

Otimizar o tamanho do bundle inicial é crucial. O React Router v7 faz isso por você automaticamente, criando "chunks" de JavaScript separados para cada rota. Isso significa que a pessoa usuária baixa apenas o código da página que está acessando, resultando em melhor performance de carregamento inicial comparado ao v6.

Roteamento nativo baseado em arquivos

O v7 também oferece suporte nativo ao file-based routing, sem necessidade de pacotes adicionais, através da configuração do framework mode. Inspirado em frameworks como Next.js, é uma ótima alternativa para organizar projetos com muitas rotas de forma visual e intuitiva.

Migração do v6 para o v7 sem dor de cabeça

Bora para a prática! A migração foi pensada para ser gradual.

Habilitando as future flags para uma transição segura

Antes de tudo, no seu projeto com v6, habilite as future flags. Elas ativam o comportamento do v7, permitindo que você corrija possíveis problemas antes mesmo de atualizar o pacote.
<BrowserRouter future={{ v7_relativeSplatPath: true, v7_startTransition: true, v7_fetcherPersist: true, v7_normalizeFormMethod: true, v7_partialHydration: true, v7_skipActionErrorRevalidation: true, }} />

Atualizando as dependências do projeto

Agora, vamos atualizar os pacotes.
# Remover o pacote antigo npm uninstall react-router-dom # Instalar o React Router v7 npm install react-router@latest

Ajustando os imports e as APIs removidas (json, defer)

Com o novo pacote instalado, é hora de ajustar o código:
  1. Atualize os imports: troque todas as importações de "react-router-dom" para "react-router".
  1. Refatore as APIs removidas: substitua as chamadas a json() e defer() pelo retorno direto de objetos e promises. O v7 simplificou a API para se alinhar melhor aos padrões da web.

Recursos avançados

Após a migração, você pode começar a usar os novos recursos.

Error Boundaries por rota para um código mais robusto

Agora é possível definir um componente de erro (errorElement) para cada rota. Se um
loader falhar, em vez de quebrar a aplicação inteira, apenas a área da rota afetada renderiza a UI de erro, tornando seu app muito mais resiliente.
const routes = [ { path: "/products/:id", element: <Product />, errorElement: <ProductError />, // UI de erro para esta rota loader: productLoader, } ];

Melhorando a UX com Streaming e Suspense

Use Suspense para renderizar o conteúdo crítico de uma página imediatamente, enquanto dados mais demorados são carregados em segundo plano. Isso melhora drasticamente a percepção de performance para o usuário final, especialmente em conexões lentas.

E agora? Quando vale a pena migrar?

✅ Bora migrar se:
  • Seu projeto precisa de SSR ou performance e você não quer adicionar a complexidade de outro framework.
  • Seu time valoriza type safety e quer reduzir o boilerplate no TypeScript.
  • Você está começando um projeto novo e quer usar a tecnologia mais moderna do ecossistema React.
⚠️ Talvez seja melhor esperar se:
  • Sua aplicação em v6 está estável e não teria grandes ganhos com os novos recursos.
  • Seu time tem dependências críticas em APIs que foram removidas e a refatoração seria muito custosa.
  • Você não tem tempo para testar adequadamente os impactos da migração no momento.

Seu próximo nível no roteamento React

Dominar o React Router v7 é um passo fundamental para construir as aplicações que o mercado de tecnologia procura. Se você se empolgou com o poder do SSR nativo, da type safety automática e das otimizações que esta nova versão oferece, imagine aplicar tudo isso em projetos reais e complexos.
Na nossa Formação Completa em React, transformamos essa teoria em prática. A gente vai muito mais fundo, do zero ao avançado, para que você não apenas entenda, mas domine as ferramentas que te colocarão na vanguarda do desenvolvimento. Vamos juntos para o próximo nível!
 

Conheça o Rocketseat Para Empresas

Oferecemos soluções personalizadas para empresas de todos os portes.

Rocketseat

Rocketseat

Ecossistema de educação contínua referência em programação e Inteligência Artificial.

Artigos_

Explore conteúdos relacionados

Descubra mais artigos que complementam seu aprendizado e expandem seu conhecimento.

Imagem contendo uma carta e um símbolo de check
NewsletterReceba conteúdos inéditos e novidades gratuitamente
Mês do programador na Rocketseat

Válido por tempo limitado

Aprenda as tecnologias e habilidades mais valorizadas no mercado dev