You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

React Native Monorepo项目中Expo Router跨模块导航的实现方法

React Native Monorepo项目中Expo Router跨模块导航的实现方法

看起来你是在基于Monorepo结构的Expo项目里,想从主App模块跳转到packages/my-auth包内的登录页面对吧?我来一步步给你讲清楚怎么实现,帮你搞定跨模块导航的问题:

一、先确认并修正项目结构(梳理路径)

首先你的项目结构应该是这样的(我修正了你拼写错误的sceenscreen):

- 项目根目录
  - 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跳转

这种方式更直接,适合需要灵活控制的场景:

  1. 先配置TypeScript路径映射,避免冗长的相对路径
    在主项目的tsconfig.json里添加paths配置,把@my-auth映射到packages/my-auth
{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "@my-auth/*": ["./packages/my-auth/*"]
    }
  }
}
  1. 在主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目录下创建代理页面:

  1. 在主项目根目录创建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 />;
}
  1. 同样的,你可以创建app/register.tsx作为注册页面的代理
  2. 之后在主页面直接用路径跳转即可:
<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

火山引擎 最新活动