摘要:

   gulp与grunt一样,都是自动构建工具。和grunt相比它更突出一个流的概念,任务是一个接一个执行的。今天就分享如何用gulp做自动化。

安装:

  gulp也是基于node环境,所以安装gulp之前你需要安装node.js。

   npm install -g gulp

只要在命令窗口中执行上面一行命令就完成安装,这样安装的是全局安装。在项目中一般是通过package.json中的devDependencies属性来安装。如下:

{
"name": "",
"version": "0.0.0",
"description": "",
"main": "gulpfile.js",
"dependencies": {},
"devDependencies": {
"gulp": "~3.5.6"
},
"license": "ISC"
}

执行npm install就会将gulp安装到当前项目中。

如何运行:

  安装完gulp之后,需要新建一个gulpfile.js文件,一般是在项目的根目录,与package.json放在一块。那gulpfile.js文件里面到底写什么呢?当然是定义一些任务。如下:

var gulp = require('gulp');

gulp.task('default', function() {
// 执行任务
});

然后在当前目录中通过命令窗口执行gulp,default里面的任务就会被执行。

配置参数:  

gulp.src(globs[, options])

  加载文件,并将文件以流的方式传到插件中,如下:

gulp.src('client/templates/*.jade')
.pipe(jade())
.pipe(minify())
.pipe(gulp.dest('build/minified_templates'));

gulp首先会加载client/templates/下的所有jade文件,然后分别传递给jade插件、minify插件,然后输出到build/minified_templates中。

globs

  类型:String,Array

  文件或者是路径,多个文件以数组的形式。

options

  类型:Object

  gulp通过options将配置参数传递给node

options.buffer

  类型:bool

  默认值: false

  是否将文件以流的方式返回,false设置文件内容以流的方式读取,并且不缓存,对于大文件设置缓存将是非常有用的。

options.read

  类型:bool

  默认值:true  

  设置是否读取文件,如果设置false将永远不读取文件

options.base

  类型: String

  设置输出文件的根目录,如下:

gulp.src('client/js/**/*.js') // Matches 'client/js/somedir/somefile.js' and resolves `base` to `client/js/`
.pipe(minify())
.pipe(gulp.dest('build')); // Writes 'build/somedir/somefile.js' gulp.src('client/js/**/*.js', { base: 'client' })
.pipe(minify())
.pipe(gulp.dest('build')); // Writes 'build/js/somedir/somefile.js'

gulp.dest(path[, options])

  输出文件,可以输出到不同目录下,如果目录不存在就创建,如下:

gulp.src('./client/templates/*.jade')
.pipe(jade())
.pipe(gulp.dest('./build/templates'))
.pipe(minify())
.pipe(gulp.dest('./build/minified_templates'));

path

  类型: String,Function

  设置输出文件的路径

options.cwd

  类型: String

  默认值: process.cwd()

  输出的文件夹,只有当路径为相对路径时才起作用

options.mode

  类型:String

  默认值:0777

  设置输出文件的权限

gulp.task(name[, deps], fn)

定义一个任务,如下:

gulp.task('somename', function() {
// Do stuff
});

name

任务名,调用任务是只需要gulp.run(任务名)

deps

  类型:Array

  执行当前任务所需要依赖的任务,被依赖的任务会在当前任务执行之前执行。注意异步任务

fn

  需要执行的任务都定义在此处

异步执行任务:

使用回调函数

// run a command in a 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
});
});

返回一个文件流

gulp.task('somename', function() {
var stream = gulp.src('client/**/*.js')
.pipe(minify())
.pipe(gulp.dest('build'));
return stream;
});

使用promise

var Q = require('q');

gulp.task('somename', function() {
var deferred = Q.defer(); // do async stuff
setTimeout(function() {
deferred.resolve();
}, 1); return deferred.promise;
});

注意任务依赖关系,下面是一个例子:

var gulp = require('gulp');

