Skip to content

React Router 迁移 Next.js App Router 架构指南 ​

译注:本文翻译自 dev.to 平台作者 Digital dev 于 2026 年 9 月发布的文章《React Router to Next.js App Router: Navigating the Architectural Shift》,原文链接见文末。文章面向正在从 Vite + React Router 技术栈迁移至 Next.js App Router 的开发者,梳理了两套路由体系的核心差异与迁移中的常见问题。

多年来,React Router 一直是单页应用(SPA)路由事实上的标准方案。它提供了声明式、基于组件的路由方式,对 React 开发者而言相当自然。然而,随着生态整体向服务端渲染(SSR)与 Server Components 演进,许多团队开始转向 Next.js App Router。

从客户端侧的 BrowserRouter 迁移到 Next.js 14+ 的基于文件系统的路由,并不只是语法层面的变化,而是应用加载数据与管理状态方式的根本性转变。本文梳理这一迁移过程中的技术挑战,以及自动化手段如何简化流程。

核心差异 ​

声明式路由 vs. 文件系统路由 ​

在标准的 Vite + React Router 配置中,路由通常集中定义在单个文件(如 App.tsx)里:

jsx
<Routes>
  <Route path="/" element={<Home />} />
  <Route path="/dashboard" element={<Dashboard />} />
  <Route path="/profile/:id" element={<Profile />} />
</Routes>

而在 Next.js 中,文件夹结构本身就是路由。要复现上述配置,需要建立如下目录:

  • app/page.tsx(Home)
  • app/dashboard/page.tsx(Dashboard)
  • app/profile/[id]/page.tsx(Profile)

数据加载模式 ​

React Router 通常依赖 useEffect 或 loader 在组件挂载后(或挂载前)获取数据。Next.js 则鼓励直接在 Server Components 中使用 async/await 获取数据,从而减少嵌套客户端请求带来的“瀑布式”加载问题。

手动迁移的挑战 ​

对于大型 Vite 应用而言,手动迁移包含多个重复且易错的步骤:

  • Context Provider:需要将原本包裹整个应用的逻辑从 App.tsx 迁移到 Layout.tsx。
  • 链接与导航:将 react-router-dom 的 Link 替换为 next/link,将 useNavigate 替换为 useRouter。
  • 查询参数:把 React Router 的 useSearchParams 转换为 Next.js 的 useSearchParams,两者在只读状态上的 API 存在细微差异。
  • 静态资源:将图片从 public/ 或 src/assets/ 迁移,并确保路径在 Next.js 的 public 目录下正确解析。

对于希望跳过手动样板代码的开发者,诸如 ViteToNext.AI 之类的工具可以自动分析 React Router 路由树,并生成对应的 Next.js 目录结构与组件包装。

处理路由参数与 Hooks ​

迁移中最大的障碍之一是 Hook 行为的差异。

参数迁移

在 React Router 中,动态段通过如下方式获取:

js
const { id } = useParams();

在 Next.js App Router 中,params 作为 prop 传递给页面,或在 Client Components 中通过 useParams() 访问。

导航

Next.js 使用来自 next/navigation 的 useRouter。一个常见错误是从 next/router(旧的 Pages Router API)误导入。自动化工具会扫描 useNavigate 调用,并重写导入与函数签名,以匹配新 Hook 的要求。

Client Components 与 Server Components ​

默认情况下,app 目录下的所有文件都是 Server Components。如果原有的 React Router 组件使用了 useState、useEffect 或事件监听(如 onClick),则必须在文件顶部添加 'use client' 指令。

在迁移过程中,通常最好先将迁移后的组件标记为 Client Components,以确保功能保持一致,然后再逐步重构为 Server Components,以利用 Next.js 的性能优势。

结语 ​

从 React Router 迁移到 Next.js App Router,在 SEO、Core Web Vitals 与开发者体验方面都能带来显著收益。手动迁移需要深入理解文件系统架构与 Hook 重构,但理清两套体系之间的映射关系后,整个过程是可预期的。

优先关注结构性差异——尤其是从集中式 Routes 配置转向嵌套文件夹结构——即可在保留原有 Vite 应用逻辑的前提下完成技术栈现代化。

原文链接 ​

https://dev.to/digitaldev/react-router-to-nextjs-app-router-navigating-the-architectural-shift-1o2l