React Native引入expo-media-library报MediaType错误如何解决
报错原因
该报错的核心是JS层无法获取到expo-media-library对应的原生桥接模块实例,_ExponentMediaLibrary.default值为undefined时访问MediaType属性就会抛出这个类型错误,和JS层的import写法无关,常见触发原因如下:
- 执行完Expo模块安装、expo-media-library安装后,没有重新编译原生端安装包,旧的安装包里没有打入expo-media-library的原生代码,JS层加载模块时找不到对应原生实现
- 安装的
expo-media-library版本和当前项目的Expo SDK版本不匹配,跨大版本的依赖错位会导致原生模块导出的接口和JS层预期不一致 - 原生端依赖缓存未清理,iOS的pod依赖未更新、Android的构建缓存残留,导致新安装的模块没有被正确链接
- 执行
npx install-expo-modules时修改原生配置失败,Expo模块的注册逻辑没有正确写入Android/iOS的入口文件,所有Expo模块都无法正常加载
修复步骤
按以下顺序操作即可解决问题:
- 对齐依赖版本
先在项目根目录执行npm list expo查看当前项目安装的Expo SDK版本,安装对应大版本的expo-media-library,禁止跨大版本安装最新包:- Expo SDK 51 对应安装
expo-media-library@~16.0.0 - Expo SDK 50 对应安装
expo-media-library@~15.4.0 - Expo SDK 49 对应安装
expo-media-library@~15.2.0
- Expo SDK 51 对应安装
- 清理缓存重装依赖
删除项目根目录下的node_modules文件夹,以及对应包管理器的锁文件(package-lock.json/yarn.lock/pnpm-lock.yaml),重新执行npm install(或你使用的yarn/pnpm安装命令)完成依赖重装。 - 清理原生构建缓存并重新编译
- Android端:关闭正在运行的Metro服务,进入android目录执行
./gradlew clean清空构建缓存,回到项目根目录执行npx react-native run-android,必须重新编译生成新的安装包覆盖模拟器/真机上的旧版本,不能直接启动旧包。 - iOS端:进入ios目录执行
pod install --repo-update更新原生pod依赖,回到项目根目录执行npx react-native run-ios重新编译安装。
- Android端:关闭正在运行的Metro服务,进入android目录执行
- 配置校验(前三步未解决时执行)
- 打开Android端入口文件
android/app/src/main/java/[你的项目包名]/MainApplication.java,确认ReactNativeHost的getPackages列表中包含new ExpoModulesPackage(),Expo模块初始化逻辑没有被误删。 - 打开iOS端入口文件
ios/[你的项目名]/AppDelegate.mm,确认didFinishLaunchingWithOptions方法中存在Expo模块的初始化调用,相关配置没有被修改。
- 打开Android端入口文件
注意:不要尝试通过修改node_modules下的源码、加可选链的方式绕过报错,这类方案只是掩盖问题,原生模块未加载的情况下相关API调用依然会失败。
内容的提问来源于stack exchange,提问作者Tushar Vimal
相关产品推荐
相关产品推荐

