Gulp前端构建

mean开发系列工具篇之gulp

2016-02-03  本文已影响1002人  9I

前言

本文默认你已经安装好node环境,并且熟悉node命令,和window cd命令。


gulp简介

基于nodejs流的自动化构建工具,可以快速构建项目并减少频繁的I/0操作。你可以利用gulp插件完成各种自动化任务:测试、检查、合并、压缩、格式化、浏览器自动刷新、部署文件生成,并监听文件在改动后重复指定的这些步骤。官方中文网传送门


gulp安装

NPM是基于命令行的node包管理工具,它可以将node的程序模块安装到项目中,
我们利用npm来安装gulp.


gulp 使用

在你的项目根目录下创建文件gulpfile.js文件:

var gulp = require('gulp');
gulp.task('default', function() { 
     // 将你的默认的任务代码放在这
  });

运行gulp:

 $ gulp

默认的名为 default 的任务(task)将会被运行,在这里由于没有任何代码,所以这个任务并未做任何事情。
  想要单独执行特定的任务(task),请输入 gulp <task> ,上面等价于:

   $ gulp default

gulp API简介

       gulp.src('src/js/*.js') //模糊匹配src/js文件夹下所有js文件
          .pipe( concat('app.js'))//
          .pipe(gulp.dest('pub/dist/js'));//合并后文件路径
  gulp.src('./client/templates/*.jade') 
     .pipe(jade()) 
     .pipe(gulp.dest('./build/templates'))
     .pipe(minify()) 
     .pipe(gulp.dest('./build/minified_templates'));
gulp.task('mytask', ['array', 'of', 'task', 'names'], function() { 
  return gulp.src('client/**/*.js') 
             .pipe(minify())
             .pipe(gulp.dest('build'));
});

接受一个callback

// 在 shell 中执行一个命令
var exec = require('child_process').exec;
gulp.task('jekyll', function(cb) { 
     // 编译 Jekyll 
    exec('jekyll build', function(err) { 
            if (err) return cb(err); // 返回 error 
           cb(); // 完成 task 
     }); 
});

注意: 默认的,task 将以最大的并发数执行,也就是说,gulp 会一次性运行所有的 task 并且不做任何等待。如果你想要创建一个序列化的 task 队列,并以特定的顺序执行,你需要做两件事:
给出一个提示,来告知 task 什么时候执行完毕,
并且再给出一个提示,来告知一个 task 依赖另一个 task 的完成。

var gulp = require('gulp');
// 返回一个 callback,因此系统可以知道它什么时候完成
gulp.task('one', function(cb) { 
// 做一些事 -- 异步的或者其他的 
     cb(err); // 如果 err 不是 null /undefined,则会停止执行,注意,这样代表执行失败了
});
// 定义一个所依赖的 task 必须在这个 task 执行之前完成
gulp.task('two', ['one'], function() {
 // 'one' 完成后
});
gulp.task('default', ['one', 'two']);
gulp.watch('js/**/*.js', function(event) { 
console.log('File ' + event.path + ' was ' + event.type + ', running tasks...');
});

文件变动后执行一个或者多个task的。有js文件变动,执行jshint验证任务再刷新浏览器:

gulp.watch('js/**/*.js', ['jshint']).on('change', plugins.livereload.changed);

gulp使用

3.1 gulp之文件合并--gulp-concat

为了减少网络请求,通常会对文件夹进行合并。

var gulp = require('gulp'),
    concat = require('gulp-concat');//引入gulp及插件gulp-concat
    gulp.task('concat', function () {//定义任务concat
       gulp.src('src/js/*.js') //模糊匹配src/js文件夹下所有js文件
          .pipe(concat('app.js'))//合并后的文件名
         .pipe(gulp.dest('pub/dist/js'));//合并后文件路径
   });
Paste_Image.png

上图为合并压缩重命名后的文件名。下面会一一讲到。

3.2 gulp之js文件压缩gulp-uglify

为了减少文件大小,通常会对文件进行压缩处理。

