Expo应用本地开发正常,执行eas update时出现non-std C++异常
问题分析与解决方案
核心问题定位
"non-std C++ exception"错误仅在EAS更新后出现,但本地开发/Expo Go环境正常,本质是生产打包流程的依赖兼容性问题:本地Metro开发环境会自动处理宽松的依赖校验与polyfill,而EAS生产打包采用更严格的Native编译逻辑,依赖中的冲突模块、废弃Native库、版本不匹配的包都会触发这类底层异常。
针对性修复步骤
1. 清理冲突与废弃依赖
你的package.json存在明确的问题依赖:
- 移除
react-native-async-storage:该包已废弃,官方推荐使用@react-native-async-storage/async-storage,两者共存会导致Native层冲突。 - 移除
react-native-crypto、react-native-randombytes:替换为Expo官方的expo-crypto,它完全适配Expo打包流程,不会引发Native层异常。 - 移除
react-native-tcp、react-native-udp:这类底层网络模块在Expo生产环境兼容性极差,如需网络功能优先使用Expo提供的API或纯JS实现。
2. 移除Browserify系Node核心模块Polyfill
你引入的大量browserify类polyfill(如crypto、dns.js、stream-browserify等)在Metro开发环境可正常运行,但EAS打包时会与Expo内置环境冲突:
- 移除所有相关依赖:
assert、browserify-zlib、console-browserify、constants-browserify、crypto、dns.js、domain-browser、events、https-browserify、path-browserify、punycode、querystring-es3、readable-stream、stream-browserify、string_decoder、timers-browserify、tty-browserify、url、util、vm-browserify。 - 若代码确实依赖Node API,通过Metro配置或Expo官方适配方案处理polyfill,而非直接安装browserify包。
3. 修正依赖版本不匹配
react-native-reanimated@3.1.0与Expo 48不兼容:Expo 48对应的react-native-reanimated版本为~2.14.4,3.x大版本升级会导致Native编译错误,执行降级命令:npm install react-native-reanimated@~2.14.4- 确认
react-native-maps配置:当前版本1.3.2符合Expo 48要求,但需在app.json中配置插件:{ "expo": { "plugins": [ [ "react-native-maps", { "iosMapsApiKey": "你的iOS地图密钥", "androidMapsApiKey": "你的Android地图密钥" } ] ] } }
4. 排查特殊体积依赖
@geo-maps/earth-coastlines-1km包含大量地理数据,可能触发打包时的内存或编译异常:
- 临时移除该依赖,重新执行EAS更新,若错误消失,可考虑使用轻量化版本,或改为应用启动后动态加载数据。
5. 重置打包环境
彻底清理缓存避免旧编译产物干扰:
# 清除npm缓存 npm cache clean --force # 清除Expo缓存 npx expo start --clear # 清除EAS本地构建缓存 eas build:clear-cache
6. 检查EAS生产配置
确保eas.json生产环境配置无特殊编译选项冲突,示例配置:
{ "build": { "production": { "ios": { "buildConfiguration": "Release" }, "android": { "buildType": "Release" }, "env": { "EXPO_PUBLIC_ENV": "production" } } } }
验证流程
完成修改后,先通过expo start --no-dev --minify模拟生产打包环境测试,确认无异常后再执行eas update发布更新。
内容的提问来源于stack exchange,提问作者sam faulkner
相关产品推荐
相关产品推荐

