Expo 迁移计划
迁移策略:使用 Expo Bare Workflow
由于项目包含大量自定义原生模块和不兼容的依赖,建议使用 Expo Bare Workflow 进行迁移。
第一阶段:环境准备
1. 安装 Expo CLI
|
|
2. 创建备份
|
|
3. 分析不兼容的依赖
需要替换的依赖:
react-native-quick-sqlite→expo-sqlitereact-native-fs→expo-file-systemreact-native-device-info→expo-device+expo-applicationreact-native-vision-camera→expo-camerareact-native-image-picker→expo-image-picker@react-native-async-storage/async-storage→@react-native-async-storage/async-storage(兼容)react-native-document-picker→expo-document-pickerreact-native-share→expo-sharing
保持不变的依赖:
@react-navigation/*(完全兼容)react-redux,@reduxjs/toolkit(完全兼容)react-native-svg(兼容)react-native-reanimated(兼容)react-native-gesture-handler(兼容)
需要特殊处理的:
react-native-paper(需要确保版本兼容)pouchdb*相关包 (可能需要调整)- 自定义RFID模块 (需要保留原生代码)
第二阶段:初始化 Expo Bare Workflow
1. 在新目录创建 Expo 项目
|
|
2. 配置 app.json/app.config.js
基于当前的 app.json 和项目需求配置 Expo。
第三阶段:迁移源代码
1. 复制核心应用代码
app/目录下的所有 TypeScript/JavaScript 文件- 保持目录结构不变
2. 更新导入语句
- 替换不兼容依赖的导入
- 更新原生模块的引用
3. 迁移配置文件
babel.config.jsmetro.config.js- TypeScript 配置
第四阶段:处理原生模块
1. 保留自定义原生模块
android/app/src/main/java/vg/zeta/app/inventory/RFIDWithUHFUARTModule.javaandroid/app/src/main/java/vg/zeta/app/inventory/RFIDWithUHFBLEModule.java- iOS 相关的 RFID 模块
2. 创建 Expo Config Plugin
为自定义原生模块创建配置插件,确保 Expo 构建时包含这些模块。
第五阶段:依赖替换
SQLite 迁移
|
|
文件系统迁移
|
|
相机功能迁移
|
|
第六阶段:构建配置
1. EAS Build 配置
创建 eas.json 配置文件,配置 iOS 和 Android 构建。
2. 原生代码集成
确保自定义原生模块在 EAS Build 中正确编译。
风险评估
高风险项:
- RFID 原生模块 - 需要确保在 Expo 环境中正常工作
- PouchDB 集成 - 可能需要调整数据库相关代码
- 构建配置 - 复杂的原生依赖可能导致构建失败
中风险项:
- 第三方库兼容性 - 部分库可能需要版本调整
- 性能影响 - Expo 可能带来轻微性能开销
低风险项:
- UI 组件 - React Navigation 和 React Native Paper 兼容性好
- 状态管理 - Redux 相关代码无需更改
建议的迁移时间线
- 第1周:环境准备和依赖分析
- 第2-3周:创建 Expo Bare 项目并迁移核心代码
- 第4-5周:处理依赖替换和原生模块集成
- 第6周:测试和调试
- 第7周:构建配置和部署测试
备选方案
如果 Expo Bare Workflow 迁移遇到重大障碍,可以考虑:
- 部分迁移:仅将 UI 部分迁移到 Expo,保留原生功能在原项目
- 延迟迁移:等待 Expo 对某些依赖的支持改善
- 保持现状:继续使用纯 React Native,但引入 Expo SDK 中兼容的部分