GitLab CI配置高内存仍报JavaScript堆内存溢出如何解决?
问题原因
- 核心配置错误:
--max-old-space-size参数的单位为MB而非字节,你设置的15032377839数值远超Node可识别的合理范围,配置完全失效,Node将使用默认的约2GB堆内存上限,因此日志中堆内存仅占用1.8GB左右就触发了内存溢出。 - TerserPlugin额外内存消耗:代码压缩阶段TerserPlugin默认启用多进程并行压缩,每个子进程都会独立占用内存,叠加后的总内存消耗很容易触达Node默认内存上限。
- 环境变量未生效:你配置的
GENERATE_SOURCEMAP=false没有加export导出,仅为当前shell的局部变量,没有传递到后续的构建进程中,source map生成逻辑依然会执行,额外占用大量内存。
解决方案
修正内存与环境变量配置
在GitLab CI的BuildApp阶段导出正确的环境变量,修正后的配置如下:BuildApp: stage: build before_script: - export GENERATE_SOURCEMAP=false - export NODE_OPTIONS="--max-old-space-size=14336" # 14GB对应14*1024=14336MB script: - yarn - yarn prod优化TerserPlugin压缩配置
调整webpack配置中的TerserPlugin参数,减少并行进程数降低内存消耗:const TerserPlugin = require('terser-webpack-plugin'); module.exports = { optimization: { minimizer: [ new TerserPlugin({ parallel: 2, // 可根据实际情况调整,设置为1即可关闭并行压缩 terserOptions: { compress: { drop_console: true, // 可选移除控制台输出,减少代码体积与压缩消耗 } } }) ] } }构建流程优化
- 开启GitLab CI的yarn缓存,避免每次构建全量重新安装依赖,降低内存开销
- 开启webpack构建缓存,减少重复编译的计算与内存消耗
- 若代码体积过大,可拆分代码块,降低单文件压缩的内存占用
临时免配置解决方案
若不想修改webpack配置,可直接修改package.json中的prod构建命令,手动指定Node内存上限:{ "scripts": { "prod": "node --max-old-space-size=14336 node_modules/.bin/webpack --mode production" } }
内容的提问来源于stack exchange,提问作者János
相关产品推荐
相关产品推荐

