React 自己没有路由
React 是 view 库,路由是社区方案。常见 4 个:
| 方案 | 类型 | 谁主用 |
|---|---|---|
| Next.js App Router | SSR/SSG/RSC | 新项目首选 |
| React Router v6/v7 | SPA / SSR | 已有大型 SPA、不想换框架 |
| TanStack Router | SPA / TS 优先 | 类型最严的 SPA |
| Remix | SSR / Web fundamentals | 强调 web 标准的全栈 |
React Router(SPA 模式最常见)
import { BrowserRouter, Routes, Route } from 'react-router-dom';
<BrowserRouter>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/users/:id" element={<UserPage />} />
<Route path="*" element={<NotFound />} />
</Routes>
</BrowserRouter>
注意:v7 起 React Router 也支持 SSR(前身是 Remix)。如果新项目还想用 React Router,看 v7 framework mode。
数据加载(loader)
v6.4+ 的 loader:
const router = createBrowserRouter([
{
path: '/users/:id',
loader: async ({ params }) => fetch(`/api/user/${params.id}`),
element: <UserPage />,
},
]);
页面进来前自动拉数据,避免 "loading flash"。
Next.js App Router(推荐新项目)
app/
├── page.tsx → /
├── about/page.tsx → /about
└── users/[id]/page.tsx → /users/:id
文件即路由,无需注册。详见 react-quick 09。
嵌套布局
app/
├── layout.tsx → 根布局
└── dashboard/
├── layout.tsx → /dashboard/* 共享
├── page.tsx
└── settings/page.tsx
布局不重渲染——切换 settings 和 page 时 dashboard layout 保持。
客户端导航
import Link from 'next/link';
import { useRouter } from 'next/navigation';
<Link href="/about">关于</Link>
const router = useRouter();
router.push('/users/1');
TanStack Router
import { createRouter, createRoute, createRootRoute } from '@tanstack/react-router';
const rootRoute = createRootRoute();
const userRoute = createRoute({
getParentRoute: () => rootRoute,
path: '/users/$id',
component: UserPage,
});
优势:TypeScript 类型推断到达路径参数、search params 都强类型——React Router / Next.js 在这方面较弱。
劣势:生态小、学习曲线陡、文档不如另外两个友好。
Remix(独立产品 → 被 React Router v7 吸收)
Remix 强调"Web 基本面"——HTML 表单、HTTP 缓存、nested routes。从 React Router v7 开始,Remix 团队把它合入 React Router framework mode。
新项目要 SSR 路由:React Router v7 framework mode 或 Next.js,二选一。
SPA vs SSR 路由的根本区别
| SPA 路由(React Router classic) | SSR 路由(Next.js / Remix) | |
|---|---|---|
| 首屏 | 空 HTML + JS bundle 加载后渲染 | 服务器渲染好 HTML |
| SEO | 差(爬虫看到空页) | 好 |
| 数据预加载 | 客户端拉 | 服务端拉,HTML 已带 |
| 部署 | 任意 CDN 静态托管 | 需要 Node / Edge 运行时 |
如果SEO 不重要(内部工具、登录后 dashboard),SPA + React Router 完全够用,部署简单(CDN 一扔)。
如果SEO 重要(marketing 站、博客、电商),用 SSR 框架。
实战选型
- 新项目 + 要 SEO + 想要全套(路由 + SSR + 服务端逻辑)→ Next.js
- 新项目 + 内部工具 / dashboard → React Router v6 (SPA) 或 Vite + 任意路由
- 已有 React Router 项目要升级到 SSR → React Router v7 framework mode
- TypeScript 强迫症 → TanStack Router
- 全栈类型安全 + 不想要框架感太重 → tRPC + React Router
通用模式
无论用哪个,几个能力是路由方案必须的:
- 嵌套路由(nested routes)
- 路径参数(
/users/:id) - search params(
?q=foo) - 路由守卫 / 重定向
- 加载中状态(Suspense / loading.tsx)
- 错误边界(error.tsx)
- 代码分割(按路由拆 bundle)
选型时拿这些去验证。
→ 下一篇 表单实战