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

Rocketseat

Conheça o Rocketseat Para Empresas
Oferecemos soluções personalizadas para empresas de todos os portes.
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 splittingautomá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 doserver loadere 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:
- Client-Side Rendering (CSR): o modelo clássico de SPA, ótimo para dashboards e áreas logadas.
- Server-Side Rendering (SSR): renderização no servidor a cada requisição, ideal para conteúdo dinâmico que precisa de SEO.
- 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:
- Atualize os
imports: troque todas as importações de"react-router-dom"para"react-router".
- Refatore as APIs removidas: substitua as chamadas a
json()edefer()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 umloader 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 safetye 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.
Artigos_
Explore conteúdos relacionados
Descubra mais artigos que complementam seu aprendizado e expandem seu conhecimento.
NewsletterReceba conteúdos inéditos e novidades gratuitamente