如何将React Native裸项目转为Expo项目?实操遇阻求助
裸React Native项目迁移到Expo(PC端开发安卓)
你的问题核心是裸RN项目直接复制到Expo项目会因为依赖兼容性、原生配置差异导致错误,以下是分步解决的正确迁移流程:
一、先梳理依赖兼容性(关键!)
你的项目里很多裸RN依赖无法直接在Expo Go中运行,必须替换为Expo官方支持的对应包,核心替换清单:
| 原裸RN依赖 | Expo替代方案 |
|---|---|
@react-native-firebase/* | expo-firebase-*(如expo-firebase-app、expo-firebase-auth等) |
react-native-camera | expo-camera |
react-native-image-crop-picker | expo-image-picker + expo-image-manipulator |
react-native-config | expo-constants(或配合expo-build-properties管理环境变量) |
react-native-linear-gradient | expo-linear-gradient |
react-native-maps | expo-maps |
react-native-splash-screen | expo-splash-screen |
react-native-fast-image | expo-image |
react-native-permissions | 对应Expo包自带权限(如expo-camera、expo-image-picker内置权限申请) |
react-native-push-notification | expo-notifications |
@react-native-community/geolocation | expo-location |
react-native-fs | expo-file-system |
react-native-share | expo-sharing |
注:iOS专属依赖(如@invertase/react-native-apple-authentication)在PC开发安卓时可直接忽略,无需安装
二、分步迁移流程
1. 初始化适配的Expo项目
根据原项目是否使用TypeScript,选择对应模板:
# TypeScript项目(你的项目包含ts依赖) expo init expo-migrated-project --template blank-typescript # JavaScript项目 expo init expo-migrated-project --template blank
2. 替换并安装兼容依赖
删除新项目默认的package.json依赖,将原项目依赖替换为上述Expo替代包后安装,同时确保版本与当前Expo SDK兼容。例如:
# 安装核心Expo替代依赖 npm install expo-camera expo-firebase-app expo-firebase-auth expo-image-picker expo-image-manipulator expo-linear-gradient expo-maps expo-splash-screen expo-image expo-notifications expo-location expo-file-system expo-sharing # 保留Expo支持的原依赖(如导航、Redux等) npm install @react-navigation/native @react-navigation/stack react-native-vector-icons react-redux redux-persist
3. 迁移代码与配置
- 复制src文件夹:直接将原项目
src/复制到新项目根目录。 - 修改入口文件:复制原项目App内容后,批量替换导入语句,比如:
// 原导入 import Camera from 'react-native-camera'; // 替换为 import { Camera } from 'expo-camera'; - Firebase与环境配置:
- 无需复制
google-services.json到android文件夹,改为在app.json的expo.plugins中配置:{ "expo": { "plugins": [ [ "expo-firebase-app", { "googleServicesFile": "./src/config/env/dev/google-services.json" } ] ] } } - 环境变量改用
expo-constants读取,或在eas.json中配置不同环境的变量。
- 无需复制
- 权限配置:原项目的权限声明移到
app.json的expo.permissions中,比如:{ "expo": { "permissions": [ "CAMERA", "MEDIA_LIBRARY", "MEDIA_LIBRARY_ADD_ONLY", "LOCATION" ] } }
4. 适配API差异
部分Expo包的API与原裸RN包不同,需要调整代码逻辑:
- 比如
expo-image-picker的图片选择逻辑和react-native-image-crop-picker不同,需参考Expo文档修改。 expo-notifications的推送配置逻辑与react-native-push-notification差异较大,需重新适配。
5. 运行项目
- 基础包可直接用Expo Go运行:
npx expo start - 若使用了需要原生构建的包(如expo-firebase),需构建自定义开发客户端:
npx expo run:android
三、常见问题排查
- 版本冲突:执行
npx expo doctor检查依赖兼容性,根据提示修复版本问题。 - 原生模块报错:确认所有依赖均为Expo支持的包,若有无法替代的裸RN模块,需使用EAS构建自定义客户端。
- 配置不生效:检查
app.json的Expo配置是否正确,尤其是插件、权限部分。
内容的提问来源于stack exchange,提问作者Archie
相关产品推荐
相关产品推荐

