Gulp学习版本为3.9.1
 
1. Gulp特点 
2. API 
gulp.src(globs[, options]) 输入文件:输入流gulp.dest(path[, options]) 输出文件:输出流gulp.task(name[, deps], fn) 任务化gulp.watch(glob[, opts], tasks) 监视 
3. 目录结构 1 2 3 4 5 6 7 8 9 10 11 12 |- dist |- src     |- js     |- css     |- less |- index.html |- gulpfile.js |- package.json     {         "name": "gulp_study",         "version": "1.0.0"     } 
4. 安装gulp 
1 2 3 4 5 6 7 8 var  gulp = require ('gulp' )gulp.task ('任务名' , function (      }) gulp.task ('default' , []) 
之后我们可以使用 gulp 任务名 来执行某个特定的任务,或者使用 gulp 来执行默认的任务序列(gulp4 已弃用) 
5. 常用的gulp插件 
sass的编译(gulp-sass)
less编译 (gulp-less)
重命名(为压缩的文件加’.min’)(gulp-rename)
自动添加css前缀(gulp-autoprefixer)
压缩css(gulp-minify-css)
js代码校验(gulp-jshint)
合并js/css文件(gulp-concat)
压缩js代码(gulp-uglify)
压缩图片(gulp-imagemin)
自动刷新页面(gulp-livereload,谷歌浏览器亲测,谷歌浏览器需安装livereload插件)
图片缓存,只有图片替换了才压缩(gulp-cache)
更改提醒(gulp-notify)
 
6. 合并压缩js任务 6.1 配置任务 我们在 src/js 文件夹中创建两个js文件,分别对应了两个方法,我们想要将这两个js文件合并为一个文件,需要在 gulpfile.js 文件中定义任务流:
1 2 3 4 5 6 gulp.task ('js' , function (                    return  gulp.src ('src/js/*.js' )  }) 
6.2 下载和使用插件 
安装插件 
 
当gulp读取文件到内存中后,会进行一系列操作,这些操作会用到gulp插件:
1 cnpm install gulp-concat gulp-uglify gulp-rename --save-dev 
引入插件 
 
引入插件:
1 2 3 4 var  concat = require ('gulp-concat' )var  uglify = require ('gulp-uglify' )var  rename = require ('gulp-rename' )
注册任务 
 
在引入插件之后我们便可以执行链式调用来配置任务了,每一个操作用 pipe 方法来进行连接:
1 2 3 4 5 6 7 8 9 gulp.task ('js' , function  (     return  gulp.src ('src/js/*.js' )         .pipe (concat ('build.js' ))          .pipe (gulp.dest ('dist/js/' ))          .pipe (uglify ())         .pipe (rename ({ suffix : '.min'  }))          .pipe (gulp.dest ('dist/js/' )) }) 
6.3 执行任务 调用已注册的任务,我们可以得到一个已经合并的文件 build.js 和一个合并并压缩的文件 build.min.js
gulp会自动忽略为调用的函数方法
 
7. 合并压缩css任务 
下载插件 
 
1 npm install gulp-less gulp-clean-css --save-dev 
引入和使用插件 
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 var  gulp = require ('gulp' )var  concat = require ('gulp-concat' )var  rename = require ('gulp-rename' )var  less = require ('gulp-less' )var  cssClean = require ('gulp-clean-css' )gulp.task ('less' , function  (     return  gulp.src ('src/less/*.less' )         .pipe (less ())          .pipe (gulp.dest ('src/css' ))  }) gulp.task ('css' , function  (     return  gulp.src ('src/css/*.css' )         .pipe (concat ('build.css' ))         .pipe (rename ({ suffix : '.min'  }))         .pipe (cssClean ({ compatibility : 'ie8'  }))          .pipe (gulp.dest ('dist/css/' )) }) gulp.task ('default' , []) 
执行任务 
 
