react-scripts build报RpcIpcMessagePortClosedError修复方法
RpcIpcMessagePortClosedError: Process xxx exited [SIGKILL] 是构建时TypeScript类型检查子进程被系统强制终止的信号,90%以上场景为构建内存不足触发系统OOM(内存溢出)查杀,不属于代码语法错误,因此开启--verbose模式也不会输出业务层面的报错信息。
调整Node进程内存上限
这是最高频有效的方案,直接修改package.json中的build脚本,给Node分配足够的老生代内存,以4G内存为例:"scripts": { "build": "NODE_OPTIONS=--max-old-space-size=4096 react-scripts build" }Windows环境下建议先安装
cross-env做跨平台参数兼容,执行npm i cross-env -D后将脚本改为:"build": "cross-env NODE_OPTIONS=--max-old-space-size=4096 react-scripts build"如果机器内存足够,可以把数值调到8192(即8G)进一步降低OOM概率。
降低构建时内存占用
在项目根目录新建.env配置文件,加入以下配置减少构建阶段的非必要内存消耗:# 关闭sourcemap生成,可降低30%左右构建内存占用 GENERATE_SOURCEMAP=false # 构建时跳过ESLint检查 DISABLE_ESLINT_PLUGIN=true如果服务器内存实在紧张,可以临时关闭构建阶段的TS类型检查:通过
react-app-rewired或eject方式修改webpack配置,将fork-ts-checker-webpack-plugin的typescript.enable设为false即可,注意本地开发阶段不要关闭该配置,避免类型错误流入线上。排查系统层面内存限制
如果是Linux服务器构建,先执行free -h查看当前可用内存,若可用内存低于2G,先停掉无关的高内存占用服务再执行构建,也可以通过添加swap分区临时补充内存:# 创建2G大小的swap文件 sudo fallocate -l 2G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile如果是在Docker容器内构建,注意检查Docker的内存限制:默认Docker桌面版分配的运行内存为2G,构建CRA项目很容易触发OOM,将内存限制调整到4G以上即可。
版本兼容修复
你当前使用的Node.js v14.19.3属于已停止维护的旧版本,部分旧版react-scripts依赖的fork-ts-checker-webpack-plugin在Node14下存在已知内存泄漏问题,可以升级到Node.js 16/18 LTS版本后,清空依赖重新安装再构建:rm -rf node_modules package-lock.json npm install npm run build
内容的提问来源于stack exchange,提问作者Sam Fisher

