我有一个与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
所做的更改:
- 我评论了所有的grunt.loadNpmTasks,但grunt.loadNpmTasks('grunt-contrib-watch')[这是因为ngbp稍后重命名了任务];
- 我添加了require('jit-grunt')(grunt); after grunt.loadNpmTasks('grunt-contrib-watch');
- 我将 spawn: false 添加到 delta: { options: {livereload: true, spawn: false} ...}。