zoukankan      html  css  js  c++  java
  • gulp

    一、gulp简介

        gulp是一个自动化构建工具。在开发过工程中,能够使用gulp对项目进行自动构建,大大提高工作效率。

    二、安装gulp

        在安装gulp之前先要确认已经正确安装了node.js,然后在项目根目录下安装gulp:

        $ npm install gulp

    三、gulp函数接口介绍

        在编写gulp配置文件gulpfile之前,需要先了解常见的函数接口:

    1. gulp.src()

        gulp的工作过程是这样的,首先通过gulp.src()获取我们想要处理的文件的stream(文件流);然后,通过.pipe方法将stream导入到引用的gulp插件中进行相应的处理;最后通过gulp.dest()方法将处理后的流写入到文件中。

        从gulp工作过程中可以看到,gulp.src()主要用来从文件中获取文件流。gulp.dest()函数原型如下:

    gulp.src(globs[, options]

        globs是文件的匹配路径和匹配形式。下面列举了部分常用的匹配形式:

    (1)js/test.js    //精确匹配文件

    (2)js/*.js        //匹配js目录下所有后缀为.js的文件

    (3)js/**/*.js   //匹配js目录及其子目录下所有后缀为.js的文件

    (4)!js/test.js //从匹配结果中排出js目录下的test.js文件

     

    语法:gulp.src(globs[, options])

    • globs:文件匹配模式(类似正则表达式),用来匹配文件路径(包括文件名)
    • options:为可选参数。通常情况下我们不需要用到
    gulp.src('**/*.js')
     
    • 1

    匹配模式

    Gulp 内部使用了 node-glob 模块来实现其文件匹配功能

    单匹配模式

    匹配符 code 匹配 不匹配 备注
    * * a.bx.yabcabc/ a/b.js 不匹配/,除非/出现在末尾
    *.* a.bx.y abc 匹配所有带后缀的文件
    */*/*.js a/b/c.jsx/y/z.js a/b.jsa/b/c/d.js 匹配固定层级目录
    ** ** abca/ba/b.jsa/b/ca/b/c.js   匹配所有的目录和文件
    **/*.js a.jsa/b.jsa/b/c.js   匹配所有目录下的 .js 文件
    a/**/z a/za/b/za/b/c/za/b/c/d/z    
    a/**b/z a/b/za/nb/z a/c/nb/z ** 单独出现才能匹配多级目录
    ? ?.js a.jsb.jsc.js   占位符匹配,不匹配 /
    a?? a.babc ab/ 占位符与字符搭配使用
    [] [abc].js a.jsb.jsc.js ab.jsxyz.js 整个 [] 只匹配一个字符
    [^abc].js
    [!abc].js
    x.jsy.js a.jsb.jsc.js 排除匹配字符

    多匹配模式(同时使用多种匹配)

    1. 类正则

    表达式备注
    !(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)

    2. 数组

    • 使用数组匹配多种模式
    gulp.src(['js/*.js', 'css/*.css', '*.html'])
     
    • 1
    • 使用数组 + 排除模式
      排除模式不能出现在数组的第一个元素中
    gulp.src([*.js,'!b*.js']) // 匹配所有js文件,但排除掉以b开头的js文件
    gulp.src(['!b*.js',*.js]) // 不排除任何文件,因为排除模式不能出现在数组的第一个元素中
     
    • 1
    • 2

    3. 展开模式

    {} 作为定界符,根据它里面的内容,会展开为多个模式,
    最后匹配的结果为所有展开的模式相加起来得到的结果 !
    1. a{b, c}d 展开为:abcacd
    2. a{b,}c 展开为:abcac
    3. a{0..3}c 展开为:a0ca1ca2c
    4. a{b, c{d, e}f}g 展开为:abgacdfgacefg
    5. a{b, c}d{e, f}g 展开为:abdegacdegabdegabdfg

    2. gulp.task()

        gulp.task()函数用来构建任务。函数原型为:

    gulp.task(name[, deps], fn)

        name是所构建的任务名称。fn是任务所要执行的函数,gulp具体的工作过程是在fn中进行的。示例:

    复制代码
    var webpack = require('gulp-webpack');
    var config = require('./webpack.config');
    gulp.task('webpack', function() {
        return webpack(config)
            .pipe(uglify())
            .pipe(gulp.dest('./dist/js'));
    });
    复制代码

        上面的代码是我在项目中使用的部分。该部分是webpack与gulp的联合使用,第一次看到别人用时,感觉发现了新大陆。task参数function中webpack会首先执行同一目录下的webpack.config.js配置文件,对代码进行模块打包;然后,返回打包后的所有文件的文件流;文件流通过pipe进入到uglify插件后进行压缩;最后,文件流通过gulp.dest写入到设置的目录下。

    3.gulp.dest()

        gulp.dest()是对文件流的输出进行设置。函数原型为:

    gulp.dest(path[, options])

        path是文件输出路径设置。注意:path只能生成文件的目录,不能生成文件的名称,不能生成文件的名称,不能生成文件的名称,不能生成文件的名称,重要的事说四遍。而最终生成的文件的名称是由gulp.src传入的文件名决定。下面会由示例的。

        文件最终生成的路径也需要注意:

    (1)如果gulp.src(path)中的path带有通配符,则生成的路径由gulp.dest(path_dest)中的path_dest代替path通配符前面的部分组成。例如:

    gulp.src('js/*/test.js')
    //假设匹配到的文件为js/source/test.js
    .pipe(gulp.dest('dist')); //最终生成的文件为 dist/source/test.js

    (2)如果gulp.src(path)中的path没有带通配符,则生成的路径由gulp.dest(path_dest)中的path_dest与gulp.src引入的文件名组成。例如:

    gulp.src('js/test.js')
    .pipe(gulp.dest('dist')); //最终生成的文件为 dist/test.js

    四、常用的gulp插件

    1. gulp-uglify插件

        引入:

    var uglify = require('gulp-uglify');

        作用:对js文件流进行压缩。

    gulp.task('server_test', function() {
        return gulp.src(server/app.js)
            .pipe(uglify())
            .pipe(gulp.dest('./dist/js'));
    });

        上面代码中的uglify()会对流过它的js数据流进行压缩,然后有gulp.dest写入到js目录下。

    2. gulp-less插件

        引入:

    var less = require('gulp-less');

        作用:对less文件流进行压缩

    gulp.task('server_test', function() {
        return gulp.src(server/device.less)
            .pipe(less())
            .pipe(gulp.dest('./dist/less'));
    });

        上面代码中的less()会对流过它的less数据流进行压缩,然后有gulp.dest写入到less目录下。

    3. gulp-minify-css插件

        引入:

    var minifyCSS = require('gulp-minify-css');

        作用:对css文件流进行压缩

    gulp.task('server_test', function() {
        return gulp.src(server/control.css)
            .pipe(minifyCSS())
            .pipe(gulp.dest('./dist/css'));
    });

        上面代码中的minifyCSS()会对流过它的css数据流进行压缩,然后有gulp.dest写入到css目录下。

        gulp中有很多插件,具体根据需要来选择。

    要想使用好gulp.dest()这个方法,就要理解给它传入的路径参数与最终生成的文件的关系。
    gulp的使用流程一般是这样子的:首先通过gulp.src()方法获取到我们想要处理的文件流,然后把文件流通过pipe方法导入到gulp的插件中,最后把经过插件处理后的流再通过pipe方法导入到gulp.dest()中,gulp.dest()方法则把流中的内容写入到文件中,这里首先需要弄清楚的一点是,我们给gulp.dest()传入的路径参数,只能用来指定要生成的文件的目录,而不能指定生成文件的文件名,它生成文件的文件名使用的是导入到它的文件流自身的文件名,所以生成的文件名是由导入到它的文件流决定的,即使我们给它传入一个带有文件名的路径参数,然后它也会把这个文件名当做是目录名,例如:

    1 var gulp = require('gulp');
    2 gulp.src('script/jquery.js')
    3     .pipe(gulp.dest('dist/foo.js'));
    4 //最终生成的文件路径为 dist/foo.js/jquery.js,而不是dist/foo.js

    要想改变文件名,可以使用插件gulp-rename

    下面说说生成的文件路径与我们给gulp.dest()方法传入的路径参数之间的关系。 
    gulp.dest(path)生成的文件路径是我们传入的path参数后面再加上gulp.src()中有通配符开始出现的那部分路径。例如:

    1 var gulp = reruire('gulp');
    2 //有通配符开始出现的那部分路径为 **/*.js
    3 gulp.src('script/**/*.js')
    4     .pipe(gulp.dest('dist')); //最后生成的文件路径为 dist/**/*.js
    5 //如果 **/*.js 匹配到的文件为 jquery/jquery.js ,则生成的文件路径为 dist/jquery/jquery.js
     1 gulp.src('script/avalon/avalon.js') //没有通配符出现的情况
     2     .pipe(gulp.dest('dist')); //最后生成的文件路径为 dist/avalon.js
     3 
     4 //有通配符开始出现的那部分路径为 **/underscore.js
     5 gulp.src('script/**/underscore.js')
     6     //假设匹配到的文件为script/util/underscore.js
     7     .pipe(gulp.dest('dist')); //则最后生成的文件路径为 dist/util/underscore.js
     8 
     9 gulp.src('script/*') //有通配符出现的那部分路径为 *
    10     //假设匹配到的文件为script/zepto.js    
    11     .pipe(gulp.dest('dist')); //则最后生成的文件路径为 dist/zepto.js

    通过指定gulp.src()方法配置参数中的base属性,我们可以更灵活的来改变gulp.dest()生成的文件路径。 
    当我们没有在gulp.src()方法中配置base属性时,base的默认值为通配符开始出现之前那部分路径,例如:

     1 gulp.src('app/src/**/*.css') //此时base的值为 app/src
     2 //上面我们说的gulp.dest()所生成的文件路径的规则,其实也可以理解成,用我们给gulp.dest()传入的路径替换掉gulp.src()中的base路径,最终得到生成文件的路径。
     3 
     4 gulp.src('app/src/**/*.css') //此时base的值为app/src,也就是说它的base路径为app/src
     5      //设该模式匹配到了文件 app/src/css/normal.css
     6     .pipe(gulp.dest('dist')) //用dist替换掉base路径,最终得到 dist/css/normal.css 所以改变base路径后,gulp.dest()生成的文件路径也会改变
     7 
     8 gulp.src(script/lib/*.js) //没有配置base参数,此时默认的base路径为script/lib
     9     //假设匹配到的文件为script/lib/jquery.js
    10     .pipe(gulp.dest('build')) //生成的文件路径为 build/jquery.js
    11 
    12 gulp.src(script/lib/*.js, {base:'script'}) //配置了base参数,此时base路径为script
    13     //假设匹配到的文件为script/lib/jquery.js
    14     .pipe(gulp.dest('build')) //此时生成的文件路径为 build/lib/jquery.js    

    注意:用gulp.dest()把文件流写入文件后,文件流仍然可以继续使用。

    使用gulp-htmlmin压缩html,可以压缩页面javascript、css,去除页面空格、注释,删除多余属性等操作。

     1 var gulp = require('gulp'),
     2     htmlmin = require('gulp-htmlmin');
     3  
     4 gulp.task('testHtmlmin', function () {
     5     var options = {
     6         removeComments: true,//清除HTML注释
     7         collapseWhitespace: true,//压缩HTML
     8         collapseBooleanAttributes: true,//省略布尔属性的值 <input checked="true"/> ==> <input />
     9         removeEmptyAttributes: true,//删除所有空格作属性值 <input id="" /> ==> <input />
    10         removeScriptTypeAttributes: true,//删除<script>的type="text/javascript"
    11         removeStyleLinkTypeAttributes: true,//删除<style>和<link>的type="text/css"
    12         minifyJS: true,//压缩页面JS
    13         minifyCSS: true//压缩页面CSS
    14     };
    15     gulp.src('src/html/*.html')
    16         .pipe(htmlmin(options))
    17         .pipe(gulp.dest('dist/html'));
    18 });

     

  • 相关阅读:
    杂谈
    xss bypass 学习记录
    小结--dns注入
    在CentOS 7 安装没有mysql
    备份WordPress
    php留言
    基于mysq搭建的l许愿墙
    http服务的安装与配置
    centos 7忘记密码重置
    安装centos 7 桌面
  • 原文地址:https://www.cnblogs.com/xfcao/p/10882697.html
Copyright © 2011-2022 走看看