// takes in a callback so the engine knows when it'll be done
gulp.task('one', function(cb) {
// do stuff -- async or otherwise
cb(err); // if err is not null and not undefined, the run will stop, and note that it failed
}); // identifies a dependent task must be complete before this one begins
gulp.task('two', ['one'], function() {
// task 'one' is done now
}); gulp.task('default', ['one', 'two']);

gulp.watch(glob [, opts], tasks) or gulp.watch(glob [, opts, cb])

监听文件,当文件发生变化时,定义的任务将会被执行。如下当js文件发生改变时会触发change事件。

var watcher = gulp.watch('js/**/*.js', ['uglify','reload']);
watcher.on('change', function(event) {
console.log('File ' + event.path + ' was ' + event.type + ', running tasks...');
});

或者:

gulp.watch('js/**/*.js', function(event) {
console.log('File ' + event.path + ' was ' + event.type + ', running tasks...');
});

  

实例:

下面是一个简单的例子,实现js、css的压缩合并。

package.json安装模块

{
"name": "",
"version": "0.0.0",
"description": "",
"main": "gulpfile.js",
"dependencies": {},
"devDependencies": {
"gulp": "~3.5.6",
"gulp-minify-css": "~0.3.0",
"gulp-uglify": "^1.0.0",
"gulp-concat": "~2.0.0",
"gulp-rename": "^1.0.0"
},
"license": "ISC"
}

gulpfile.js

var gulp = require('gulp');

// 加载模块
var
minifycss = require('gulp-minify-css'), // CSS压缩
uglify = require('gulp-uglify'), // js压缩
concat = require('gulp-concat'), // 合并文件
rename = require('gulp-rename'); // 重命名 // 合并、压缩、重命名css
gulp.task('min-styles', function() {
gulp.src(['./static/css/*.css'])
.pipe(concat('all.css'))
.pipe(gulp.dest('./static/build/css/'))
.pipe(rename({ suffix: '.min' }))
.pipe(minifycss())
.pipe(gulp.dest('./static/build/css'));
}); // 合并,压缩js文件
gulp.task('min-javascripts', function() {
gulp.src('./static/js/*.js')
.pipe(concat('all.js'))
.pipe(gulp.dest('./static/build/js'))
.pipe(rename({ suffix: '.min' }))
.pipe(uglify())
.pipe(gulp.dest('./static/build/js'));
}); // 定义develop任务发布或者运行时使用
gulp.task('develop',function(){
gulp.run('min-styles','min-javascripts');
}); // gulp命令默认启动的就是default
gulp.task('default', function() { // 监听.css文件,一旦有变化,立刻调用min-styles任务执行
gulp.watch('./css/*.css', ['min-styles']); gulp.run('develop');
});

在gulpfile.js文件目录下,通过命令窗执行gulp,则default任务就会执行。

