自动化构建工具 gulp

2019-08-20  本文已影响0人  squidbrother
概述

官方定义
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】

针对上面的基本书写格式,有两处需要讨论

return gulp.src(['./src/js/**/*.js']) 
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插件
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'));
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'));
压缩重命名结果
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不相等");
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)}
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'));

结果:


图片压缩
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";
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'));

结果:


错误指向
自动监听
npm install gulp-watch -D

语法格式:

gulp.watch('监测文件路径',  gulp.series(处理任务名));
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


动态更新
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'));
上一篇 下一篇

猜你喜欢

热点阅读