自动化构建工具gulp
1、优点
1.1 易于使用
通过代码优于配置的策略,gulp让简单的任务简单,复杂的任务可管理
1.2 构建快速
利用node.js流的威力,你可以快速构建项目并减少频繁的IO操作
1.3 插件高质
gulp严格的插件指南确保插件如你期望的那样简洁高质的工作
1.4 易于学习
通过最少的API,掌握gulp毫不费力,构建工作尽在掌握:如同一系列流管道
2、gulp使用说明
2.1 安装
在工程根目录下进入cmd
初始化npm,在项目根目录下新建package.json文件
npm init
全局环境下安装 gulp,且保存到package.json中
npm install gulp -g --save-dev
npm install module-name -save 自动把模块和版本号添加到dependencies部分
npm install module-name -save-dev 自动把模块和版本号添加到devdependencies部分
2.2 配置gulpfile.js
在项目根目录下创建一个gulpfile.js文件,并进行相关配置
详细的方法说明后面会提到
2.2.1 引入gulp插件
var gulp = require('gulp'),
uglify = require('gulp-uglify'),
jshint = require('gulp-jshint'),
concat = require('gulp-concat'),
watch = require('gulp-watch'),
clean = require('gulp-clean'),
minifycss = require('gulp-minify-css'),
prefixAndSuffix = require('gulp-prefix-suffix');
2.2.2 合并压缩js
//合并JS文件到build/all.min.js
gulp.task('combine', function(){
return gulp.src(['src/**/*.js','!src/lib/**/*.js','!src/app.js','!src/main.js'])
.pipe(jshint())
.pipe(jshint.reporter('default'))
.pipe(concat('all.min.js'))
.pipe(prefixAndSuffix("define(['app'], function(app){","});"))
.pipe(uglify())
.pipe(gulp.dest('build'));
});
2.2.3 合并压缩css
//合并JS文件到build/all.min.js
gulp.task('combine', function(){
return gulp.src(['src/**/*.js','!src/lib/**/*.js','!src/app.js','!src/main.js'])
.pipe(jshint())
.pipe(jshint.reporter('default'))
.pipe(concat('all.min.js'))
.pipe(prefixAndSuffix("define(['app'], function(app){","});"))
.pipe(uglify())
.pipe(gulp.dest('build'));
});
2.2.4 压缩图片
//合并压缩CSS文件
gulp.task('css', function(){
return gulp.src(['src/**/*.css','!src/lib/**/*.css'])
.pipe(concat('all.min.css'))
.pipe(minifycss())
.pipe(gulp.dest('build'));
});
2.2.4 压缩图片
gulp.task('images', function() {
return gulp.src('src/images/**/*')
.pipe(imagemin({ optimizationLevel: 5, progressive: true, interlaced: true }))
.pipe(gulp.dest('dist/assets/img'))
.pipe(notify({ message: 'Images task complete' }));
});
optimizationLevel设置为3表示对所有来源的image进行压缩处理,设置位5表示仅对新的或者有改动的image进行压缩
2.2.5 清空build
//清空build
gulp.task('clean', function(){
return gulp.src('build')
.pipe(clean());
});
2.2.6 拷贝文件
对于没有进行压缩的html和lib中引用的第三方插件或库框架和压缩合并好的js,css,image等文件,要从开发目录拷贝到工程运行目录
//拷贝html、图片等到build
gulp.task('copyOther', function(){
return gulp.src(['src/**/*','!src/**/*.js'])
.pipe(gulp.dest('build'));
});
//拷贝lib文件夹
gulp.task('copyLib', function(){
return gulp.src('src/lib/**/*.js')
.pipe(gulp.dest('build/lib'));
});
//拷贝app.js和main.js
gulp.task('copyJs', function(){
return gulp.src(['src/app.js','src/main.js'])
.pipe(gulp.dest('build'));
});
2.2.7 文件改动监控
gulp.task('watch', function(){
gulp.watch('src/**/*',['default']);
})
2.3 gulp模块方法说明
|
glob:可以是一个直接的文件路径。他的含义是模式匹配。gulp将要处理的文件通过管道(pipe())API导向相关插件。通过插件执行文件的处理任务。
2.3.1 src()
gulp的src方法用于产生数据流,它的参数表示想要处理的文件,这些指定的文件会转换为数据流。参数的写法一般有以下几种形式。
|
|---|
src方法的参数还可以是一个数组,用来指定多个成员
gulp.src(['js/**/*.js', '!js/**/*.min.js'])
2.3.2 dest()
dest方法将管道的输出写入文件,同时将这些输出继续输出,所以可以依次调用多次dest方法,将输出写入多个目录。如有目录不存在,将会被新建
gulp.src('./client/templates/*.jade')
.pipe(jade())
.pipe(gulp.dest('./build/templates'))
.pipe(minify())
.pipe(gulp.dest('./build/minified_templates'));
dest方法还可以接受第二个参数,表示配置对象
gulp.dest('build', { cwd: './app', mode: '0644' })
配置对象有两个字段,cwd字段指定写入路径的基准目录,默认是当前目录;mode字段指定写入目录的权限,默认是0777.
2.3.3 task()
task方法用于定义具体的任务。它的第一个参数是任务名,第二个参数是任务函数
gulp.task('greet', function () {
console.log('Hello world!');
});
task方法还可以按指定顺序执行一组任务
gulp.task('build', ['css', 'js', 'imgs']);
上面代码先指定build任务,它由css、js、imgs三个任务所组成,task方法会并发执行这三个任务。注意,由于每个任务都是异步调用,所以没有办法保证js任务的开始运行的时间,正是css任务运行结束。
如果希望各个任务严格按次序运行,可以把前一个任务写成后一个任务的依赖模块。
gulp.task('css', ['greet'], function () {
// Deal with CSS here
});
上面代码表明,css任务依赖greet任务,所以css一定会在greet运行完成后再运行。
task方法的回调函数,还可以接受一个函数作为参数,这对执行异步任务非常有用。
// 执行shell命令
var exec = require('child_process').exec;
gulp.task('jekyll', function(cb) {
// build Jekyll
exec('jekyll build', function(err) {
if (err) return cb(err); // return error
cb(); // finished task
});
});
如果一个任务的名字是default,就表明它是默认任务,在命令行直接输入gulp命令,就会运行该任务
gulp.task('default', ['styles', 'jshint', 'watch']);
直接使用gulp,就会运行styles,jshint,watch三个任务
2.3.4 watch()
watch方法用于指定需要监控的文件,一旦这些文件发送变动,就运行指定任务
当然也可以用回调函数代替指定任务
gulp.task('watch', function(){
gulp.watch('src/**/*',['default']);
})
//或者
gulp.task('watch', function(){
gulp.watch('src/**/*',function(){
//do something
});
})
另一种写法是watch方法所监控的文件发送变动时,可能会触发一些事件,如:
change:文件发送变动时触发
end:回调函数运行完毕时触发
error:发生错误时触发
ready:当开始监听文件时触发
nomatch:没有匹配的监听文件时触发
2.4 gulp plugins
常用插件
|
sass的编译 自动添加css前缀 压缩css js代码校验 合并js代码 压缩js代码 压缩图片 自动刷新页面 图片缓存(只有图片替换了才压缩) 更改提醒 清除文件 |
(gulp-ruby-sass) (gulp-autofixer) (gulp-minify-css) (gulp-jshint) (gulp-concat) (gulp-uglify) (gulp-imagemin) (gulp-livereload) (gulp-cache) (gulp-notify) (gulp-clean) |
|---|
http://gulpjs.com/plugins/ 在gulp官网还有很多可选择的插件,大约600多个,这些插件的核心是,一个插件只做一件事!
3、gulp and grunt
3.1 工作流程

grunt的工作流程:读文件、修改文件、写文件、读文件、修改文件、写文件.....
gulp的工作流程:文件流--文件流--文件流......因为grunt操作会创建临时文件,会有频繁的IO操作,而gulp使用的是流操作,一直是在内存中处理,直到输出结果, 因此gulp在效率上确实远胜grunt。
3.2 差异和不同
- 流:Gulp是一个基于流的构建系统,使用代码优于配置的策略。
- 插件:Gulp的插件更纯粹,单一的功能,并坚持一个插件只做一件事。
- 代码优于配置:维护Gulp更像是写代码,而且Gulp遵循CommonJS规范,因此跟写Node程序没有差别。
- 没有产生中间文件
3.3 I/O流程的不同
- 使用grunt的I/O过程中会产生一些中间态的临时文件,一些任务生成临时文件,其他任务可能会基于临时文件再做处理并生成最终构建后的文件
- 使用gulp的优势就是利用流的方式进行文件的处理,通过管道将多个任务和操作连接起来,因此只有一次I/O的过程,流程更清晰,更纯粹
4、 参考资料
- http://www.gulpjs.com.cn/ gulp中文官网
- http://javascript.ruanyifeng.com/tool/gulp.html#toc2 Gulp:任务自动管理工具 -- JavaScript 标准参考教程(alpha)
- http://www.techug.com/gulp Gulp使用指南
- http://segmentfault.com/a/1190000002580846 使用gulp构建你的前端项目
自动化构建工具gulp的更多相关文章
- 前端自动化构建工具gulp的使用总结
前端自动化构建工具gulp的使用总结 博主最近偶的空闲,在此对gulp的使用做一个总结,让小伙伴知道如何合理的使用gulp以及gulp的使用技巧. 谈到gulp,有人可能就会想到另外一个构建工具gru ...
- 前端自动化构建工具——gulp
gulp是基于流的前端自动化构建工具. 一.环境配置 gulp是基于nodejs的,所以没有 nodejs 环境的要先去安装好 然后给系统配上gulp环境 npm install -g gulp 再到 ...
- 前端自动化构建工具 Gulp 使用
一个月没写博客了,今天有时间,就写个gulp的入门使用吧.. 简介:gulp是一个前端自动化构建工具,可以实现代码的检查.压缩.合并……等等,gulp是基于Node.js的自动任务运行器 一.安装No ...
- 前端自动化构建工具--Gulp&&Webpack
前端构建工具的作用可以认为是对源项目文件或资源进行文件级处理,将文件或资源处理成需要的最佳输出结构和形式. 在处理过程中,我们可以对文件进行模块化引入.依赖分析.资源合并.压缩优化.文件嵌入.路径替换 ...
- 前端自动化构建工具 gulp 学习笔记 一、
一.我对gulp的初期理解 是一种前端辅助开发工具 可以帮你把js,css,img等文件 合并.压缩,图片好像是合并为精灵图,合并为精灵图之后,还会生成一个css样式表. 官方解说是:基于流的自动化构 ...
- 基于流的自动化构建工具------gulp (简单配置)
项目上线也有一阵子,回头过来看了看从最初的项目配置到开发的过程,总有些感慨,疲软期,正好花点时间,看看最初的配置情况 随着前端的发展,前端工程化慢慢成为业内的主流方式,项目开发的各种构建工具,也出现了 ...
- 前端自动化构建工具-gulp
gulp 和grunt这两个是我知道的自动构建工具,但是说实话都没在项目中用过,不太清楚自动化构建是什么意思, 1.grunt和gulp有什么相同点和不同点? (1).易于使用:采用代码优于配置策略, ...
- 前端自动化构建工具——gulp环境搭建教程
gulp是前端工程化的工具,它可以对html,css,js等代码和图片进行压缩,也可以对sass和less等预处理语言进行编译,代码部署.gulp学起来简单,用起来方便,大大提高我们工作效率. 这里可 ...
- 自动化构建工具gulp简单介绍及使用
一.简介及安装: gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器:她不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成:使用她,我们不仅可以很愉快 ...
- 自动化构建工具--gulp的初识和使用
gulp 首先:什么是gulp? gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器:她不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成:使用她,我 ...
随机推荐
- BZOJ1611: [Usaco2008 Feb]Meteor Shower流星雨
1611: [Usaco2008 Feb]Meteor Shower流星雨 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 904 Solved: 393 ...
- ACM生活总结
两年ACM生活总结 转眼已经踏入ACM这条不归路已经两年了, 深深的感觉到ACM的不易 和 艰辛,但同时ACM给我所带来的快乐,让我认为值一切都是值得的. 我刚上大学那会,我们学校的ACM刚刚起步不到 ...
- 【转】[Java] HashMap使用的示例
原文网址:http://kings11347.blog.163.com/blog/static/56047032201212895416436/ import java.util.HashMap; i ...
- 一招解决IE7无法访问https网页
很多人都遇到过这种情况: 自己的IE访问不了https的网页了,如果你百度的话,有人会告诉你注册一堆的dll文件,或者更改IE设置啦什么的.上午,我也遇到这个问题,这些方法都不管用.请教了高手,将方法 ...
- linq里的select和selectmany操作 投影运算
原文地址:https://msdn.microsoft.com/zh-cn/library/bb546168.aspx#Mtps_DropDownFilterText 投影运算 其他版本 投影 ...
- Codeforces Round #324 (Div. 2)解题报告
---恢复内容开始--- Codeforces Round #324 (Div. 2) Problem A 题目大意:给二个数n.t,求一个n位数能够被t整除,存在多组解时输出任意一组,不存在时输出“ ...
- qconf 介绍
转载自:http://www.tuicool.com/articles/BJfiMbr 360 如何用 QConf 搞定 2W+ 服务器的配置管理 时间 2015-06-29 09:27:47 佚名 ...
- Heavy Transportation
题目大意: 雨果的沉重运输是快乐的,当浮空运输出现故障时候他可以扩展业务, 但他需要一个聪明的人告诉他是否真的是一种把他的客户构建了巨型钢起重机的地方需要的所有街道都可以承受重量(这句是直接有道翻译的 ...
- Java GC CMS 日志分析
https://blogs.oracle.com/poonam/entry/understanding_cms_gc_logs 笔者对其中某几条记录又进行了详细说明,以下是一条完整的CMS日志记录的示 ...
- BDD框架之lettuce---python3.+安装报错
跟虫师学习python,学到BDD框架之lettuce( http://www.cnblogs.com/fnng/p/3415609.html),发现python3.5环境下安装lettuce后无法正 ...