自动化构建工具 gulp

概述

官方定义
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版本引起语法报错
常用的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'));
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容