React Native Android base module bundle过大引发ERR_STRING_TOO_LONG错误如何解决
解决React Native Android动态功能构建Metro报ERR_STRING_TOO_LONG错误的最优方案
该错误的根本原因是Metro默认使用的jest-haste-map依赖扫描工具会遍历项目根目录下所有文件,安卓构建生成的超大中间产物base.zip被扫描时,工具尝试将其完整读取为字符串,超出了Node.js环境单字符串最大长度限制(约512MB),因此触发报错。
你当前通过移除ABI过滤器压缩base.zip体积的方案属于临时规避,会导致最终生成的包包含冗余架构的so文件,增大包体积甚至引入兼容性问题,更优的方案如下:
- 【最推荐】 配置Metro忽略安卓构建产物目录
直接从根源避免Metro扫描不需要处理的构建中间文件,完全不影响原有打包配置,你可以将之前移除的ABI过滤器重新加回。
操作步骤:修改项目根目录下的metro.config.js,添加扫描忽略规则,示例配置如下:
修改配置后重启Metro服务即可生效,后续构建不会再扫描安卓build目录下的文件,不会触发大文件读取错误。const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config'); const config = { resolver: { // 配置正则匹配安卓构建产物目录,加入扫描黑名单 blockList: [ /\/android\/build\//, /\/android\/app\/build\// ] }, // 可选配置:仅监听源码目录,减少Metro运行时资源占用 watchFolders: [ './src', './index.js' ] }; module.exports = mergeConfig(getDefaultConfig(__dirname), config); - 临时调试方案
如果不想修改配置,每次执行构建前先清理安卓历史构建缓存即可,执行命令:
清理完成后再执行cd android && ./gradlew cleanreact-native run-android即可,该方案需要每次构建前手动操作,适合临时调试场景。 - 额外优化建议
如果项目根目录下还存放有其他大体积非源码文件(如压缩包、镜像文件、备份文件等),可以将对应路径的匹配规则也加入blockList列表,避免后续触发同类问题。
内容的提问来源于stack exchange,提问作者UchihaItachi
相关产品推荐
相关产品推荐

