【问题标题】:Watching './**/*.js' causes excessive CPU usage观看 './**/*.js' 会导致 CPU 使用率过高
【发布时间】:2016-04-25 15:52:11
【问题描述】:

我需要查看所有文件夹(包括当前文件夹)的更改。所以我用了

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 使用率。

我做错了什么?

【问题讨论】:

  • 澄清显而易见的事实:您确定这是 CPU 使用率高低之间的唯一变化 (. -> api),还是测试之间有其他变化?
  • watch 任务本身不负责 CPU 使用率。请向我们展示您的start 任务及其正在做什么。
  • @JamesThorpe 我再次仔细检查了它。我在帖子中描述的情况仍然如此。我还在问题中添加了start 代码。
  • 其他文件夹不包含某种构建文件,是吗?喜欢“监视”任务的结果?当 buld 结果未从 watch glob 中排除时,我有时会意外地陷入无限循环。
  • @Hedge 你在看node_modules吗?

标签: javascript node.js gulp


【解决方案1】:

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

  • 据称这已在 gulp 4.0(2018 年 12 月发布)中得到修复,但有reports 类似问题。
  • 对于

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

    (默认为 100)

  • @Sven's advice 也很好——可能没有理由监视您的 node_modules 或构建文件夹。

【讨论】:

  • 即使在升级到 4.0 之后我也遇到了这个问题 - 一开始 CPU 使用率几乎是 0%,但经过一段时间(几个小时)后,它会达到 100%原因(github.com/gulpjs/gulp/issues/2245)。 AFAIK interval 选项已被删除...
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 哦,我怎么能错过。当然是因为node_modules
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多