React Portlet部署报错EMFILE: too many open files求助
问题描述
我们采用Adapt方式开发React Portlet,此前运行正常,近两日执行部署命令时所有React Portlet均持续报错。
部署命令:npm run deploy:liferay
核心错误信息:
Error: EMFILE: too many open files, open 'D:\Tools\workspace-liferay\NSConnect40\tools\sdk\portlets\northstar-react-portlet\northstar-npm-react-portlet-web\itinerary-react-portlet\build.liferay\jar\node_modules\style-loader@3.3.4\dist\runtime\styleDomAPI.js'
最终导致liferay-npm-bundler执行失败(状态码1)。已尝试Node版本:20.15.0、19.8.1、14.21.3、22.13.0,均无法解决问题。
解决方案
1. 提升Windows系统文件句柄限制
Windows默认文件句柄配额较低,按以下步骤调整:
- 运行
gpedit.msc打开本地组策略编辑器 - 导航至:
计算机配置 > 管理模板 > 系统 > 文件系统 > NTFS - 找到设置NTFS文件系统的最大文件句柄数,启用后设置更高值(例如65535)
- 重启电脑生效
2. 优化liferay-npm-bundler并发配置
修改项目根目录的.liferay-npm-bundlerrc文件,降低并发处理的文件数量:
{ "options": { "maxWorkers": 2, "chunkSize": 10 } }
maxWorkers限制并发工作线程数chunkSize控制每次批量处理的文件数量,减少同时打开的文件句柄
3. 清理构建缓存与依赖
彻底清理旧构建文件和依赖,重新安装后尝试部署:
# 删除构建目录 rm -rf build.liferay # 删除node_modules和锁文件 rm -rf node_modules package-lock.json # 重新安装依赖 npm install # 重新执行部署 npm run deploy:liferay
4. 用graceful-fs处理文件句柄溢出
安装graceful-fs替代原生fs模块,它能自动处理文件句柄泄漏问题:
npm install graceful-fs --save-dev
在项目入口文件或构建脚本顶部添加:
const gracefulFs = require('graceful-fs'); gracefulFs.gracefulify(require('fs'));
5. 更新liferay-npm-bundler至稳定版
官方可能已修复文件句柄相关bug,更新到最新稳定版:
npm update liferay-npm-bundler --save-dev
内容的提问来源于stack exchange,提问作者Sumair Ahmed
相关产品推荐
相关产品推荐

