gulp基础和常用插件介绍
前提:前端工程化是如今前端团队规范化管理项目和代码的概念,而前端工程化中往往是离不开前端自动化或打包工具这两种工具。本文将详细介绍其中一种常用的前端自动化工具---gulp.js
- 入门:
安装方式:
全局安装: npm install --g gulp 局部(项目安装): npm install --save-dev gulp
gulp配置文件:
在项目根目录下创建一个gulpfile.js文件,其中default任务为主任务,其他为功能任务;
语法:
var gulp = require('gulp'); gulp.task('default',function(){...});
运行方式:
在命令行中直接输入gulp运行,或者在webstorm中在对应的gulpfile.js点中,然后右键,选择show gulp task方式就能运行;
- gulp的API:
一)gulp.src方法:
定义:该方法会匹配对应的文件,并以虚拟文件流(包含路径,文件名,内容)的形式返回;
语法:gulp.src(globs [,option])
特点:因为返回的文件流是类似于Readable Streams的形式,所以可以利用pipe管道的方式传输,处理文件流。
参数介绍:
a)globs:可以理解成一种类似于正则表达式的匹配模式,其值可以为匹配形式,文件路径,或者文件路径数组。
*:匹配任何字符串但不识别路径分隔符(‘/’)
eg: gulp.src('./build/*.js') 匹配build文件中所有js文件
**:匹配任何字符串包括‘/’
eg:gulp.src('**.js') 匹配任何路径下的js文件
[...] : 枚举
eg: gulp.src('[abc].js') 匹配a.js或者b.js或者c.js
[!...] : 枚举中括号中以外的一切字符串
eg:gulp.src('[!abc].js') 匹配d.js等等js文件
? : 职匹配一个字符串
eg:gulp.src('?.js') 匹配a.js等等js文件
b)option:里面有buffer,read,base配置项,其中base项是关于文件流保存的路径相关(具体放在dest方式中阐述)
二)gulp.dest方法:
定义:将文件流写入到指定的路径文件中,并继续输出该文件流;
语法:gulp.dest(path [,option])
注意事项:
a)文件流写入的文件名只能由流入的文件流定义;
b)path是路径,不能是文件名;
c)src中base项默认是匹配符之前的字符串路径,但也可以人为设置,例子阐述:
gulp.src('a/b/*/[ab].js') .pipe(gulp.dest('./build')) 解释:默认base为a/b,塞进文件流的文件名为*/[ab].js,所以新建的文件的路径为./build/*/[ab].js
gulp.src('a/b/*/c/d.js',{base:'a'}) .pipe(gulp.dest('./build')) 解释:base现是a,塞进文件流的文件名为b/*/c/d.js,所以新建的文件路径为./build/b/*/c/d.js
d)dest方法输出的文件流也可以被pipe传输;
三)gulp.task方法:
定义: 在gulp中定义一个任务,其中主任务为default;
语法: gulp.task(name [,deps] ,fn)
参数:
name是任务名; deps是依赖的任务数组,是在当前任务之前执行的; fn:当前任务内容;
情景:
a) gulp.task('default',function(){...}):最简单模式;
b)gulp.task('default',['A1','A2']):default是由A1,A2两个任务组成的;
c)gulp.task('default', ['A1','A2'],function(){...}):先执行完A1,A2,再执行default任务;
question: 若任务列表A1,A2中,A1存在异步操作,则执行A2时,A1还很可能未执行完;
resolve:
A) fn任务函数可以引进一个回调函数参数,该参数可以告诉外界该任务是否执行完;
eg: gulp.task('A1',function(cb){ setTime(function(){ console.log(1); cb(); },2000); }) gulp.task('A2',function(){console.log(2);}) gulp.task('default',['A1','A2'],function(){ console.log(3) }) 输出结果为:2 1 3
B)任务函数返回一个流对象,适用于gulp.src方法;
gulp.task('A',function(){ return gulp.src('./a.js') .pipe(插件) }) gulp.task('deafult',['A'],function(){...})
C)返回一个Promise对象;
gulp.task('A',function(){ return new Promise( (res,rej) => { }) }) gulp.task('default',['A']);
四)gulp.watch方法:
定义:该方法是用来监听文件的变化;
语法一:gulp.watch(glob [,opts] , tasks)
语法二:gulp.watch(glob [,opts] , function(event){...})
event是一个事件对象;
event.type为added(添加类型);changed(改变类型);deleted(删除类型)
event.path:变化的文件路径;
- 常用gulp插件:
gulp有很多插件,而本文列举出一些常用的插件
- gulp-uglify插件
用途:用来压缩js文件
用法:
var uglify = require('gulp-uglify'); gulp.task('uglifyJS',function(cb){ gulp.src('./demo/*.js') .pipe(uglify()) .pipe(gulp.dest('build')); cb(); });
- gulp-minify-css插件
用途:用来压缩css文件
用法:
var minifyCss = require('gulp-minify-css'); gulp.task('minifyCss',function(cb){ gulp.src('./demo/*.css') .pipe(minifyCss()) .pipe(gulp.dest('./build')); cb(); });
- gulp-minify-html插件
用途:合并html文件
用法:
var miniHtml = require('gulp-minify-html'); gulp.task('miniHtml',function(cb){ gulp.src('./src/*.html') .pipe(miniHtml()) .pipe(gulp.dest('./build')); });
- gulp-connect插件
用途:自动刷新页面
用法:
var connect = require('gulp-connect'); gulp.task('connect',function(){ connect.server({ root:'src', livereload:true, }) }); gulp.task('watchHtml',function(){ gulp.watch('./src/*.html',function(){ gulp.src('./src/*.html') .pipe(connect.reload()); }) });
- gulp-jshint插件
用途:用来检查js语法
用法:
var jshint = require('gulp-jshint'); gulp.task('checkJs',()=>{ gulp.src('./src/*.js') .pipe(jshint()) .pipe(jshint.reporter()) });
- gulp-concat插件
用途:合并多个js或者css文件
用法:
var concat = require('gulp-concat'); gulp.task('concat',()=>{ gulp.src('./*/*.js') .pipe(concat('all.js')) .pipe(gulp.dest('./build')); });
- gulp-rename:
定义;将文件改名;
语法:
a)rename(filename):将文件直接改为指定文件名;
b)rename({dirname:'A' ,basename:'B' ,prefix:'C-',suffix:'-D', extname:'.txt'}):将文件名改为A/C-B-D.txt;
C)rename(function(path){}):path为一个对象,包含B)中所有属性;
var rename =require('gulp-rename'); gulp.task('rename',()=>{ gulp.src('./demo/*.css') .pipe(rename({ suffix:'.min', extname:'.less' })) .pipe(gulp.dest('./build')); })
参考文档:
gulp文档