升级Node至17.0.0后React Native构建出现transformFile及OpenSSL报错
问题原因
你遇到的两个报错存在直接关联:
TypeError: Cannot read properties of undefined (reading 'transformFile')属于次生报错- 根因是第二个报错
ERR_OSSL_EVP_UNSUPPORTED
Node 17及以上版本默认启用了OpenSSL 3.0,该版本废弃了部分老版本的哈希算法,而你项目中使用的Metro(React Native官方打包工具)版本依赖老的哈希算法实现,导致Transformer初始化失败,后续调用transformFile方法时就会抛出未定义的错误。
解决方案
方案1:降级Node到兼容版本(最稳定,推荐)
React Native官方对高版本Node的适配有滞后性,目前主流稳定项目推荐使用Node 16.x LTS版本,降级到该版本后清理缓存重新构建即可解决问题。
操作步骤:
- 卸载当前Node 17版本,安装Node 16.x LTS版本,如果你使用nvm管理Node版本,执行以下命令:
nvm install 16 nvm alias default 16
- 清理项目缓存重新构建:
rm -rf node_modules && npm install cd ios && pod install && cd .. npm start -- --reset-cache
方案2:启用OpenSSL legacy provider(无需降级Node,适合临时调试)
如果不想降级Node版本,可以在启动打包命令前添加环境变量NODE_OPTIONS=--openssl-legacy-provider,兼容老版本哈希算法。
单次启动生效:
- Mac/Linux终端执行:
NODE_OPTIONS=--openssl-legacy-provider npm start
- Windows cmd执行:
set NODE_OPTIONS=--openssl-legacy-provider npm start
- Windows PowerShell执行:
$env:NODE_OPTIONS = "--openssl-legacy-provider" npm start
永久写入项目配置:
可以直接修改package.json中的启动脚本,跨平台环境可搭配cross-env使用:
"scripts": { "start": "cross-env NODE_OPTIONS=--openssl-legacy-provider react-native start", "android": "cross-env NODE_OPTIONS=--openssl-legacy-provider react-native run-android", "ios": "cross-env NODE_OPTIONS=--openssl-legacy-provider react-native run-ios" }
方案3:升级Metro到兼容版本(适合新项目)
如果你的React Native版本支持,可以将metro相关依赖升级到0.67.0及以上版本,该版本已经适配了OpenSSL 3.0的新算法,升级后无需其他修改即可正常构建。
内容的提问来源于stack exchange,提问作者Chaudhry Talha
相关产品推荐
相关产品推荐

