我有一个与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。)
因此共享文件系统可能是个问题。但为什么......
答案 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
如果只有特定任务需要花费大量时间,那么这个特定任务可能就是问题所在。要进行问题排查,请使用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
所做的更改: