• 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');
     
     
     
  • 相关阅读:
    iPhone 调用Web Service 例子(转)
    iPhone开发:在UIAlertView中显示进度条(转)
    Oracel 分页
    NYOJ 477
    NYOJ 108(数组中存的是前n个数的和)
    NYOJ 199
    NYOJ 311(完全背包)
    高效斐数(前92位)
    NYOJ 57(6174问题)
    NYOJ 546(分珠宝)
  • 原文地址:https://www.cnblogs.com/r-mp/p/11113085.html
Copyright © 2020-2023  润新知