1 2 3 4 5 6 7 8 9 > gulp less [15:18:39] Using gulpfile D:\test \gulp_study\gulpfile.js [15:18:39] Starting 'less' ... [15:18:39] Finished 'less'  after 43 ms > gulp css [15:18:46] Using gulpfile D:\test \gulp_study\gulpfile.js [15:18:46] Starting 'css' ... [15:18:46] Finished 'css'  after 48 ms 
8. 线性执行任务 1 2 3 ... ... gulp.task ('default' , ['js' , 'less' , 'css' ]) 
在用这种方式时,gulp的每个编译任务是移异步进行的,如果将编写任务中的 return 去掉,则编译过程是同步进行的,如:
1 2 3 4 5 6 7 8 9   gulp.task('js', function () { -   return gulp.src('src/js/*.js') +   gulp.src('src/js/*.js')       .pipe(concat('build.js')) // 临时合并文件       .pipe(gulp.dest('dist/js/')) // 临时输出文件到本地       .pipe(uglify())       .pipe(rename({ suffix: '.min' })) // 重命名       .pipe(gulp.dest('dist/js/'))   }) 
但是我们不推荐这么做(占内存,速度慢)
 
当我们需要逐个执行任务的时候,可以在设置任务的第二个参数位置,去设置它的依赖任务,如我们如果需要设置先执行 less 任务,再执行 css 任务,那么 css 任务的依赖任务就是 less 任务,我们可以进行如下设置:
1 2 3 4 5 gulp.task ('css' , ['less' ], function  (   return  gulp.src ('src/css/*.css' )      }) 
9. html压缩 
下载插件 
 
1 npm install gulp-html --save-dev 
引入和使用插件 
 
1 2 3 4 5 6 7 8 9 10 var  htmlMin = require ('gulp-html' )gulp.task ('html' , function  (   return  gulp.src ('index.html' )     .pipe (htmlMin ({ collapseWhitespace : true  }))      .pipe (gulp.dest ('dist/' ))  }) 
执行任务 
 
注意路径问题,压缩输出的 html 换到了另外的一个路径下,这个所以导出 html 前,必须将路径配置到 dist 目录下。
 
10. 半自动进行项目构建 
下载插件 
 
1 npm install gulp-livereload --save-dev 
配置编码 
 
1 2 3 4 5 6 7 8 gulp.task ('watch' , ['default' ], function  (      livereload.listen ();      gulp.watch ('src/js/*.js' , ['js' ]);   gulp.watch (['src/css/*.css' , 'src/less/*.less' ], ['css' ]) }) 
在设置完监听任务后,需要在监听的任务中再额外增加一个 pipe(livereload()) 方法,如:
1 2 3 4 5 6 7 8 9   gulp.task('js', function () {     return gulp.src('src/js/*.js')       .pipe(concat('build.js')) // 临时合并文件       .pipe(gulp.dest('dist/js/')) // 临时输出文件到本地       .pipe(uglify())       .pipe(rename({ suffix: '.min' })) // 重命名       .pipe(gulp.dest('dist/js/')) +     .pipe(livereload())   }) 
执行任务 
 
之后当我们编辑监听中的代码时,就可以自动打包编译,之后再手动刷新 浏览器后就可以浏览效果,如果想要自动刷新 看下一节全自动构建项目。
11. 全自动构建项目 
安装插件 
 
1 npm install gulp-connect --save-dev 
引入并使用插件 
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 var  connect = require ('gulp-connect' )gulp.task ('server' , ['default' ], function  (      connect.server ({     root : 'dist/' ,     livereload : true ,      port : 5000    })      gulp.watch ('src/js/*.js' , ['js' ]);   gulp.watch (['src/css/*.css' , 'src/less/*.less' ], ['css' ]) }) 
相似的,在设置完全自动监听的任务后,需要在监听的任务中再额外增加一个 .pipe(connect.reload()) 方法,如:
1 2 3 4 5 6 7 8 9   gulp.task('js', function () {     return gulp.src('src/js/*.js')       .pipe(concat('build.js')) // 临时合并文件       .pipe(gulp.dest('dist/js/')) // 临时输出文件到本地       .pipe(uglify())       .pipe(rename({ suffix: '.min' })) // 重命名       .pipe(gulp.dest('dist/js/')) +     .pipe(connect.reload())   }) 
执行任务 
 
12. 扩展 12.1 使用 open 模块自动打开浏览器 1 npm install open --save-dev 
1 2 3 4 5 6 7 8 9 10 var  open = require ('open' )... ... gulp.task ('server' , ['default' ], function  (   ... ...   open ('http://localhost:5000' ) }) 
12.2 使用 gulp-load-plugins 插件 
下载: 
 
1 cnpm install gulp-load-plugins --save-dev 
引入: 
 
1 var  $ = require ('gulp-load-plugins' )
之后我们便可以直接使用 $ 对象来调用所有的插件方法: 
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 var  gulp = require ('gulp' )var  $ = require ('gulp-load-plugins' )gulp.task ('js' , function  (   return  gulp.src ('src/js/*.js' )     .pipe ($.concat ('build.js' ))      .pipe (gulp.dest ('dist/js/' ))      .pipe ($.uglify ())     .pipe ($.rename ({ suffix : '.min'  }))      .pipe (gulp.dest ('dist/js/' ))     .pipe ($.livereload ())     .pipe ($.connect.reload ()) }) 
命名规则: 
 
使用 $ 对象引入的 gulp 插件必须有其对应的命名方法,其规则为:
忽略连接符前的 gulp,直接写插件名称,如:gulp-concat 插件对应的引入方法为 $.concat 
如果有多个连接符,则采用驼峰命名,如:gulp-clean-css 插件对应的引入方法为 $.cleanCss