【问题标题】:Grunt tasks are slow in yeoman applicationyeoman 应用程序中的 Grunt 任务很慢
【发布时间】:2014-01-15 13:51:11
【问题描述】:

我有一个使用 yeoman 构建的 Angular 项目,与 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... 需要这么长时间是正常的吗?是什么让 grunt 任务(尤其是“加载任务”)如此缓慢?

注意:我在 vagrant 机器中 ssh,并从那里运行 grunt 命令。如果我在本机系统上运行 grunt 命令,它会快得多(loading tasks 需要 1.6 秒而不是 14.3 秒)。

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

【问题讨论】:

  • 我也遇到了同样的问题。似乎 imagemin 需要永远(grunt serve --verbose --debug 暴露了这一点)。你想出解决方案了吗?

标签: ruby-on-rails angularjs gruntjs yeoman


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    用于运行子任务loading grunt tasks

    • 原生:1.2s
    • 使用 nfs:4 秒
    • vagrant 文件共享:16s

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

    【讨论】:

    • 谢谢@pinouchon。这正是我遇到的问题,您的解决方案有所帮助。上升。
    【解决方案3】:

    我也遇到过问题,并且发现:

    nospawn: true
    

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

    【讨论】:

    • 这个。就我而言,我有一个 browserify 监视任务正在运行,它需要 7 秒才能在更改时重新编译。将这个(嗯,“spawn: false”)添加到 watch:browserify 的选项部分后,它下降到 1 秒。
    【解决方案4】:

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

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

    我对@9​​87654322@所做的更改:

    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} ...}

    【讨论】:

    • 改变这一点,我从 34 秒(一个大文件)到 259 毫秒......这简直太疯狂了。
    猜你喜欢
    • 2014-05-12
    • 2014-03-20
    • 2014-05-11
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多