升级Expo SDK 48至49后打包出现两类报错,求解决方案
Expo SDK 48升级至49后打包报错的解决方案
问题场景
Expo SDK从48版本升级到49版本后,本地expo start运行正常,但打包(包括eas build或expo build)后出现两类错误:
TypeError: Cannot read property 'prototype' of undefined, js engine: hermesInvariant Violation: "main" has not been registered. js engine: hermes
针对第一类错误的解决步骤
这类错误通常由依赖兼容性或编译配置问题引发,可按以下步骤排查:
- 更新兼容依赖:执行
npx expo install --fix,该命令会自动将项目依赖更新为Expo SDK 49推荐的兼容版本,解决多数依赖适配问题。 - 检查babel配置:确保
babel.config.js使用Expo官方预设,避免自定义插件干扰Hermes编译。示例配置:
module.exports = function(api) { api.cache(true); return { presets: ['babel-preset-expo'], }; };
- 清理缓存后重试:运行
npx expo start --clear清除本地缓存,然后重新执行打包命令。如果使用EAS Build,建议在构建前删除node_modules、yarn.lock/package-lock.json,重新安装依赖后再触发构建。 - 排查问题依赖:若上述步骤无效,检查项目中直接操作原型链、或依赖旧版React Native API的第三方库(如某些UI组件、工具库),查看其官方文档确认是否支持Expo SDK 49,必要时替换为兼容的替代库。
针对第二类错误的解决步骤
该错误本质是主组件未完成注册,通常由入口文件问题或模块加载失败导致,可按以下操作处理:
- 确认入口文件的组件注册:检查项目入口文件(默认是
App.js或index.js)是否包含正确的注册代码:
import { AppRegistry } from 'react-native'; import App from './App'; import { name as appName } from './app.json'; AppRegistry.registerComponent(appName, () => App);
确保appName与app.json中的name字段一致,且注册代码未被错误逻辑阻断执行。
- 模拟生产环境调试:执行
expo start --no-dev --minify启动生产模式的本地调试,复现打包后的运行环境,定位是否有模块加载失败导致注册代码未执行。 - 检查EAS构建配置:若使用EAS Build,确认
eas.json中的构建配置正确,没有遗漏必要的环境变量或打包参数,避免构建过程中出现文件缺失或配置错误。 - 确认Hermes配置:SDK 49默认启用Hermes引擎,检查
app.json/app.config.js中的配置是否正确:
{ "expo": { "jsEngine": "hermes" } }
避免手动修改配置导致的引擎兼容问题。
内容的提问来源于stack exchange,提问作者Muhammad Junaid
相关产品推荐
相关产品推荐

