gulp vs grunt 编译速度
grunt任务
用了gulp
很久了,但是一直感觉gulp的任务比较卡顿,光标一直闪,卡顿半天,而grunt
则比较顺畅。
但是按照gulp
官方的宣传,基于nodejs stream
流的gulp
应该比grunt
快才对啊
gulp任务
gulpfile.js
var gulp = require('gulp'),
plugins = require('gulp-load-plugins')({
pattern: ['gulp-*', 'imagemin-pngquant'],
replaceString: /\bgulp[\-.]/,
lazy: true,
camelize: true
}),
option = {
buildPath: "../dist/profile"
};
//构建目录清理
gulp.task("clean", function (done) {
return gulp.src(option.buildPath)
.pipe(plugins.clean({
read: false,
force: true
}));
})
//图片
gulp.task('imgmin', function () {
return gulp.src("../img/*")
//.pipe(plugins.cache(plugins.imagemin({
// optimizationLevel: 7, //类型:Number 默认:3 取值范围:0-7(优化等级)
// progressive: true,//类型:Boolean 默认:false 无损压缩jpg图片
// interlaced: true,//类型:Boolean 默认:false 隔行扫描gif进行渲染
// multipass: true,//类型:Boolean 默认:false 多次优化svg直到完全优化
// svgoPlugins: [{removeViewBox: false}]//不要移除svg的viewbox属性
// //use: [plugins.imageminPngquant()]//可以压缩70% //使用pngquant深度压缩png图片的imagemin插件
//}))
//.on('data', function (data) {
// console.log(data.relative);
//})
.pipe(gulp.dest(option.buildPath + '/img/'));
});
//js文件压缩
gulp.task('jsmin', function () {
return gulp.src(["../js/**/*.js", '!../js/libs/*.js'])
.pipe(plugins.uglify())
.pipe(gulp.dest(option.buildPath + "/js/"))
});
//需要合并和压缩的文件
gulp.task('concat', function () {
return gulp.src(['../js/libs/angular.min.js', '../js/libs/*.js', '!../js/libs/bridge*.js'])
.pipe(plugins.concat('libs.min.js'))
.pipe(plugins.uglify())
.pipe(plugins.addSrc('../js/libs/bridge*.js'))
.pipe(plugins.uglify())
.pipe(gulp.dest(option.buildPath + "/js/libs/"))
});
gulp.task("processhtml", function () {
var date = new Date().getTime();
return gulp.src('../main.html')
.pipe(plugins.replace(/_VERSION_/gi, date))
.pipe(plugins.processhtml())
.pipe(plugins.htmlmin({
collapseWhitespace: true
}))
.pipe(gulp.dest(option.buildPath + '/'))
})
//压缩css
gulp.task("cssmin", function () {
return gulp.src("../style/*.css")
.pipe(plugins.minifyCss())
.pipe(gulp.dest(option.buildPath + '/style'))
})
//压缩html文件
gulp.task("htmlmin", function () {
return gulp.src('../views/*.html')
.pipe(plugins.htmlmin({
collapseWhitespace: true
}))
.pipe(gulp.dest(option.buildPath + '/views'))
})
// 默认任务 清空图片、样式、js并重建 运行语句 gulp
gulp.task('default', ['clean'], function () {
return gulp.start('jsmin', 'cssmin', 'processhtml', "htmlmin", 'imgmin', 'concat');
});
gruntfile
//2016/01/13 By Reeoo Shen
'use strict';
module.exports = function (grunt) {
// Project configuration.
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
paths: { //自定义变量
tmp: '.tmp', //临时目录
build: '../dist/', //清除目录
dist: '../dist/profile/',
getReplacedStr: function () {
var time = new Date(),
year = time.getFullYear(),
month = time.getMonth() + 1 < 10 ? "0" + (time.getMonth() + 1) : time.getMonth() + 1,
day = time.getDate() < 10 ? "0" + time.getDate() : time.getDate(),
hour = time.getHours() < 10 ? "0" + time.getHours() : time.getHours(),
minute = time.getMinutes() < 10 ? "0" + time.getMinutes() : time.getMinutes(),
second = time.getSeconds() < 10 ? "0" + time.getSeconds() : time.getSeconds();
return year + '-' + month + '-' + day + '-' + hour + '-' + minute + '-' + second;
}
},
//清除目录
clean: {
clear: ['<%= paths.tmp %>', '<%= paths.dist %>'],
options: {
force: true
}
},
//css文件压缩
cssmin: {
options: {
//美化代码
beautify: {
//中文ascii化,非常有用!防止中文乱码的神配置
ascii_only: true
}
},
minify: {
expand: true, //如果设为true,就表示下面文件名的占位符(即*号)都要扩展成具体的文件名。
cwd: '../style/', //需要处理的文件(input)所在的目录。
src: ['*.css'], //表示需要处理的文件。如果采用数组形式,数组的每一项就是一个文件名,可以使用通配符。
dest: '<%= paths.dist %>/style/', //表示处理后的文件名或所在目录。
ext: '.css' //表示处理后的文件后缀名。
}
},
//文件拷贝
copy: {
image: {
files: [
{
expand: true,
cwd: '../img/',
src: ['../img/**/**'],
dest: '<%= paths.dist %>/img/'
}
]
}
}, //!../js/libs/*.js
//js压缩
uglify: {
jsmin: {
//当'minify'任务运行时Grunt将自动在"lib/"下搜索"**/*.js", 然后构建适当的src-dest文件映射,因此你不需要在文件添加或者移除时更新Gruntfile
files: [{
expand: true, //启用动态扩展
cwd: '../js/', //批匹配相对lib目录的src来源
src: ['../js/**/**/*.js', '!../js/libs/*.js'],
dest: '<%= paths.dist %>/js/' //目标路径前缀
}]
},
bridge: {
files: [{
expand: true, //启用动态扩展
cwd: '../js/libs/', //批匹配相对lib目录的src来源
src: 'bridge*.js',
dest: '<%= paths.dist %>/js/libs/' //目标路径前缀
}]
},
single: {
src: ['<%= paths.dist %>/js/libs/libs.min.js'],
dest: '<%= paths.dist %>/js/libs/libs.min.js',
}
},
//js合并
concat: {
options: {
separator: ';',
},
dist: {
src: ['../js/libs/angular.min.js', '../js/libs/*.js', '!../js/libs/bridge*.js'],
dest: '<%= paths.dist %>/js/libs/libs.min.js',
},
},
//html压缩
htmlmin: { // Task
dist: { // Target
options: { // Target options
removeComments: true,
collapseWhitespace: true
},
files: [{
expand: true, //启用动态扩展
cwd: '../views/', //批匹配相对lib目录的src来源
src: '*.html',
dest: '<%= paths.dist %>/views/' //目标路径前缀
}],
},
single: {
options: { // Target options
removeComments: true,
collapseWhitespace: true
},
files: {
'<%= paths.dist %>/main.html': '<%= paths.dist %>/main.html'
}
}
},
//引用替换
processhtml: {
files: {
src: '<%= paths.dist %>/main.html',
dest: '<%= paths.dist %>/main.html'
}
},
//字符串替换
replace: {
dist: {
options: {
patterns: [
{
match: /_VERSION_/gi,
replacement: '<%= paths.getReplacedStr() %>'
}
]
},
files: [
{
src: ['../main.html'],
dest: '<%= paths.dist %>main.html'
}
]
}
},
//生成压缩包
zip: {
'using-delate': {
src: ['<%= paths.dist %>**/**/*'],
dest: '<%= paths.build %><%= pkg.name %><%= paths.getReplacedStr()%>.zip',
compression: 'DEFLATE' //压缩
},
}
});
grunt.loadNpmTasks('grunt-contrib-clean'); //清除目录和临时文件
grunt.loadNpmTasks('grunt-contrib-copy'); //拷贝文件
grunt.loadNpmTasks('grunt-contrib-jshint'); //检查js语法错误
grunt.loadNpmTasks('grunt-contrib-concat'); //合并文件
grunt.loadNpmTasks('grunt-contrib-uglify'); //压缩代码
grunt.loadNpmTasks('grunt-contrib-cssmin'); //css压缩
grunt.loadNpmTasks('grunt-contrib-htmlmin'); //压缩html
grunt.loadNpmTasks('grunt-contrib-compress'); //压缩html
grunt.loadNpmTasks('grunt-processhtml'); //处理html文件
grunt.loadNpmTasks('grunt-replace'); //处理html文件
grunt.loadNpmTasks('grunt-zip'); //生成zip包
//执行各模块的方法
grunt.registerTask('default', ['clean', 'cssmin', 'concat', 'uglify', 'copy', 'replace', 'processhtml', 'htmlmin', 'zip']);
//warning:
//生成zip包的路径不正确,会多出3级,暂时没找到解决方法,试了N个插件,没解决
};
上面的是两个file
的对比,请忽略两个执行的任务不一样多,因为就算改成一样多,还是gulp
比较卡顿,请问大神,这是什么原因,是不是我gulp
用的姿势不对?请指教
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
怎么感觉gulp就是卡在concat这个任务?而你的grunt恰好没这个任务。
没任何意义的比较。完全是喜欢萝卜还是喜欢白菜的问题。喜欢维护配置文件就会去用 Grunt,喜欢写任务处理函数的就会去用 Gulp。
改成
绝对是gulp快,因为是基于流的。
请参见我之前的回答 http://segmentfault.com/q/1010000003951849/a-1020000003952258,
另外任何比较都是建立在外部条件相同情况下,首先确保相同的处理流程,并且插件背后用的库是相同的。
没有人知道么???