Expo弹出的React Native TS应用运行报node_modules语法错误
问题说明
从Expo弹出的React Native 0.68.2 TypeScript项目,编译流程正常但Android模拟器运行时报错,当前项目依赖如下:
"dependencies": { "@emotion/native": "^11.0.0", "@emotion/react": "^11.7.1", "@react-native-async-storage/async-storage": "^1.17.6", "@react-native-community/datetimepicker": "4.0.0", "@react-navigation/bottom-tabs": "^6.0.5", "@react-navigation/native": "^6.0.2", "@react-navigation/native-stack": "^6.1.0", "@types/jest": "^28.1.4", "@types/react-test-renderer": "^18.0.0", "axios": "^0.24.0", "dayjs": "^1.10.7", "expo-location": "~14.0.1", "lottie-react-native": "5.0.1", "mobx": "^6.3.12", "mobx-react-lite": "^3.2.3", "moment": "^2.29.1", "react": "17.0.2", "react-dom": "17.0.2", "react-hook-form": "^7.22.5", "react-native": "0.68.2", "react-native-elements": "^3.4.2", "react-native-map-clustering": "^3.4.2", "react-native-maps": "0.29.4", "react-native-qrcode-svg": "^6.1.2", "react-native-raw-bottom-sheet": "^2.2.0", "react-native-safe-area-context": "4.3.1", "react-native-screens": "~3.10.1", "react-native-svg": "^12.3.0", "react-native-web": "0.17.1", "rn-credit-card": "^0.1.1" }
报错截图参考:
根因判断
报错核心是Expo模块运行时环境缺失,属于Expo弹出为裸工作流后的典型配置遗漏:弹出流程不会自动补全Expo模块在原生端的适配逻辑,直接引入expo-location这类Expo生态库时,Android端无法找到对应的原生模块实现,就会抛出运行时错误。
修复步骤
- 安装Expo核心运行时依赖:在项目根目录执行
npx install-expo-modules@45,对应React Native 0.68.2匹配的Expo SDK 45版本,该命令会自动修改Android端Gradle配置、MainApplication入口逻辑,补全Expo模块的加载环境。执行完成后执行yarn add expo@45补全核心JS层依赖。 - 清理构建缓存:进入android目录执行
./gradlew clean,删除之前编译生成的旧缓存文件,避免旧配置干扰新的构建流程。 - 校验
MainApplication.java配置:打开android/app/src/main/java/[你的应用包名]/MainApplication.java,确认ReactNativeHost实例已被Expo提供的Wrapper包裹,核心配置如下:
import expo.modules.ReactNativeHostWrapper; public class MainApplication extends Application implements ReactApplication { private final ReactNativeHost mReactNativeHost = new ReactNativeHostWrapper( this, new ReactNativeHost(this) { @Override public boolean getUseDeveloperSupport() { return BuildConfig.DEBUG; } @Override protected List<ReactPackage> getPackages() { List<ReactPackage> packages = new PackageList(this).getPackages(); return packages; } @Override protected String getJSMainModuleName() { return "index"; } } ); @Override public ReactNativeHost getReactNativeHost() { return mReactNativeHost; } // 其余生命周期方法保持原有逻辑即可 }
- 补全定位权限:打开
android/app/src/main/AndroidManifest.xml,在manifest节点下添加expo-location所需的权限声明:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
- 重新构建安装:回到项目根目录执行
yarn android,重新打包安装到模拟器即可,不要复用之前已经安装到模拟器的旧APK。
避坑提示
- 所有Expo生态下的依赖版本必须和当前项目对齐的Expo SDK版本严格匹配,你当前项目对应SDK 45,后续如果要引入其他expo-*开头的依赖,必须选择支持SDK 45的版本,跨版本会直接触发类找不到、方法签名不匹配的运行时错误。
- 每次修改原生端配置后都要执行Gradle清理再重新构建,否则缓存会导致修改不生效。
内容的提问来源于stack exchange,提问作者veggirice
相关产品推荐
相关产品推荐

