You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows下React Native构建报错:EMFILE: too many open files

React Native 0.74.6 Windows Release构建EMFILE文件过多问题修复

问题概述

Windows环境下构建Bare React Native 0.74.6项目时,执行命令:

npx react-native build-android --mode=debug --tasks assembleRelease

构建失败,核心报错:

error EMFILE: too many open files, open 'C:\Users\hk\AppData\Local\Temp\metro-cache\...'

关联任务执行失败日志:

Execution failed for task ':app:createBundleReleaseJsAndAssets'.
> Process 'command 'cmd'' finished with non-zero exit value 1

已知观察结果:

  • Mac环境同命令可成功构建
  • Windows与Mac配置一致,本地其他同类RN项目正常构建
  • 回滚至两周前提交可正常构建,问题与近期包更新相关
  • Debug构建在Windows和Mac均正常

根因分析

问题源于Metro缓存模块在执行createBundleReleaseJsAndAssets任务时打开文件数超出Windows系统默认文件句柄限制,大概率是近期新增/升级的依赖包引入了大量需要缓存的文件,或是依赖包的缓存逻辑存在Windows兼容性问题。

修复步骤

1. 彻底清理缓存

先清除Metro缓存和Android构建缓存,排除旧缓存堆积问题:

# 重置Metro缓存
npx react-native start --reset-cache
# 删除Android构建目录
rmdir /s /q android\app\build
rmdir /s /q android\build
# 重新执行构建命令
npx react-native build-android --mode=debug --tasks assembleRelease

2. 定位问题依赖包

对比回滚提交与当前提交的package.json,找出近期新增或升级的依赖包,逐个临时移除并重新构建,定位触发问题的包:

  • 移除单个依赖:npm uninstall [package-name]
  • 测试构建,若恢复正常,说明该包是问题源
  • 针对问题包:
    • 查看包文档是否有Windows环境特殊配置要求
    • 暂时降级至回滚提交中的版本(npm install [package-name]@[old-version])
    • 向包作者提交Windows兼容性问题

3. 调整Windows文件句柄限制(临时 workaround)

若暂时无法定位到依赖包,可临时提升Windows文件句柄上限:

  1. 以管理员身份打开PowerShell
  2. 执行以下命令修改注册表:
    Set-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters -Name MaxOpenFiles -Value 65536 -Type DWord
    
  3. 重启电脑后重新构建

4. 优化Metro缓存配置

修改metro.config.js,调整缓存存储位置和大小,减少临时文件堆积:

const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config');
const path = require('path');

const customConfig = {
  cacheStores: [
    new (require('metro-cache').FileStore)({
      // 将缓存移至项目本地node_modules目录下,避免系统临时目录权限/数量限制
      root: path.join(__dirname, 'node_modules/.cache/metro'),
      // 限制缓存最大大小为100MB,超出自动清理
      maxSize: 1024 * 1024 * 100,
    }),
  ],
};

module.exports = mergeConfig(getDefaultConfig(__dirname), customConfig);

5. 检查Release构建特殊配置

对比Debug与Release模式的Metro参数,排查是否Release模式下启用了额外的文件扫描或缓存逻辑:

  • 打开android/app/build.gradle,查看createBundleReleaseJsAndAssets任务是否添加了特殊参数
  • 确认是否在metro.config.js中针对Release模式设置了不同的watchFolders或resolver配置

内容的提问来源于stack exchange,提问作者hkrobotics

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 06:03:17