zoukankan      html  css  js  c++  java
  • 自动构建工具Gulp

    摘要:

       gulp与grunt一样,都是自动构建工具。和grunt相比它更突出一个流的概念,任务是一个接一个执行的。今天就分享如何用gulp做自动化。

    安装:

      gulp也是基于node环境,所以安装gulp之前你需要安装node.js。

       npm install -g gulp

    只要在命令窗口中执行上面一行命令就完成安装,这样安装的是全局安装。在项目中一般是通过package.json中的devDependencies属性来安装。如下:

    {
        "name": "",
        "version": "0.0.0",
        "description": "",
        "main": "gulpfile.js",
        "dependencies": {},
        "devDependencies": {
            "gulp": "~3.5.6"
        },
        "license": "ISC"
    }

    执行npm install就会将gulp安装到当前项目中。

    如何运行:

      安装完gulp之后,需要新建一个gulpfile.js文件,一般是在项目的根目录,与package.json放在一块。那gulpfile.js文件里面到底写什么呢?当然是定义一些任务。如下:

    var gulp = require('gulp');
    
    gulp.task('default', function() {
      // 执行任务
    });

    然后在当前目录中通过命令窗口执行gulp,default里面的任务就会被执行。

    配置参数:   

    gulp.src(globs[, options])

      加载文件,并将文件以流的方式传到插件中,如下:

    gulp.src('client/templates/*.jade')
      .pipe(jade())
      .pipe(minify())
      .pipe(gulp.dest('build/minified_templates'));

    gulp首先会加载client/templates/下的所有jade文件,然后分别传递给jade插件、minify插件,然后输出到build/minified_templates中。

    globs

      类型:String,Array

      文件或者是路径,多个文件以数组的形式。

    options

      类型:Object

      gulp通过options将配置参数传递给node

    options.buffer

      类型:bool

      默认值: false

      是否将文件以流的方式返回,false设置文件内容以流的方式读取,并且不缓存,对于大文件设置缓存将是非常有用的。

    options.read

      类型:bool

      默认值:true  

      设置是否读取文件,如果设置false将永远不读取文件

    options.base

      类型: String

      设置输出文件的根目录,如下:

    gulp.src('client/js/**/*.js') // Matches 'client/js/somedir/somefile.js' and resolves `base` to `client/js/`
      .pipe(minify())
      .pipe(gulp.dest('build'));  // Writes 'build/somedir/somefile.js'
    
    gulp.src('client/js/**/*.js', { base: 'client' })
      .pipe(minify())
      .pipe(gulp.dest('build'));  // Writes 'build/js/somedir/somefile.js'

    gulp.dest(path[, options])

      输出文件,可以输出到不同目录下,如果目录不存在就创建,如下:

    gulp.src('./client/templates/*.jade')
      .pipe(jade())
      .pipe(gulp.dest('./build/templates'))
      .pipe(minify())
      .pipe(gulp.dest('./build/minified_templates'));

    path

      类型: String,Function

      设置输出文件的路径

    options.cwd

      类型: String

      默认值: process.cwd()

      输出的文件夹,只有当路径为相对路径时才起作用

    options.mode

      类型:String

      默认值:0777

      设置输出文件的权限

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

    定义一个任务,如下:

    gulp.task('somename', function() {
      // Do stuff
    });

    name

    任务名,调用任务是只需要gulp.run(任务名)

    deps

      类型:Array

      执行当前任务所需要依赖的任务,被依赖的任务会在当前任务执行之前执行。注意异步任务

    fn

      需要执行的任务都定义在此处

    异步执行任务:

    使用回调函数

    // run a command in a shell
    var exec = require('child_process').exec;
    gulp.task('jekyll', function(cb) {
      // build Jekyll
      exec('jekyll build', function(err) {
        if (err) return cb(err); // return error
        cb(); // finished task
      });
    });

    返回一个文件流

    gulp.task('somename', function() {
      var stream = gulp.src('client/**/*.js')
        .pipe(minify())
        .pipe(gulp.dest('build'));
      return stream;
    });

    使用promise

    var Q = require('q');
    
    gulp.task('somename', function() {
      var deferred = Q.defer();
    
      // do async stuff
      setTimeout(function() {
        deferred.resolve();
      }, 1);
    
      return deferred.promise;
    });

    注意任务依赖关系,下面是一个例子:

    var gulp = require('gulp');
    
    // takes in a callback so the engine knows when it'll be done
    gulp.task('one', function(cb) {
        // do stuff -- async or otherwise
        cb(err); // if err is not null and not undefined, the run will stop, and note that it failed
    });
    
    // identifies a dependent task must be complete before this one begins
    gulp.task('two', ['one'], function() {
        // task 'one' is done now
    });
    
    gulp.task('default', ['one', 'two']);

    gulp.watch(glob [, opts], tasks) or gulp.watch(glob [, opts, cb])

    监听文件,当文件发生变化时,定义的任务将会被执行。如下当js文件发生改变时会触发change事件。

    var watcher = gulp.watch('js/**/*.js', ['uglify','reload']);
    watcher.on('change', function(event) {
      console.log('File ' + event.path + ' was ' + event.type + ', running tasks...');
    });

    或者:

    gulp.watch('js/**/*.js', function(event) {
      console.log('File ' + event.path + ' was ' + event.type + ', running tasks...');
    });

      

     实例:

    下面是一个简单的例子,实现js、css的压缩合并。

    package.json安装模块

    {
        "name": "",
        "version": "0.0.0",
        "description": "",
        "main": "gulpfile.js",
        "dependencies": {},
        "devDependencies": {
            "gulp": "~3.5.6",
            "gulp-minify-css": "~0.3.0",
            "gulp-uglify": "^1.0.0",
            "gulp-concat": "~2.0.0",
            "gulp-rename": "^1.0.0"
        },
        "license": "ISC"
    }

     gulpfile.js

    var gulp = require('gulp');
    
    // 加载模块
    var
        minifycss = require('gulp-minify-css'), // CSS压缩
        uglify = require('gulp-uglify'),        // js压缩
        concat = require('gulp-concat'),        // 合并文件
        rename = require('gulp-rename');        // 重命名
    
    
    // 合并、压缩、重命名css
    gulp.task('min-styles', function() {
      gulp.src(['./static/css/*.css'])
        .pipe(concat('all.css'))
        .pipe(gulp.dest('./static/build/css/'))
        .pipe(rename({ suffix: '.min' }))
        .pipe(minifycss())
        .pipe(gulp.dest('./static/build/css'));
    });
    
    // 合并,压缩js文件
    gulp.task('min-javascripts', function() {
      gulp.src('./static/js/*.js')
        .pipe(concat('all.js'))
        .pipe(gulp.dest('./static/build/js'))
        .pipe(rename({ suffix: '.min' }))
        .pipe(uglify())
        .pipe(gulp.dest('./static/build/js'));
    });
    
    
    // 定义develop任务发布或者运行时使用
    gulp.task('develop',function(){
      gulp.run('min-styles','min-javascripts');
    });
    
    
    // gulp命令默认启动的就是default
    gulp.task('default', function() {
    
      // 监听.css文件,一旦有变化,立刻调用min-styles任务执行
      gulp.watch('./css/*.css', ['min-styles']);
    
      gulp.run('develop');
    });

     在gulpfile.js文件目录下,通过命令窗执行gulp,则default任务就会执行。

  • 相关阅读:
    liferay常用api总结
    liferay增删改简单小练习
    MD5加密
    日期的工具类
    java生成随机六位数的验证码&随机生成十位数ValidCode码,用于邮件的验证&检查是不是符合为合法的中国的手机号码
    MyBaties
    网页的外观---CSS层叠样式表---03
    还在买鲜花送女神?手把手教你搭建3D立体相册网站,包女神稀饭
    Vue入门——常见指令及其详细代码示例
    什么是可串行化MVCC
  • 原文地址:https://www.cnblogs.com/xiyangbaixue/p/4135717.html
Copyright © 2011-2022 走看看