自动构建工具Gulp的更多相关文章

  1. 前端自动构建工具@gulp入门

    gulp是一个自动化的前端工具.它可以利用自身的插件来实现一些功能,如sass.less编译:浏览器自动刷新,文件压缩.重命名.代码校验(个人使用sublime的插件进行校验)等功能.当然这些功能也可 ...

  2. 前端自动构建工具Gulp入门

    基于nodeJs:通过不同插件能自动完成一系列动作,比如压缩js/css/img.解析模版标签.解析less等: 一.安装gulp 安装nodeJs 打开Node.js command prompt ...

  3. 关于node.js和npm,cnpm的安装记录以及gulp自动构建工具的使用

    关于node.js和npm,cnpm的安装记录以及gulp自动构建工具的使用   工作环境:window下 在一切的最开始,安装node.js (中文站,更新比较慢http://nodejs.cn/) ...

  4. 前端构建工具gulp使用

    前端自动化流程工具,用来合并文件,压缩等. Gulp官网 http://gulpjs.com/ Gulp中文网 http://www.gulpjs.com.cn/ Gulp中文文档 https://g ...

  5. (转载)前端构建工具gulp使用

    前端构建工具gulp使用 前端自动化流程工具,用来合并文件,压缩等. Gulp官网 http://gulpjs.com/ Gulp中文网 http://www.gulpjs.com.cn/ Gulp中 ...

  6. 前端构建工具gulp

    前端构建工具gulp使用   前端自动化流程工具,用来合并文件,压缩等. Gulp官网 http://gulpjs.com/ Gulp中文网 http://www.gulpjs.com.cn/ Gul ...

  7. 怎么在项目中使用前端包管理器bower和构建工具gulp

    下面以WeUI(微信官方网页开发样式库)介绍一下,怎么把WeUi引入到自己的项目中,我的开发环境Visual Studio 2012,当然了Visual Studio 2015对此已有了更好的支持(h ...

  8. 前端自动化构建工具-gulp

    gulp 和grunt这两个是我知道的自动构建工具,但是说实话都没在项目中用过,不太清楚自动化构建是什么意思, 1.grunt和gulp有什么相同点和不同点? (1).易于使用:采用代码优于配置策略, ...

  9. 构建工具-Gulp 相关知识

    layout: layout title: 『构建工具-Gulp』相关内容整理 date: 2017-04-26 22:15:46 tags: Gulp categories: Tools --- G ...

随机推荐

  1. 【进阶修炼】——改善C#程序质量(3)

    32, 总是优先考虑泛型. 泛型代码有很好的重复利用性,和类型安全性. 33, 应尽量避免在泛型类中声明静态成员. 静态成员达不到共享的目的.List<int>和List<Strin ...

  2. Mysql5.7主主互备安装配置

    一.安装说明 ======================================================================================= 环境:   ...

  3. Redis管道传输

    Redis是一个TCP服务器,并支持请求/响应协议.redis的一个请求完成需要下面的步骤: 客户端发送一个查询到服务器,并从套接字中读取,通常在封闭的方式,对服务器的响应. 服务器处理命令并将响应返 ...

  4. 连接两个点云中的字段或数据形成新点云以及Opennni Grabber初识

    (1)学习如何连接两个不同点云为一个点云,进行操作前要确保两个数据集中字段的类型相同和维度相等,同时了解如何连接两个不同点云的字段(例如颜色 法线)这种操作的强制约束条件是两个数据集中点的数目必须一样 ...

  5. JAVA多线程笔试题

    一.题目内容 二.我的答案 利用了线程池.考虑了超时处理.不知道这样写是否还有其他问题,或者更好更优的解决方案? import java.util.*; import java.util.concur ...

  6. Mac OS, Mac OSX 与Darwin

    作为收购 NeXT 公司的结果,苹果公司获得了 NeXTSTEP 架构中的 Mach 和 Objective-C 等设计.尽管 NeXTSTEP 本身已经不再发展了,但是其中的组件在 OS X 中获得 ...

  7. selenium+java-查找页面中包含关键字的URL

    package seleniumLearn1; import java.io.File; import java.io.FileOutputStream; import java.io.IOExcep ...

  8. 高通 fastboot 显示

    需要在fastboot里面添加功能用于保存,记录一下fastboot显示的过程. android O新添加了选项,如下 platform/msm_shared/rules.mk ifeq ($(ENA ...

  9. 目标跟踪之meanshift---meanshift2

    均值漂移,可以对非刚性物理进行跟踪,是分参数估计,过程是迭代的过程,对光和形态不敏感,缺点是检测目标是固定的,特征不较少,模板背景没有实时更新,没有目标的位置精度预测只是梯度浓聚, 原理: 用文字标书 ...

  10. (转)OpenGL ES编程入门资源集合

     出自:http://blog.csdn.net/u013467442/article/details/44498125     OpenGL ES 2.0中文手册:http://www.dreami ...