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