Gulp

Gulp
 
 
什么是Gulp
 
Gulp是基于Node.js的前端自动化构建工具
 
 
为什么使用Gulp
 
Gulp自动化构建工具可以增强你的工作流程!
易于使用、易于学习、构建快速、插件高质!
在日常开发中,可以借助Gulp的一些插件完成很多的前端任务。
如:代码的编译(sass、less)、压缩css,js、图片、合并js,css、es6转es5、自动刷新页面等。
 
前端构建工具还有: grunt、webpack、browserify
 
gulp中文官网: https://www.gulpjs.com.cn/
 
 
使用Gulp
 
确保根目录存在 package.json 文件,执行 npm init -y 生成
建议安装3.x.x版本,稳定、插件较多
 
1.全局安装 gulp:
$ npm install gulp@3 --global
 
2.作为项目的开发依赖(devDependencies)安装:
$ npm install gulp@3 --save-dev
 
3.在项目根目录下创建一个名为 gulpfile.js 的文件:
var gulp = require('gulp');
gulp.task('default', function() {
    // 将你的默认任务的代码放在这
    console.log('hello world');
});
 
4.命令行运行 gulp:
$ gulp
 
直接运行 gulp 默认执行 default 任务(task)。
想要单独执行特定的任务(task),请输入 gulp taskName
 
 
Gulp API介绍
 
使用gulp,仅需知道4个API即可:gulp.task()、gulp.src()、gulp.dest()、gulp.watch()
 
gulp.task 方法用来定义任务
gulp.task(name[, deps], fn)
name 为任务名
deps 是当前定义的任务需要依赖的其他任务,为一个数组。当前定义的任务会在所有依赖的任务执行完毕后才开始执行。如果没有依赖,则可省略这个参数。
fn 为任务函数,我们把任务要执行的代码都写在里面。该参数也是可选的。
 
定义一个有依赖的任务
var gulp = require('gulp');
gulp.task('mytask', ['task1', 'task2', 'task3'], function() {
    console.log('执行任务 mytask');
});
 
gulp中执行多个任务,可以通过任务依赖来实现:
// 只要执行default任务,就相当于把one,two,three这三个任务执行了
var gulp = require('gulp');
gulp.task('default',['one','two','three']);
 
如果某个任务所依赖的任务是异步的,gulp并不会等待那个所依赖的异步任务完成,而是会接着执行后续的任务。例如:
var gulp = require('gulp');
gulp.task('one',function(){
    //one是一个异步执行的任务
    setTimeout(function(){
        console.log('one is done')
    },5000);
});
 
//two任务虽然依赖于one任务,但并不会等到one任务中的异步操作完成后再执行
gulp.task('two',['one'],function(){
    console.log('two is done');
});
 
在异步操作完成后执行一个回调函数来通知gulp这个异步任务已经完成,这个回调函数就是任务函数的第一个参数。
var gulp = require('gulp');
gulp.task('one',function(done){ //cb为任务函数提供的回调,用来通知任务已经完成
    //one是一个异步执行的任务
    setTimeout(function(){
        console.log('one is done');
        done();  //执行回调,表示这个异步任务已经完成
    },5000);
});
 
//这时two任务会在one任务中的异步操作完成后再执行
gulp.task('two',['one'],function(){
    console.log('two is done');
});
 
 
gulp.src 方法用来读取文件
gulp.src(globs[, options])
globs 参数是文件匹配模式(类似正则表达式),当然也可以直接指定某个具体的文件路径。当有多个匹配模式时,该参数为一个数组。
options 为可选参数,通常不需要用到。
 
gulp.src('./js/a.js'); // 读取一个文件
gulp.src('./js/*.js'); // 读取js目录下的所有js文件
gulp.src(['./js/a.js','./js/b.js']); // 读取两个文件
 
匹配模式:
* 匹配文件路径中的0个或多个字符,但不会匹配路径分隔符(/),除非路径分隔符出现在末尾
** 匹配路径中的0个或多个目录及其子目录,需要单独出现,即它左右不能有其他东西了。如果出现在末尾,也能匹配文件。
? 匹配文件路径中的一个字符(不会匹配路径分隔符)
[...] 匹配方括号中出现的字符中的任意一个,当方括号中第一个字符为^或!时,则表示不匹配方括号中出现的其他字符中的任意一个,类似js正则表达式中的用法
!(pattern|pattern|pattern) 匹配任何与括号中给定的任一模式都不匹配的
?(pattern|pattern|pattern) 匹配括号中给定的任一模式0次或1次,类似于js正则中的(pattern|pattern|pattern)?
+(pattern|pattern|pattern) 匹配括号中给定的任一模式至少1次,类似于js正则中的(pattern|pattern|pattern)+
*(pattern|pattern|pattern) 匹配括号中给定的任一模式0次或多次,类似于js正则中的(pattern|pattern|pattern)*
@(pattern|pattern|pattern) 匹配括号中给定的任一模式1次,类似于js正则中的(pattern|pattern|pattern)
 