var gulp = require('gulp'),
    uglify = require('gulp-uglify');
 
   gulp.task('min', function () {
       gulp.src(['src/js/index.js','src/js/app.js']) //多个文件以数组形式或模糊匹配传入.
          .pipe(uglify({
            mangle: true,//类型:Boolean 默认:true 是否修改变量名
            compress: true//类型:Boolean 默认:true 是否完全压缩
        }))
        .pipe(gulp.dest('pub/dist/js'));//压缩后存放路劲
});

uglify具体参数查看

3.3 gulp之css文件压缩gulp-minify-css

var gulp = require('gulp'),
    cssmin = require('gulp-minify-css');
gulp.task('Cssmin', function () {
    gulp.src('src/css/*.css')
        .pipe(cssmin())
        .pipe(gulp.dest('dist/css'));
});
 var gulpLoadPlugins = require('gulp-load-plugins'),
       cssver = require('gulp-make-css-url-version'),
      plugins = gulpLoadPlugins();//load-plugins一次加载所有依赖的gulp插件
   gulp.task('Cssmin', function () {
      return gulp.src('modules/*/client/css/*.css')
             .pipe(cssver()) //给css文件里引用文件加版本号(文件MD5)
             .pipe(cssmin({
               advanced: false,//类型:Boolean 默认:true [是否开启高级优化(合并选择器等)]
               compatibility: 'ie7',//类型:String 默认:''or'*' [启用兼容模式; 'ie7':IE7兼容模式,'ie8':IE8兼容模式,'*':IE9+兼容模式]
               keepBreaks: true//类型:Boolean 默认:false [是否保留换行]
        }))
       .pipe(gulp.dest('public/dist'));
    });

插件gulp-make-css-url-version 给css文件里引用url加版本号(根据引用文件的md5生产版本号)
.class(background:url(../img/1.jpg?v=je82o9djZTYljusqe%2B3D%4B5A) no-repeat)

3.4 gulp之图片压缩gulp-imagemin

压缩图片文件(包括PNG、JPEG、GIF和SVG图片)

var gulp = require('gulp'),
    imagemin = require('gulp-imagemin'); 
   gulp.task('Imagemin', function () {
        gulp.src('src/img/*.{png,jpg,gif,ico}')
           .pipe(imagemin())
           .pipe(gulp.dest('dist/img'));
    });
var gulp = require('gulp'),
    imagemin = require('gulp-imagemin');
  gulp.task('Imagemin', function () {
       gulp.src('src/img/*.{png,jpg,gif,ico}')
          .pipe(imagemin({
            optimizationLevel: 5, //类型:Number  默认:3  取值范围:0-7(优化等级)
            progressive: true, //类型:Boolean 默认:false 无损压缩jpg图片
            interlaced: true, //类型:Boolean 默认:false 隔行扫描gif进行渲染
            multipass: true //类型:Boolean 默认:false 多次优化svg直到完全优化
        }))
        .pipe(gulp.dest('public/dist'));
});
var gulp = require('gulp'),
    gulpLoadPlugins = require('gulp-load-plugins'), //自动加载插件
    pngquant = require('imagemin-pngquant'),//深度压缩插件
    plugins = gulpLoadPlugins(); //实例化
  gulp.task('testImagemin', function () {
    gulp.src('src/img/*.{png,jpg,gif,ico}')
        .pipe(plugins.cache(plugins.imagemin({
            progressive: true,
            svgoPlugins: [{removeViewBox: false}],//不要移除svg的viewbox属性
            use: [pngquant()] //使用pngquant 插件深度压缩
        })))
        .pipe(gulp.dest('dist/img'));
});

3.5 自动加载插件gulp-load-plugins

上面很多例子都用到这个插件。由于我们项目中有时候会用到很多插件,如果都用require进来,我们得写很多行require代码,虽然这样没问题,但是会显得很冗长,所以gulp-load-plugins应运而生,帮我们加载这些插件。

var gulp = require('gulp'),
plugins = require('gulp-load-plugins')();

3.6 gulp之HTML文件压缩gulp-htmlmin

可以压缩页面javascript、css,去除页面空格、注释,删除多余属性等操作

var gulp = require('gulp'),
     plugins = require('gulp-load-plugins')(); //自动插件引用
     //htmlmin = require('gulp-htmlmin'); 单独引用
