Chapter 01

为什么用 Expo Router

React Navigation 把 RN 的导航撑起来这么多年,为什么社区还要搞文件路由?什么场景该用 Expo Router,什么场景不该?本章把地形铺清。

React Navigation 的老毛病

React Navigation 是 RN 生态事实标准,但它的 API 风格源于 2017 年,很多毛病一直没彻底治:

路由配置集中在代码
createNativeStackNavigator 一个文件列 40 个 screen,新人一眼懵。一个页面要新增,改导航配置 + 写组件 + 导出,至少三处。
类型不安全
路由名、参数要手动维护 RootStackParamList,改个 key 能崩半个项目却不报编译错。
Deep Link 手工配
linking 对象里一条条写 URL 映射,App 一大就忘更新,产品经理发来的营销链打不开。
Web 支持割裂
React Navigation Web 能用但 URL 不自然,SEO、分享都别扭。想和 Next.js 一样"/products/123"需要额外配置。

文件路由的启发

Next.js App Router、Remix、SvelteKit、Nuxt——2022 起 Web 框架集体收敛到"文件即路由"。Expo 团队 2023 年把这套搬进 RN,就是 Expo Router。

传统 React Navigation Expo Router ───────────────────── ──────────────── src/ app/ ├─ App.tsx ├─ _layout.tsx ← Root │ <NavigationContainer> ├─ index.tsx ← / │ <Stack.Navigator> ├─ settings.tsx ← /settings │ <Stack.Screen ├─ (tabs)/ │ name="Home" │ ├─ _layout.tsx ← Tabs │ component={Home}/> │ ├─ home.tsx ← /home │ ...40 行... │ └─ profile.tsx ← /profile └─ screens/ └─ products/ ├─ Home.tsx └─ [id].tsx ← /products/:id └─ Products.tsx

Expo Router 解决的问题

痛点React NavigationExpo Router v4
路由配置代码集中文件系统
URL ↔ 屏幕映射手写 linking自动派生
类型安全手写 ParamListTyped Routes 自动生成
Web 三端支持但别扭一等公民
SEO / 分享基于真实 URL
代码分割手写 lazy自动懒加载
底层React NavigationReact Navigation(包了一层)
不是替代,是包装
Expo Router 底层仍然是 React Navigation,所有 Screen options、手势、transition 都能原样用。你可以把它理解为"给 React Navigation 加了 Next.js 的开发体验",不是推翻重做。

Expo Router v4 新东西

SDK 52 对应 Expo Router v4,相较 v3 的亮点:

React 19 兼容
配合 New Architecture(Fabric + TurboModules)默认开启,性能提升 20-30%。
Typed Routes GA
app.json 开一行 experiments.typedRoutes: true,href / router.push 全链路类型安全。
Server Functions(beta)
页面里写 "use server",可以直接调后端,接口无需手写——这是 Web 世界的概念终于进 RN。
Modals 与 Sheet
原生模态、iOS Form Sheet、半高弹窗都能用路由表达,不再手动管 visible state。
Web Static Output
一条 npx expo export -p web 产出静态站,直接扔 Vercel/CF Pages。

什么时候该用

推荐场景

什么时候别用

和 React Native Navigation(wix)对比

生态状态(2026 年初)

本章小结