观看'./**/*.js'会导致CPU使用率过高

时间:2016-04-25 15:52:12

标签: javascript node.js gulp

我需要查看所有文件夹,包括当前的文件夹以进行更改。因此我用了

gulp.task('start', () => {
    if (node) node.kill()
    node = spawn('node', ['server.js'], {
        stdio: 'inherit'
    })
    node.on('close', function(code) {
        if (code === 8) {
            gulp.log('Error detected, waiting for changes...');
        }
    });
});

gulp.watch(['./**/*.js'], ['start']);

gulp.task('default', ['start', 'watch']);

process.on('exit', function() {
    if (node) node.kill()
});

但它会导致100%的CPU使用率。如果我只在一个文件夹(包含99%的所有需要​​观看的文件)上使用它,比如'api / ** / * .js`几乎没有任何CPU使用。

我做错了什么?

2 个答案:

答案 0 :(得分:16)

您正在查看项目的所有目录和子目录中的所有.js个文件。其中包括node_modules。根据项目中有多少依赖项以及这些依赖项具有多少依赖项等,您可能会看到数千个.js文件。

您应该将监视glob限制为仅包含源文件所在的目录:

gulp.watch(['api/**/*.js', 'app/**/*.js', ...], ['start']);

或者,您可以尝试排除node_modules文件夹和任何其他不包含源文件的文件夹(例如您的构建目标文件夹):

gulp.watch(['api/**/*.js', '!node_modules/**/*.js', ...], ['start']);

答案 1 :(得分:16)

gulp v3' s watch已有known CPU usage issues近5年。这是因为gulp使用轮询(fs.watchFile)来检测更改。

  • 据称已经修复了4.0(2018年12月发布),但有reports类似的问题。
  • 对于版本< 4,解决方法建议是增加轮询间隔。

    gulp.watch('**/*.js', { interval: 2000 }, ...)
    

    (默认为100)

  • @Sven's advice也非常合理 - 可能没有理由观看您的node_modules或构建文件夹。