gulp.task('testHtmlmin', function () {
    var options = {
        removeComments: true,//清除HTML注释
        collapseWhitespace: true,//压缩HTML
        collapseBooleanAttributes: true,//省略布尔属性的值 <input checked="true"/> ==> <input />
        removeEmptyAttributes: true,//删除所有空格属性值 <input id="" /> ==> <input />
        removeScriptTypeAttributes: true,//删除<script>的type="text/javascript"
        removeStyleLinkTypeAttributes: true,//删除<style>和<link>的type="text/css"
        minifyJS: true,//压缩页面JS
        minifyCSS: true//压缩页面CSS
    };
    gulp.src('src/html/*.html')
        .pipe(plugins.htmlmin(options))
        .pipe(gulp.dest('dist/html'));
});

3.7 gulp之less文件编译(gulp-less)

将less文件编译成css,当有less文件发生改变自动编译less,并保证less语法错误或出现异常时能正常工作并提示错误信息。

var gulp = require('gulp'),
    less = require('gulp-less'); 
gulp.task('less', function () {
    gulp.src('src/less/*.less')
        .pipe(less())
        .pipe(gulp.dest('src/css'));
});

一般会使用通配符自动编译less

var gulp = require('gulp'),
     less = require('gulp-less'),
     //本地安装gulp-minify-css [npm install gulp-minify-css --save-dev]
    cssmin = require('gulp-minify-css');
gulp.task('testLess', function () {
    gulp.src('src/less/**/*.less')
        .pipe(less())
        .pipe(cssmin()) 
         //兼容IE7及以下需设置compatibility属性 
        //.pipe(cssmin({compatibility: 'ie7'}))
        .pipe(gulp.dest('pub/css'));
});
var gulp = require('gulp'),
     plugins = require('gulp-load-plugins')(); //自动插件引用
    gulp.task('less', function () {
        return gulp.src('src/less/**/*.less')
            .pipe(plugins.less()) //编译
           .pipe(plugins.rename(function (file) {
           //把编译后less文件重命名为css文件
           file.dirname = file.dirname.replace(path.sep + 'less', path.sep + 'css');
    }))
    .pipe(gulp.dest('./modules/'));//编译后存放目录
});
 plugins.livereload.listen(); //启动live-reload监听
gulp
.watch('src/less/**/*.less', ['sass', 'csslint'])
.on('change', plugins.livereload.changed);

官方实时重载和CSS注入实例传送门

3.8 gulp之sass文件编译(gulp-sass)

sass和less同为css预处理器,gulp处理方法也差不多

var gulp = require('gulp'), 
plugins = require('gulp-load-plugins')(); //自动插件引用
 gulp.task('less', function () { 
    return gulp.src('src/less/**/*.sass') 
      .pipe(plugins.sass()) //编译sass
      .pipe(plugins.rename(function (file) {
    //重命名为css
       file.dirname = file.dirname.replace(path.sep + 'scss', path.sep + 'css'); 
    }))
    .pipe(gulp.dest('./modules/'));//指定存放路径
});

3.9 gulp之js语法检查(gulp-jshint)

根据jshint规则检查语法错误,规范项目编码。详细规则请查看JHS详细规则

var gulp = require('gulp'), 
jshint = require("gulp-jshint"); 
gulp.task('jsLint', function () { 
   gulp.src('client/**/*.js')
     .pipe(jshint()) 
     .pipe(jshint.reporter()); // 输出检查结果
});
var gulp = require('gulp'), 
plugins = require('gulp-load-plugins')(); //自动插件引用
gulp.task('jshint', function () {
    return gulp.src('client/**/*.js')
       .pipe(plugins.jshint())
       .pipe(plugins.jshint.reporter('default'))// 调用default输出结果
       .pipe(plugins.jshint.reporter('fail')); //调用fail输出检查错误
});

3.10 gulp之css语法检查(gulp-csslint)

根据规则检查CSS语法

