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

Hed*_*dge 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()
});
Run Code Online (Sandbox Code Playgroud)

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

我究竟做错了什么?

jos*_*736 17

gulp v3 watch已经知道了近5年的CPU使用率问题.这是因为gulp使用polling(fs.watchFile)来检测更改.

  • 据称这已经在gulp 4.0(2018年12月发布)中得到修复,但也有类似问题的报道.
  • 对于版本<4,解决方法建议是增加轮询间隔.

    gulp.watch('**/*.js', { interval: 2000 }, ...)
    
    Run Code Online (Sandbox Code Playgroud)

    (默认值为100)

  • @Sven 的建议也很合理 - 可能没有理由观察你的node_modules或构建文件夹.


Sve*_*ung 16

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

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

gulp.watch(['api/**/*.js', 'app/**/*.js', ...], ['start']);
Run Code Online (Sandbox Code Playgroud)

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

gulp.watch(['api/**/*.js', '!node_modules/**/*.js', ...], ['start']);
Run Code Online (Sandbox Code Playgroud)