React Native 0.63.4开启Hermes报Reflect不存在的ReferenceError如何解决
React Native 0.63.4 开启Hermes报
Reflect不存在的解决方法 问题根因
RN 0.63.4 内置的Hermes引擎版本为0.5.x,该版本原生没有实现全局Reflect对象支持。项目里只要有第三方库(比如新版本状态管理工具、网络请求库、依赖元数据反射能力的工具)在运行时调用Reflect接口,就会直接抛出未定义的ReferenceError。
具体解决路径
- 方案一:手动补充Reflect的polyfill兼容
- 安装和当前RN版本兼容的依赖:执行
npm i core-js@3.32.2 --save,选3.x的稳定老版本就行,别装太新的core-js,容易触发其他不兼容问题 - 找到项目根目录下的入口文件
index.js,把Reflect的兼容引入放在所有代码的最顶部,不管原来的顺序是什么,必须在引入App组件、引入第三方依赖之前写:// 入口文件最顶部,优先级最高 import 'core-js/es/reflect'; import {AppRegistry} from 'react-native'; import App from './App'; // 后面你原来的入口逻辑原样保留就行 - 检查babel配置:打开根目录的
babel.config.js,如果原来的配置写死了排除整个node_modules目录的转译,一定要把core-js的路径从排除规则里去掉,否则polyfill的代码不会被正常转译,等于白写。
- 安装和当前RN版本兼容的依赖:执行
- 方案二:替换匹配版本的Hermes预编译库
不想大动项目依赖的话,可以手动把android目录下的Hermes native库替换成RN 0.64 对应的0.7.x版本——这个版本的Hermes已经原生内置了Reflect支持,操作的时候一定要匹配对应CPU架构的ABI文件,别把别的版本的.so库拷进去,不然会直接闪退。 - 方案三:整体升级RN版本
如果项目迭代节奏允许,直接把RN升到0.64及以上,官方自带的Hermes引擎已经覆盖了大部分ES6+全局对象的实现,不用额外补polyfill就能适配绝大多数第三方库的运行要求。
常见踩坑点
- 千万别把polyfill的引入放在第三方依赖的后面,依赖加载的时候就会触发Reflect不存在的报错,写了也没用
- 别单独装
reflect-metadata包来解决问题,这个包只是扩展Reflect的装饰器元数据能力,根本不会补全基础Reflect对象本身的缺失 - 改完配置之后一定要清掉metro缓存重新打包,不然很容易因为旧缓存导致polyfill没生效,误以为操作错了
内容的提问来源于stack exchange,提问作者Pakenfit
相关产品推荐
相关产品推荐