var gulp = require('gulp'), 
plugins = require('gulp-load-plugins')(); 
gulp.task('csslint', function (done) {
   return gulp.src(d'client/**/*.css')
    .pipe(plugins.csslint('.csslintrc'))//加载配置文件
    .pipe(plugins.csslint.reporter())
    .pipe(plugins.csslint.reporter(function (file) {
      if (!file.csslint.errorCount) { //有错误,输出具体错误
        done();
      }
    }));
});

3.11 gulp之重命名(gulp-rename)

这个插件上面已经过了好多次了。

var gulp = require('gulp'),
 rename = require('gulp-rename'),
uglify = require('gulp-uglify'),
DEST = 'build/';
gulp.task('default', function() { 
   return gulp.src('foo.js') // 这会输出一个未压缩过的版本 
      .pipe(gulp.dest(DEST)) // 这会输出一个压缩过的并且重命名未 foo.min.js 的文件
     .pipe(uglify())
     .pipe(rename({ extname: '.min.js' })) 
     .pipe(gulp.dest(DEST));
});

3.12 gulp之测试gulp-mocha

mocha 是一个简单、灵活有趣的 JavaScript 测试框架,用于 Node.js 和浏览器上的 JavaScript 应用测试

var gulp = require('gulp');
var mocha = require('gulp-mocha');
gulp.task('default', function() { 
  return gulp.src(['test/test-*.js'], { read: false }) 
          .pipe(mocha({ reporter: 'spec', 
                globals: { should: require('should') }
               }));
});
var gulp = require('gulp');
var mocha = require('gulp-mocha');
var gutil = require('gulp-util'); //gulp工具库
gulp.task('mocha', function() {
    return gulp.src(['test/*.js'], { read: false }) 
      .pipe(mocha({ reporter: 'list' })) 
      .on('error', gutil.log);}); //记录错误
gulp.task('watch-mocha', function() { 
     gulp.watch(['lib/**', 'test/**'], ['mocha']);});

3.13 gulp之自动刷新gulp-livereload

监听到文件改动自动刷新前端页面,不需要F5。
上面好几个例子已经使用过了,下面简单介绍下。

var gulp = require('gulp'), 
     plugins = require('gulp-load-plugins')(); //自动插件引用
gulp.task('sass', function() {
     gulp.src('sass/**/*.scss') 
        .pipe(plugins.sass()) 
        .pipe(gulp.dest('css'))
        .pipe(plugins.livereload());});
gulp.task('watch', function() { 
    plugins.livereload.listen(); //要在这里调用listen()方法
    gulp.watch('sass/**/*.scss', ['sass']);
});

3.14 gulp之自动重启node程序gulp-nodemon

监听到node服务文件改动自动重启node,官方文档传送门

gulp.task('nodemon', function () {
  return plugins.nodemon({
    script: 'server.js',
    nodeArgs: ['--debug'],
    ext: 'js,html', //文件扩展名
    env: { 'NODE_ENV': 'development',//环境-开发环境(生产环境)
    watch: ['server.js', 'config/**/*.js', 'modules/*/server/**/*.js'],
    tasks: ['jshint'] //任务
  });
});

3.15 gulp之其他插件

  var runSequence = require('run-sequence');
  gulp.task('default', function(done) {
     runSequence('env:dev', 'lint', ['nodemon', 'watch'], done);
   // env:dev', 'lint', 'nodemon', 'watch'均是任务
  });
var gulp = require('gulp');
var browserSync = require('browser-sync');
gulp.task('browser-sync', function() { 
    browserSync({ 
        files: "**", 
          server: { 
               baseDir: "./" 
                 } 
     });
});
gulp.task('default', ["browser-sync"]);
var gulp = require('gulp');
var del = require('del');
gulp.task('clean:tmp', function (cb) {
     del([ 'dist/report.csv', 
      // 使用通配模式来匹配 `tmp` 文件夹中的所有东西
        'dist/tmp/**/*', 
// 我们不希望删掉这个文件,使用!排除
       '!dist/tmp/temp.json' 
       ], cb);
});
gulp.task('default', ['clean:tmp']);

结语

关于gulp用法以及常用插件就讲解到这里,如果错误请指正。

上一篇下一篇

猜你喜欢

热点阅读