匹配示例:
* 能匹配 a.js,x.y,abc,abc/,但不能匹配a/b.js
*.* 能匹配 a.js,style.css,a.b,x.y
*/*/*.js 能匹配 a/b/c.js,x/y/z.js,不能匹配a/b.js,a/b/c/d.js
** 能匹配 abc,a/b.js,a/b/c.js,x/y/z,x/y/z/a.b,能用来匹配所有的目录和文件
**/*.js 能匹配 foo.js,a/foo.js,a/b/foo.js,a/b/c/foo.js
a/**/z 能匹配 a/z,a/b/z,a/b/c/z,a/d/g/h/j/k/z
a/**b/z 能匹配 a/b/z,a/sb/z,但不能匹配a/x/sb/z,因为只有单**单独出现才能匹配多级目录
?.js 能匹配 a.js,b.js,c.js
a?? 能匹配 a.b,abc,但不能匹配ab/,因为它不会匹配路径分隔符
[xyz].js 只能匹配 x.js,y.js,z.js,不会匹配xy.js,xyz.js等,整个中括号只代表一个字符
[^xyz].js 能匹配 a.js,b.js,c.js等,不能匹配x.js,y.js,z.js
 
 
gulp.dest 方法用来写入文件(设置生成文件的路径)
gulp.dest(path[,options])
path 为写入文件的路径。
options 为可选参数,通常不需要用到。
 
var gulp = require('gulp');
gulp.task('mytask', function() {
    gulp.src("./js/a.js")
           .pipe(gulp.dest("./dist/"));
});
读取文件流(gulp.src),通过管道(pipe),把文件流写入(gulp.dest)当前目录下的 dist 文件夹中
 
 
gulp.watch 方法用来监视文件的变化
gulp.watch(globs[, opts], tasks)
globs 为要监视的文件匹配模式,规则和用法与gulp.src()方法中的globs相同。
opts 为可选参数,通常不需要用到。
tasks 为文件变化后要执行的任务,为一个数组
 
gulp.watch()还有另外一种使用方式:
gulp.watch(glob[, opts, cb])
cb 参数为一个函数。每当监视的文件发生变化时,就会调用这个函数,并且会给它传入一个对象,该对象包含了文件变化的一些信息。
gulp.watch('./**/*.*', function(event){
    console.log(event.type); //added为新增,deleted为删除,changed为改变
    console.log(event.path); //变化的文件路径
});
 
 
Gulp常用插件
 
文件合并(js、css)
使用gulp-concat
安装:npm install --save-dev gulp-concat
gulp.task('concat', function () {
    gulp.src('./js/*.js') //要合并的文件
    .pipe(concat('all.js')) //合并匹配到的js文件并命名为 "all.js"
    .pipe(gulp.dest('./dist/'));
});
 
js文件压缩
使用gulp-uglify
安装:npm install --save-dev gulp-uglify
gulp.task('minifyJS', function () {
    gulp.src('./dist/all.js') // 要压缩的js文件
    .pipe(uglify()) //使用uglify进行压缩
    .pipe(gulp.dest('./dist/js')); //压缩后的路径
});
 
css文件压缩
使用gulp-minify-css
安装:npm install --save-dev gulp-minify-css
gulp.task('minifyCss', function () {
    gulp.src('./css/*.css') // 要压缩的css文件
    .pipe(minifyCss()) //压缩css
    .pipe(gulp.dest('./dist/'));
});
 
重命名
使用gulp-rename
安装:npm install --save-dev gulp-rename
gulp.task('rename', function () {
    gulp.src('./js/jquery-1.8.3.js')
    .pipe(uglify()) //压缩
    .pipe(rename('jquery-1.8.3.min.js'))//重命名
    .pipe(gulp.dest('./js/'));
});
 
html文件压缩
使用gulp-minify-html
安装:npm install --save-dev gulp-minify-html
gulp.task('minifyHtml', function () {
    gulp.src('./test.html') //要压缩的html文件
    .pipe(minifyHtml()) //压缩
    .pipe(gulp.dest('./dist/'));
});
 
less编译
使用gulp-less
安装:npm install --save-dev gulp-less
var gulp = require('gulp'),
      less = require("gulp-less");
gulp.task('compile-less', function () {
    gulp.src('./less/*.less')
    .pipe(less())
    .pipe(gulp.dest('./dist/'));
});
 
sass编译
使用gulp-sass
安装:npm install --save-dev gulp-sass
var gulp = require('gulp'),
      sass = require("gulp-sass");
gulp.task('compile-sass', function () {
    gulp.src('./sass/*.sass')
    .pipe(sass())
    .pipe(gulp.dest('./dist/'));
});
 
图片压缩
使用gulp-imagemin
安装:npm install --save-dev gulp-imagemin
gulp.task('imagemin', function () {
    gulp.src('./img/*') // 要压缩的图片
    .pipe(imagemin()) // 压缩
    .pipe(gulp.dest('./dist/'));
});
 
ES6转ES5
使用gulp-babel
安装:npm install --save-dev gulp-babel @babel/core @babel/preset-env
gulp.task('es6', function () {
    gulp.src('./es6-class.js')
    .pipe(babel({ presets: ['@babel/preset-env'] }))
    .pipe(gulp.dest('./dist/'))
});
 
浏览器自动刷新
使用browser-sync
安装:npm install --save-dev browser-sync
var server = require('browser-sync').create();//执行函数返回对象
gulp.task('server',function(){
    server.init({
        server:"./",
        port:3002
    });
    gulp.watch('./*.html').on('change',server.reload);
});
 
自动加载
使用gulp-load-plugins
安装:npm install --save-dev gulp-load-plugins
var gulp = require('gulp');
var plugins = require('gulp-load-plugins')(); //加载并马上运行它
然后我们要使用gulp-rename和gulp-ruby-sass这两个插件的时候,就可以使用plugins.rename和plugins.rubySass来代替了,也就是原始插件名去掉gulp-前缀,之后再转换为驼峰命名。
实质上gulp-load-plugins是为我们做了如下的转换:
plugins.rename = require('gulp-rename');
plugins.rubySass = require('gulp-ruby-sass');
 
 
 
原文地址:https://www.cnblogs.com/r-mp/p/11113085.html