在Yeoman应用程序中,Grunt任务很慢

时间:2014-01-15 13:51:12

标签: ruby-on-rails angularjs gruntjs yeoman

我有一个与yeoman建立的角度项目,与rails api后端交谈。

一切都很好,除了那些笨拙的任务非常缓慢。

当我运行grunt server --verbose时:

Execution Time (2014-01-15 13:37:55 UTC)
loading tasks         14.3s  ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇ 26%
server                  1ms  0%
preprocess:multifile   11ms  0%
clean:server           13ms  0%
concurrent:server     34.3s  ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇ 63%
autoprefixer            1ms  0%
autoprefixer:dist     369ms  ▇ 1%
connect:livereload     17ms  0%
watch                  5.8s  ▇▇▇▇▇▇▇▇▇ 11%
Total 54.8s

我的一些Gruntfile:

'use strict';
module.exports = function (grunt) {
  require('time-grunt')(grunt);
  require('load-grunt-tasks')(grunt);
  require('time-grunt')(grunt);

  grunt.initConfig({
    ...
  });

grunt.loadNpmTasks('grunt-preprocess');

  grunt.registerTask('server', function (target) {
    if (target === 'dist') {
      return grunt.task.run(['build', 'connect:dist:keepalive']);
    }

    grunt.task.run([
      'preprocess:multifile',
      'clean:server',
      'concurrent:server',
      'autoprefixer',
      'connect:livereload',
      'watch'
    ]);
  });

  grunt.registerTask('test', [
    'clean:server',
    'concurrent:test',
    'autoprefixer',
    'connect:test'
    //'karma'
  ]);

  grunt.registerTask('build', [
    'preprocess:multifile',
    'clean:dist',
    'useminPrepare',
    'concurrent:dist',
    'autoprefixer',
    'concat',
    'copy:dist',
    'cdnify',
    'ngmin',
    'cssmin',
    'uglify',
    'rev',
    'usemin'
  ]);

  grunt.registerTask('default', [
    'jshint',
    'test',
    'build'
  ]);

};

项目规模:

vagrant@vm ~code/myapp/app/scripts
$> find -name "*.js" | xargs cat | wc -l
10209

我在MacOS 10.8上运行i7处理器,16GB内存,SSD ......这是正常的需要这么长时间?是什么让笨蛋任务(尤其是“加载任务”)变得如此缓慢?

注意:我在流浪汉机器内ssh'd并从那里运行grunt命令。如果我在我的本机系统上运行grunt命令,它会更快(loading tasks需要1.6s而不是14.3。)

因此共享文件系统可能是个问题。但为什么......

4 个答案:

答案 0 :(得分:5)

我和Vagrant和Yeomans角度发生器有完全相同的问题。运行grunt serve后,编译sass,重启服务器等花了将近30秒。

我已经使用过NFS,但它仍然很慢。然后我尝试了jit-grunt,即时grunt加载器。我用jit-grunt替换了load-grunt-tasks,现在一切都快得多。

这是一篇关于JIT-Grunt的好文章: https://medium.com/written-in-code/ced193c2900b

答案 1 :(得分:4)

我在Vagrant虚拟框中使用grunt。 (ubuntu 12.04)。我的本机文件在我的主机(OSx)上。因为grunt任务是io密集型的,并且它们通过文件共享运行,这使得它们非常慢。

可以通过向Vagrant(http://docs.vagrantup.com/v2/synced-folders/nfs.html)添加nfs来改善这一点。这将使Vagrant与nfs共享文件,而不是默认的Vagrant文​​件共享。它会快一点,但不会太多。

为了比较,在我的机器上:

用于运行子任务loading grunt tasks

  • 原生:1.2s
  • 与nfs:4s
  • vagrant文​​件共享:16s

如果只有特定任务需要花费大量时间,那么这个特定任务可能就是问题所在。要进行问题排查,请使用time-grunt:https://npmjs.org/package/time-grunt

答案 2 :(得分:2)

我也有问题,并找到了:

nospawn: true

成为最快的选择。我从〜20s到~1s进行连续,缩小和uglify JS。

答案 3 :(得分:2)

我和Yeoman的ngbp发生器和Vagrant有同样的问题。即使使用nfs,模板上的简单更改大约需要30秒才能在浏览器中看到。

使用jit-grunt导致时间减少到10秒。使用spawn:false后,即使第一次加载没有减少,更改花费不到1秒(0.086秒)传播到浏览器! (是!)

我对Gruntfile.js所做的更改:

  1. 我评论了所有的grunt.loadNpmTasks,但是grunt.loadNpmTasks(' grunt-contrib-watch')[由于任务重命名ngbp后来会这样做];
  2. 我在grunt.loadNpmTasks(' grunt-contrib-watch')之后添加了 require(' jit-grunt')(grunt); ;
  3. 我将 spawn:false 添加到 delta:{options:{livereload:true, spawn:false } ...} 。< / LI>