Expo 迁移计划

迁移策略:使用 Expo Bare Workflow

由于项目包含大量自定义原生模块和不兼容的依赖,建议使用 Expo Bare Workflow 进行迁移。

第一阶段:环境准备

1. 安装 Expo CLI

1
npm install -g @expo/cli

2. 创建备份

1
2
# 创建项目备份
cp -r App App_backup

3. 分析不兼容的依赖

需要替换的依赖:

  • react-native-quick-sqliteexpo-sqlite
  • react-native-fsexpo-file-system
  • react-native-device-infoexpo-device + expo-application
  • react-native-vision-cameraexpo-camera
  • react-native-image-pickerexpo-image-picker
  • @react-native-async-storage/async-storage@react-native-async-storage/async-storage (兼容)
  • react-native-document-pickerexpo-document-picker
  • react-native-shareexpo-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 项目

1
2
cd ..
npx create-expo-app InventoryExpo --template bare-minimum

2. 配置 app.json/app.config.js

基于当前的 app.json 和项目需求配置 Expo。

第三阶段:迁移源代码

1. 复制核心应用代码

  • app/ 目录下的所有 TypeScript/JavaScript 文件
  • 保持目录结构不变

2. 更新导入语句

  • 替换不兼容依赖的导入
  • 更新原生模块的引用

3. 迁移配置文件

  • babel.config.js
  • metro.config.js
  • TypeScript 配置

第四阶段:处理原生模块

1. 保留自定义原生模块

  • android/app/src/main/java/vg/zeta/app/inventory/RFIDWithUHFUARTModule.java
  • android/app/src/main/java/vg/zeta/app/inventory/RFIDWithUHFBLEModule.java
  • iOS 相关的 RFID 模块

2. 创建 Expo Config Plugin

为自定义原生模块创建配置插件,确保 Expo 构建时包含这些模块。

第五阶段:依赖替换

SQLite 迁移

1
2
3
4
5
// 之前
import { QuickSQLite } from 'react-native-quick-sqlite';

// 之后  
import * as SQLite from 'expo-sqlite';

文件系统迁移

1
2
3
4
5
// 之前
import RNFS from 'react-native-fs';

// 之后
import * as FileSystem from 'expo-file-system';

相机功能迁移

1
2
3
4
5
// 之前
import { launchCamera } from 'react-native-image-picker';

// 之后
import * as ImagePicker from 'expo-image-picker';

第六阶段:构建配置

1. EAS Build 配置

创建 eas.json 配置文件,配置 iOS 和 Android 构建。

2. 原生代码集成

确保自定义原生模块在 EAS Build 中正确编译。

风险评估

高风险项:

  1. RFID 原生模块 - 需要确保在 Expo 环境中正常工作
  2. PouchDB 集成 - 可能需要调整数据库相关代码
  3. 构建配置 - 复杂的原生依赖可能导致构建失败

中风险项:

  1. 第三方库兼容性 - 部分库可能需要版本调整
  2. 性能影响 - Expo 可能带来轻微性能开销

低风险项:

  1. UI 组件 - React Navigation 和 React Native Paper 兼容性好
  2. 状态管理 - Redux 相关代码无需更改

建议的迁移时间线

  • 第1周:环境准备和依赖分析
  • 第2-3周:创建 Expo Bare 项目并迁移核心代码
  • 第4-5周:处理依赖替换和原生模块集成
  • 第6周:测试和调试
  • 第7周:构建配置和部署测试

备选方案

如果 Expo Bare Workflow 迁移遇到重大障碍,可以考虑:

  1. 部分迁移:仅将 UI 部分迁移到 Expo,保留原生功能在原项目
  2. 延迟迁移:等待 Expo 对某些依赖的支持改善
  3. 保持现状:继续使用纯 React Native,但引入 Expo SDK 中兼容的部分