2

我有一个 Grunt watch 任务,在检测文件更改和开始工作之间似乎有很大的延迟。

常见的输出如下:

>> File "src/static/app/brandManager/addChannel.html" changed.

Running "html2js:main" (html2js) task
Successfully converted 13 html templates to js.

Done, without errors.


Execution Time (2014-02-11 01:38:27 UTC)
loading tasks  101ms  ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇ 17%
html2js:main   495ms  ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇ 83%
Total 597ms
... Reload src/static/app/brandManager/addChannel.html ...
Completed in 14.469s at Tue Feb 11 2014 12:38:28 GMT+1100 (EST) - Waiting...

在这里,我们看到实际工作只花了597ms,但总任务运行了14.469s

这是我的 Gruntfile 中的相关片段:

src: {
  js: ['src/static/app/**/*.js', '!src/static/app/**/*.spec.js'],
},

watch: {
  js: {
    files: ['<%= src.js %>'],
    tasks: ['fileblocks','newer:jshint:all'],
    options: {
      livereload: false
    }
  },
  livereload: {
    options: {
      livereload: '<%= connect.options.livereload %>'
    },
    files: [
      '<%= src.html %>',
      '.tmp/styles/{,*/}*.css',
      '<%= src.assets %>'
    ]
  }
}

调用哪个监视目标似乎无关紧要,总是有延迟。延迟的时间量不一致——介于 5 秒到 60 秒之间(但平均而言,大约 15 到 20 秒)。

这真的很刺激我的 js 氛围。我该如何调试可能是什么原因?

编辑:

正在观看的文件数量并不小,但远非巨大:

--- static/app ‹master› find -f . | wc -l      
    >>  51
4

3 回答 3

1

Grunt 任务的加载问题通常与缺乏特异性有关。尝试更具体地了解应该观看的文件,或者将观看内容拆分更多,以便找到加载问题的根本原因。

我会避免这种模式:

'.tmp/styles/{,*/}*.css',

...并改用它:

'.tmp/styles/**/*.css',

我有一位同事也在做同样的事情,他必须等待长达 3 分钟才能运行任务。在他换成第二个模式后,这一切都在 10 秒内完成。

我认为这与一个文件的数量无关,而与正则表达式的复杂性有关。如果您知道目录的结构以匹配第二种模式,则无需过度复杂化正则表达式......

此外,是否可以更具体地说明js文件的位置,例如使用:

src: {
    js: [
        'src/static/app/js/**/*.js',
        '!src/static/app/js/**/*.spec.js'
    ]
},

您是否尝试过更具体地运行任务,以了解问题所在,例如:

$ grunt watch:js
$ grunt watch:livereload
于 2014-02-17T21:02:14.430 回答
1

这将消除延迟。

options: {
   spawn: false,
}
于 2015-07-16T15:37:19.943 回答
0

如果您真的对追踪 IO 延迟感兴趣,可以使用dtrace这里有一个不错的教程。

于 2014-02-11T01:51:10.710 回答