React Native Monorepo项目中Expo Router跨模块导航的实现方法
React Native Monorepo项目中Expo Router跨模块导航的实现方法
看起来你是在基于Monorepo结构的Expo项目里,想从主App模块跳转到packages/my-auth包内的登录页面对吧?我来一步步给你讲清楚怎么实现,帮你搞定跨模块导航的问题:
一、先确认并修正项目结构(梳理路径)
首先你的项目结构应该是这样的(我修正了你拼写错误的sceen为screen):
- 项目根目录 - src - index.tsx # 主App入口 - packages - my-auth - src - screen - login.tsx # 登录页面 - register.tsx # 注册页面
二、配置Expo Router,让它识别跨模块页面
Expo Router默认只扫描主项目根目录下的文件,所以我们需要修改主项目的app.json(或app.config.js),告诉它要包含my-auth包下的文件:
{ "expo": { "name": "MyMainApp", "slug": "my-main-app", // 其他基础配置... "extra": { "expoRouter": { "include": [ "./src/**/*", "./packages/my-auth/src/**/*" ], "assets": [ "./packages/my-auth/assets/**/*" // 如果my-auth有静态资源,也需要配置 ] } } } }
这个配置的作用是让Expo Router的扫描范围覆盖主项目和my-auth包的所有文件,这样路由系统才能“看到”包内的登录页面。
三、两种跨模块导航的实现方式
方式1:直接导入包内组件,用Link或useRouter跳转
这种方式更直接,适合需要灵活控制的场景:
- 先配置TypeScript路径映射,避免冗长的相对路径
在主项目的tsconfig.json里添加paths配置,把@my-auth映射到packages/my-auth:
{ "compilerOptions": { "baseUrl": ".", "paths": { "@my-auth/*": ["./packages/my-auth/*"] } } }
- 在主App页面(比如
src/index.tsx)中导入登录组件并跳转
// 主项目src/index.tsx import { View, Text, StyleSheet } from 'react-native'; import { Link, useRouter } from 'expo-router'; // 用配置好的别名导入登录组件 import LoginScreen from '@my-auth/src/screen/login'; export default function HomePage() { // 编程式导航示例 const router = useRouter(); const goToRegister = () => { router.push('@my-auth/src/screen/register'); }; return ( <View style={styles.container}> {/* 用Link组件跳转 */} <Link href={{ pathname: '/login' }} asChild> <Text style={styles.linkText}>跳转到登录页面</Text> </Link> {/* 编程式跳转示例 */} <Text style={styles.linkText} onPress={goToRegister}> 跳转到注册页面 </Text> </View> ); } const styles = StyleSheet.create({ container: { flex: 1, justifyContent: 'center', alignItems: 'center', gap: 20, }, linkText: { fontSize: 18, color: '#2196F3', }, });
方式2:用代理页面适配Expo Router的文件系统路由
如果你更习惯Expo Router的文件系统路由规则(比如访问/login就跳转到登录页),可以在主项目的app目录下创建代理页面:
- 在主项目根目录创建
app/login.tsx(Expo Router的默认路由目录是app)
// 主项目app/login.tsx // 导入my-auth的登录组件并渲染 import LoginScreen from '@my-auth/src/screen/login'; export default function LoginProxyPage() { return <LoginScreen />; }
- 同样的,你可以创建
app/register.tsx作为注册页面的代理 - 之后在主页面直接用路径跳转即可:
<Link href="/login">跳转到登录页面</Link>
四、Monorepo基础配置检查(避免依赖解析错误)
确保你的Monorepo已经正确配置工作区,在根目录的package.json里添加:
{ "workspaces": [ "packages/*" ] }
同时,在packages/my-auth/package.json里配置正确的包名和导出规则:
{ "name": "@my-auth", "main": "src/screen/login.tsx", "exports": { "./*": "./src/*" } }
注意事项
- 确保你使用的是最新版的Expo Router,旧版本对Monorepo的支持可能有局限
- 如果遇到TypeScript路径报错,可以重启TypeScript服务(VSCode里按
Ctrl+Shift+P,选择TypeScript: Restart TS Server) - 若跳转后出现资源加载问题,检查
app.json里的assets配置是否包含了my-auth的资源目录
如果还有具体的报错或者特殊场景,欢迎补充信息再提问哦!
内容来源于stack exchange




