咕噜咕噜的任务在 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

我的一些咕噜咕噜文件:

'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

我在带有 i7 处理器、16GB 内存、SSD 的 MacOS 10.8 上运行......需要这么长时间是正常的吗?是什么让繁重的任务(尤其是"加载任务")如此缓慢?

注意:我在一台流浪机器内,并从那里运行咕噜咕噜命令。如果我在我的本机系统上运行 grunt 命令,它会快得多(loading tasks需要 1.6 秒而不是 14.3 秒)。

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

我对Vagrant和Yeomans角度生成器有完全相同的问题。运行grunt serve后,编译 sass、重新启动服务器等需要将近 30 秒。

我已经使用过 NFS,但它仍然很慢。然后我尝试了抖动咕噜咕噜,及时咕噜咕噜加载器。我用jit-grunt替换了加载grunt任务,现在一切都快多了。

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

我在流浪虚拟框中使用grunt。(乌班图12.04)。我的本机文件位于我的主机 (OSx) 上。由于繁重的任务是io密集型的,并且它们通过文件共享运行,因此它们非常慢。

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

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

用于运行子任务loading grunt tasks

  • 原生:1.2秒
  • 带 NFS:4s
  • 流浪者文件共享:16s

如果只有一个特定任务花费大量时间,则此特定任务可能是问题所在。要进行故障排除,请使用时间咕噜声:https://npmjs.org/package/time-grunt。

我也遇到了问题,并发现:

nospawn: true

成为最快的选择。我从 ~20 秒到 ~1 秒来连接、缩小和丑化 JS。

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

使用抖动咕噜声将时间减少到 10 秒。使用 spawn:false 后,即使第一次加载时没有减少,更改也只需要不到 1 秒(0.086 秒)才能传播到浏览器!(是的!

我对Gruntfile.js所做的更改:

  1. 我评论了所有的grunt.loadNpmTasks,但grunt.loadNpmTasks('grunt-contrib-watch')[这是因为ngbp稍后重命名了任务];
  2. 我添加了require('jit-grunt')(grunt); after grunt.loadNpmTasks('grunt-contrib-watch');
  3. 我将 spawn: false 添加到 delta: { options: {livereload: true, spawn: false} ...}

最新更新