概述
官方定义
gulp 将开发流程中让人痛苦或耗时的任务自动化,从而减少你所浪费的时间、创造更大价值。
通俗的说
gulp 是基于nodejs的(stream)流操作,可以对文件进行压缩,编译,合并等操作,学习曲线低,简单好用
安装
第一步:(全局安装的是启动器)
npm install gulp -g
第二步:
移动至项目文件夹,初始化项目,
安装gulp核心库(工程目录下安装的是核心库)
npm init -y
npm install gulp -D
查看版本
gulp -v
会显示 例:
CLI version
:2.2.0 //全局 启动器版本
Local version
:4.0.2 //针对项目的 核心库版本
配置和启动
配置文件:
在项目目录下,新建一个gulpfile.js
作为gulp的配置文件
配置文件书写格式:
const gulp = require('gulp'); //引入核心库
const uglify = require('gulp-uglify'); //引入三方功能模块 压缩
gulp.task('myjs1',()=>{ //任务名为myjs1的任务
return gulp.src(['读取文件的目录']) //读取文件位置 【讨论细节1】
.pipe(uglify()) //执行的gulp操作
//... 类似功能模块都书写在此位置
.pipe(gulp.dest('操作后输出的目录'));
})
gulp.task('default',[对应任务名...]); //对应启动的配置【讨论细节2】
针对上面的基本书写格式,有两处需要讨论
- 1.读取文件的目录,如果是多层嵌套,针对一类应该怎么书写
例:当前目录 src/js下,若干层级,以js为后缀名的文件
书写:
return gulp.src(['./src/js/**/*.js'])
- 2.针对启动中数组部分的书写
启动的方式有2种 针对gulp3.0版本
不写gulp.task('default',['myjs1']);这一行,则每次在命令行中,启动gulp需要加任务名称,以上述例为说明:
gulp js
如果书写了gulp.task('default',['myjs1']);这一行,则无需增加对应 任务名
gulp
在gulp4.0中,
第一种书写会报错 "Task function must be specified"
第二种书写会报错 "Task never defined: myjs1"
所以在4.0中 此段代码书写应:
gulp.task('default',gulp.series('dojs1'));
常用的gulp插件
- 1.gulp-uglify 压缩模块
安装:
npm install gulp-uglify -D
语法格式:
.pipe(uglify())
例:
const gulp = require('gulp');
const uglify = require('gulp-uglify');
gulp.task('dojs1',()=>{
return gulp
.src(['./src/js/**/*.js'])
.pipe(uglify())
.pipe(gulp.dest('./bundle/js/'))
});
gulp.task('default',gulp.series('dojs1'));
- 2.gulp-rename 重命名模块
安装
npm install gulp-rename -D
语法格式:(例:增加一个min后缀名)
.pipe(rename({suffix:'.min'}))
例:(压缩并添加后缀名.min)
const gulp = require('gulp');
const uglify = require('gulp-uglify');
const rename = require('gulp-rename');
gulp.task('dojs1',()=>{
return gulp
.src(['./src/js/**/*.js'])
.pipe(rename({suffix:'.min'}))
.pipe(uglify())
.pipe(gulp.dest('./bundle/js/'))
});
gulp.task('default',gulp.series('dojs1'));
- 3.gulp-babel (针对ES6语法做兼容) gulp uglify不支持ES6以上语法,所以需要提前babel下
安装:
npm install gulp-babel @babel/core @babel/preset-env -D
语法格式:
.pipe(babel({
presets:['@babel/env']
}))
例:
const gulp = require('gulp');
const uglify = require('gulp-uglify');
const rename = require('gulp-rename');
const babel = require('gulp-babel');
gulp.task('dojs1',()=>{
return gulp
.src(['./src/js/**/*.js'])
.pipe(rename({suffix:'.min'}))
.pipe(babel({
presets:['@babel/env']
}))
.pipe(uglify())
.pipe(gulp.dest('./bundle/js/'))
});
gulp.task('default',gulp.series('dojs1'));
源文件:1.js
const a=1;
let b=2;
if(a==b){
alert('ab相等');
}else{
alert('ab不相等');
}
结果:1.min.js
var a=1,b=2;a==b?alert("ab相等"):alert("ab不相等");
- 4.gulp-cssmin(压缩css)
安装:
npm install gulp-cssmin -D
语法格式:
.pipe(cssmin())
例:
const gulp = require('gulp');
const rename = require('gulp-rename');
const cssmin = require('gulp-cssmin');
gulp.task('docss1',()=>{
return gulp
.src(['./src/css/**/*.css'])
.pipe(rename({suffix:'.min'}))
.pipe(cssmin())
.pipe(gulp.dest('./bundle/css/'))
});
gulp.task('default',gulp.series('docss1'));
结果:1.css -> 1.min.css
body,html,p{margin:0}body{backgroud:red}p{padding:0;font-size:40px;line-height:1.5em;color:#0C6;text-align:center;-webkit-text-shadow:0 1px 3px rgba(0,0,0,.3);-moz-text-shadow:0 1px 3px rgba(0,0,0,.3);-ms-text-shadow:0 1px 3px rgba(0,0,0,.3);-o-text-shadow:0 1px 3px rgba(0,0,0,.3);text-shadow:0 1px 3px rgba(0,0,0,.3)}
- 5.gulp-imagemin (图片压缩)
安装:
npm install gulp-imagemin -D
语法格式:
.pipe(imagemin([
imagemin.gifsicle({interlaced:true}),
imagemin.jpegtran({propressive:true}),
imagemin.optipng({optimizationLevel:5}),
]))
例:
const gulp = require('gulp');
const uglify = require('gulp-uglify');
const rename = require('gulp-rename');
const babel = require('gulp-babel');
const cssmin = require('gulp-cssmin');
const imagemin = require('gulp-imagemin');
gulp.task('dojs1',()=>{
return gulp
.src(['./src/js/**/*.js'])
.pipe(rename({suffix:'.min'}))
.pipe(babel({
presets:['@babel/env']
}))
.pipe(uglify())
.pipe(gulp.dest('./bundle/js/'))
});
gulp.task('docss1',()=>{
return gulp
.src(['./src/css/**/*.css'])
.pipe(rename({suffix:'.min'}))
.pipe(cssmin())
.pipe(gulp.dest('./bundle/css/'))
});
gulp.task('doimg1',()=>{
return gulp
.src(['./src/img/**/*.jpg','./src/img/**/*.gif','./src/img/**/*.png'])
.pipe(imagemin([
imagemin.gifsicle({interlaced:true}),
imagemin.jpegtran({propressive:true}),
imagemin.optipng({optimizationLevel:5}),
]))
.pipe(gulp.dest('./bundle/img/'))
});
gulp.task('default',gulp.series('dojs1','docss1','doimg1'));
结果:
- 6.gulp-concat (代码合并);
安装:
npm install gulp-concat -D
语法格式:
.pipe(concat('bundle.js')) //合并后的文件名
例:
const gulp = require('gulp');
const uglify = require('gulp-uglify');
const rename = require('gulp-rename');
const babel = require('gulp-babel');
const cssmin = require('gulp-cssmin');
const imagemin = require('gulp-imagemin');
const sourcemaps = require('gulp-sourcemaps');
const concat = require('gulp-concat');
gulp.task('dojs1',()=>{
return gulp
.src(['./src/js/**/*.js'])
.pipe(concat('bundle.min.js')) //压缩后的文件名
//.pipe(rename({suffix:'.min'}))
.pipe(babel({
presets:['@babel/env']
}))
.pipe(uglify())
.pipe(gulp.dest('./bundle/js/'))
});
gulp.task('default',gulp.series('dojs1'));
结果:bundle.min.js
"use strict";var a=1,b=2;a==b?console.log("ab相等"):console.log("ab不相等"),oDiv.style.backgroundColor="red";var oB=document.getElementsByTagName("body");oB[0].style.backgroundColor="red";
- 7.gulp-sourcemaps( 针对JS合并后,可以锁定报错信息,源于合并前的哪个JS文件)
安装:
npm install gulp-sourcemaps -D
【注】:依赖浏览器支持,chrome好用,firfox需要调试浏览器配置? IE不支持
语法格式:
.pipe(sourcemaps.init()) //放在读取后的第一个位置
.pipe(sourcemaps.write()) //放在输出压缩前
例:
const gulp = require('gulp');
const uglify = require('gulp-uglify');
const rename = require('gulp-rename');
const babel = require('gulp-babel');
const cssmin = require('gulp-cssmin');
const imagemin = require('gulp-imagemin');
const sourcemaps = require('gulp-sourcemaps');
const concat = require('gulp-concat');
gulp.task('dojs1',()=>{
return gulp
.src(['./src/js/**/*.js'])
.pipe(sourcemaps.init()) //sourcemaps开始
.pipe(concat('bundle.min.js'))
//.pipe(rename({suffix:'.min'}))
.pipe(babel({
presets:['@babel/env']
}))
.pipe(uglify())
.pipe(sourcemaps.write()) //sourcemaps结束
.pipe(gulp.dest('./bundle/js/'))
});
gulp.task('default',gulp.series('dojs1'));
结果:
自动监听
-
gulp 3.0
修改文件时候,监听其变化,并且动态的进行处理
需要额外两个模块 gulp-watch、gulp-livereload - gulp-watch
安装:
npm install gulp-watch -D
语法格式:
gulp.watch('监测文件路径', gulp.series(处理任务名));
- gulp-livereload
安装:
npm install gulp-livereload -D
语法格式:
livereload.listen()
例:
const gulp = require('gulp');
const uglify = require('gulp-uglify');
const rename = require('gulp-rename');
const babel = require('gulp-babel');
const cssmin = require('gulp-cssmin');
const imagemin = require('gulp-imagemin');
const sourcemaps = require('gulp-sourcemaps');
const concat = require('gulp-concat');
const watch = require('gulp-watch');
const livereload = require('gulp-livereload');
//npm install --save-dev gulp-livereload
gulp.task('dojs1',()=>{
return gulp
.src(['./src/js/**/*.js'])
.pipe(sourcemaps.init()) //sourcemaps开始
.pipe(concat('bundle.min.js'))
//.pipe(rename({suffix:'.min'}))
.pipe(babel({
presets:['@babel/env']
}))
.pipe(uglify())
.pipe(sourcemaps.write()) //sourcemaps结束
.pipe(gulp.dest('./bundle/js/'))
});
gulp.task('docss1',()=>{
return gulp
.src(['./src/css/**/*.css'])
.pipe(rename({suffix:'.min'}))
.pipe(cssmin())
.pipe(gulp.dest('./bundle/css/'))
});
gulp.task('doimg1',()=>{
return gulp
.src(['./src/img/**/*.jpg','./src/img/**/*.gif','./src/img/**/*.png'])
.pipe(imagemin([
imagemin.gifsicle({interlaced:true}),
imagemin.jpegtran({propressive:true}),
imagemin.optipng({optimizationLevel:5}),
]))
.pipe(gulp.dest('./bundle/img/'))
});
function watchIt(done) {
livereload.listen()
gulp.watch('./src/js/**/*.js', gulp.series('dojs1'))
gulp.watch('./src/css/**/*.css', gulp.series('docss1'))
done()
}
gulp.task('default',gulp.series('dojs1','docss1','doimg1',watchIt));
实现动态修改,实时完成打包工作
【注】: 自定义观察函数watchIt 不需要加''号,在gulp.series()中,加引号的必须是task
-
gulp 4.0
在gulp核心库中中,可以解构出watch和series方法,同样可以实现监测和动态更新效果
const gulp = require('gulp');
const uglify = require('gulp-uglify');
const rename = require('gulp-rename');
const babel = require('gulp-babel');
const cssmin = require('gulp-cssmin');
const imagemin = require('gulp-imagemin');
const sourcemaps = require('gulp-sourcemaps');
const concat = require('gulp-concat');
//4.0
const { watch, series } = require('gulp');
gulp.task('dojs1',()=>{
return gulp
.src(['./src/js/**/*.js'])
.pipe(sourcemaps.init())
.pipe(concat('bundle.min.js'))
//.pipe(rename({suffix:'.min'}))
.pipe(babel({
presets:['@babel/env']
}))
.pipe(uglify())
.pipe(sourcemaps.write())
.pipe(gulp.dest('./bundle/js/'))
});
gulp.task('docss1',()=>{
return gulp
.src(['./src/css/**/*.css'])
.pipe(rename({suffix:'.min'}))
.pipe(cssmin())
.pipe(gulp.dest('./bundle/css/'))
});
gulp.task('doimg1',()=>{
return gulp
.src(['./src/img/**/*.jpg','./src/img/**/*.gif','./src/img/**/*.png'])
.pipe(imagemin([
imagemin.gifsicle({interlaced:true}),
imagemin.jpegtran({propressive:true}),
imagemin.optipng({optimizationLevel:5}),
]))
.pipe(gulp.dest('./bundle/img/'))
});
//watch
watch('./src/js/**/*.js', series('dojs1'));
watch('./src/css/**/*.css', series('docss1'));
gulp.task('default',gulp.series('dojs1','docss1','doimg1'));