第一种情况
umi 项目在发布部署系统报内存不足,导致错误编译失败
这是因为 CI/CD 或 Jenkins/Docker 等流程系统,terser-webpack-plugin
读取的 cpu 数量并非真实的,多进程打包就回导致分配过多的进程,导致占用内存爆掉出错。
可以通过 top -c -bw 500 -o %MEM &
查看进程数,检查打包时,分配了多少并发进程,内存大概占用多少
# 会看到非常多 processChild 进程,导致内存使用失控
/home/jenkins/agent/workspace/xxx-ui-sit/node_modules/jest-worker/build/workers/processChild.js
# 非常多的此进程 此处省略(因为部署系统读到的 cpu 数并非真实的)
umi 项目已经有逻辑修复此问题,process.env.SIGMA_MAX_PROCESSORS_LIMIT
可用来指定真实核数。
@umijs/bundler-webpack/src/getConfig/getConfig.ts
umi@3.4.23 版本中解决了此问题,相关 issue https://github.com/umijs/umi/pull/6647
代码如下
// 兼容内部流程系统,读到的 cpu 数并非真实的
// 使用 SIGMA_MAX_PROCESSORS_LIMIT 指定真核数
parallel: process.env.SIGMA_MAX_PROCESSORS_LIMIT
? parseInt(process.env.SIGMA_MAX_PROCESSORS_LIMIT, 10)
: true,
第二种情况
有时遇到 Error: The service was stopped
直接 build 报错了,没有更多有用的信息,
[2021-07-28T08:44:38.463Z] > umi build
[2021-07-28T08:44:38.463Z]
[2021-07-28T08:44:42.671Z] [info] [webpackbar] Compiling Webpack
[2021-07-28T08:45:50.564Z] [BABEL] Note: The code generator has deoptimised the styling of /home/jenkins/agent/workspace/xxx-ui-sit/node_modules/@antv/g6/dist/g6.min.js as it exceeds the max of 500KB.
[2021-07-28T08:47:42.063Z] Error: The service was stopped
[2021-07-28T08:47:42.063Z] at sendRequest (/home/jenkins/agent/workspace/xxx-ui-sit/node_modules/esbuild/lib/main.js:1020:33)
[2021-07-28T08:47:42.063Z] at responseCallbacks.set (/home/jenkins/agent/workspace/xxx-ui-sit/node_modules/esbuild/lib/main.js:542:9)
[2021-07-28T08:47:42.063Z] at Socket.afterClose (/home/jenkins/agent/workspace/xxx-ui-sit/node_modules/esbuild/lib/main.js:520:7)
[2021-07-28T08:47:42.063Z] at Socket.emit (events.js:194:15)
[2021-07-28T08:47:42.063Z] at endReadableNT (_stream_readable.js:1125:12)
[2021-07-28T08:47:42.063Z] at process._tickCallback (internal/process/next_tick.js:63:19)
[2021-07-28T08:47:42.063Z] build failed
[2021-07-28T08:47:42.063Z] Error: build failed
[2021-07-28T08:47:42.063Z] at compiler.run (/home/jenkins/agent/workspace/xxx-ui-sit/node_modules/@umijs/bundler-webpack/lib/index.js:138:27)
[2021-07-28T08:47:42.063Z] at finalCallback (/home/jenkins/agent/workspace/xxx-ui-sit/node_modules/webpack/lib/MultiCompiler.js:254:12)
[2021-07-28T08:47:42.063Z] at runWithDependencies.err (/home/jenkins/agent/workspace/xxx-ui-sit/node_modules/webpack/lib/MultiCompiler.js:275:14)
[2021-07-28T08:47:42.063Z] at /home/jenkins/agent/workspace/xxx-ui-sit/node_modules/neo-async/async.js:2830:7
[2021-07-28T08:47:42.063Z] at done (/home/jenkins/agent/workspace/xxx-ui-sit/node_modules/neo-async/async.js:2925:13)
[2021-07-28T08:47:42.063Z] at err (/home/jenkins/agent/workspace/xxx-ui-sit/node_modules/webpack/lib/MultiCompiler.js:186:23)
[2021-07-28T08:47:42.063Z] at compiler.run (/home/jenkins/agent/workspace/xxx-ui-sit/node_modules/webpack/lib/MultiCompiler.js:267:15)
[2021-07-28T08:47:42.063Z] at finalCallback (/home/jenkins/agent/workspace/xxx-ui-sit/node_modules/webpack/lib/Compiler.js:257:39)
[2021-07-28T08:47:42.063Z] at onCompiled (/home/jenkins/agent/workspace/xxx-ui-sit/node_modules/webpack/lib/Compiler.js:265:20)
[2021-07-28T08:47:42.063Z] at compilation.seal.err (/home/jenkins/agent/workspace/xxx-ui-sit/node_modules/webpack/lib/Compiler.js:676:23)
[2021-07-28T08:47:42.063Z] at hooks.optimizeChunkAssets.callAsync.err (/home/jenkins/agent/workspace/xxx-ui-sit/node_modules/webpack/lib/Compilation.js:1411:14)
[2021-07-28T08:47:42.063Z] at _promise1.then._err1 (eval at create (/home/jenkins/agent/workspace/xxx-ui-sit/node_modules/tapable/lib/HookCodeFactory.js:33:10), <anonymous>:22:1)
[2021-07-28T08:47:42.063Z] at process._tickCallback (internal/process/next_tick.js:68:7)
[2021-07-28T08:47:42.063Z] npm ERR! code ELIFECYCLE
[2021-07-28T08:47:42.063Z] npm ERR! errno 1
[2021-07-28T08:47:42.063Z] npm ERR! xxx@ build: `umi build`
[2021-07-28T08:47:42.063Z] npm ERR! Exit status 1
可以通过以下方法来处理:
# 查看内存情况
free -m
# 约束 nodejs 内存使用
# 部署系统限制使用的内存,本质上操作的就是下面这个
export NODE_OPTIONS="--max-old-space-size=4096"
npm run build
扩展阅读: