Gulp - CALL_AND_RETRY_LAST 分配失败 - 进程内存不足

13

当我调用我的某个gulp任务时,我收到了"FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - process out of memory"的错误信息。

我在这个问题中发现,可以向 node 传递一个参数来增加默认内存限制:node --max-old-space-size=2000 server.js。但是我该如何告诉 gulp 向 node.exe 传递参数呢?这里列出了我可以传递给 gulp 的标志列表,我希望能找到一个在 gulp 启动任务时会传递给 node 的标志。

引起问题的任务:

var gulp = require('gulp');
var imagemin = require('gulp-imagemin');

gulp.task('imagemin', function() {
  var OUTPUT_FOLDER = '../Release_Prepared/';
  var extensionsToOptimize = ['gif', 'jpeg', 'jpg', 'png', 'svg'];
  var glob = [];

  for(var i=0; extensionsToOptimize.length; i++){
    glob.push(OUTPUT_FOLDER + '**/*.' + extensionsToOptimize[i]);
  }

  gulp.src(glob)
  .pipe(imagemin({
    verbose: true
  }))
  .pipe(gulp.dest(OUTPUT_FOLDER));
});

如果你在使用Windows系统,你需要使用set命令来进行一些不同的操作,例如: "SET variable=string"。因此,你需要执行 "set max-old-space-size=2000" 命令,然后再运行 "node.exe server.js"。但是,你可能需要解决内存问题,而不仅仅是增加内存。 - ryanc1256
1
Windows对node --max-old-space-size=2000 server.js没有问题,它可以很好地理解programName --parameter。我的问题是如何从gulp任务中传递node参数? - KVM
这些参数直接发送到V8(Node后面的引擎),您不需要将其作为参数传递给gulp任务...有很多关于设置这些命令的好文档。 - ryanc1256
7个回答

35

今天我才知道,gulp可以使用任何V8选项,并将其传递给node。例如,执行 gulp yourTask --max_old_space_size=2000 就能得到想要的结果。要查看要传递的V8标志列表,请在终端中输入 node --v8-options


1
你真是让我开心的瞬间! - Geo
完美答案! - wukong

6

在我们的情况下,第一次执行gulp build命令时一切顺利。我有四个独立的任务。每个任务为每个模块创建单独的构建文件。我们一直在运行Gulp命令进行最终构建。

然后我们不断遇到“内存不足”问题,即使我们为进程分配了大量内存(如下所示-约8GB)。但是,它仍然失败了。

gulp --max-old-space-size=8192

解决方案:

  1. 只需删除已经创建的先前构建文件即可。然后,上述命令会创建新文件。因此,该过程可以无缝运行。

例如:手动或通过自动化命令删除main-built.js文件。

  1. 在其他情况下,只需执行以下命令清除缓存。

npm cache clean

  1. 由于我们有大量JS文件,这也是另一种情况,可能会导致此类问题。请删除不需要和未使用的JS文件。

希望这能有所帮助。


我们正在使用Azure构建管道。在gulp构建之前还是之后应该使用npm cache clean?@rajeshkdev - Rajesh Swarnkar

2

我认为在启动bash脚本构建时,您应该运行这种类型的命令。

node --max-old-space-size=2000 ./node_modules/.bin/gulp {your gulp script e.g gulb.js}

1
我能够通过手动删除我的构建的js/css(目标)文件来解决这个问题,然后重新运行gulp任务。这与RJK上面的答案一致,但不需要分配新的内存。

0

给我更多的内存也没有解决我的问题。发生了什么事:

我花了几天时间来解决这个问题,直到我发现在某个文件中,我从一个静态文件中导入了一个类,一个已经构建好的文件。这使得构建过程永远无法结束。就像这样:

import PropTypes from "../static/build/prop-types"; 

修复真正的源代码解决了所有问题。


0

搜索 gulp.cmd 文件并按照以下方式修改:

@IF EXIST "%~dp0\node.exe" ( "%~dp0\node.exe" "%~dp0\node_modules\gulp-cli\bin\gulp.js --max-old-space-size=1400" %* ) ELSE ( @SETLOCAL @SET PATHEXT=%PATHEXT:;.JS;=;% node "%~dp0\node_modules\gulp-cli\bin\gulp.js --max-old-space-size=1400" %* )


0

我有一个简单的项目,最终使用了gulp-imagemin,并且遇到了同样的问题。根本问题是存在大型营销图片和Gulp/Node只是内存不足。

当然,我可以执行此处的接受答案。但这些4,000+ x 3,000+像素的图片无论如何都不适合上网,而这个错误只是提醒我错过了重新调整一些图片。

因此,如果您遇到类似的错误,请检查您是否拥有适当大小的图像,因为gulp/node不应该在大多数常规大小的生成物上出现问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接