gulp学习点滴


项目目录

现在要对当前的项目进行压缩,对里面的样式,图片,脚本,静态页面进行压缩
在网上找了找看有没有现成的工具使用
因为项目用的是seajs,所以想找一个能对模块合并的方法,但是目前还没有合适的方法,网上的方法 gulp-seajs-combo gulp-alias-combo ,对我有配置的sea.config都没有很好的支持,所以我放弃了,还是先压缩再考虑合并问题,花了几天的时间先了解nodejs,gulp
百度,google了一堆教程,先安装了nodejs, gulp gulp插件集锦
用的是visual studio code开发
先把工具配好,参考 Visual Studio Code 使用 Typings 实现智能提示功能

//在你的项目根目录下创建gulpfile.js,代码如下:
/// <reference path="./typings/main.d.ts" />
// 引入 gulp
var gulp = require('gulp');
// 引入组件
var changed = require('gulp-changed');  
var debug = require('gulp-debug');
var del = require('del'); //删除文件
var watch = require('gulp-watch');//监控文件变化
var batch = require('gulp-batch');
var vinylPaths = require('vinyl-paths');//虚拟管道
var filter = require('gulp-filter'); //文件过滤
var livereload = require('gulp-livereload');
var newer = require('gulp-newer');
var htmlmin = require('gulp-htmlmin'), //html压缩
    imagemin = require('gulp-imagemin'),//图片压缩
    pngcrush = require('imagemin-pngcrush'),
    minifycss = require('gulp-minify-css'),//css压缩
    jshint = require('gulp-jshint'),//js检测
    uglify = require('gulp-uglify'),//js压缩
    UglifyJS = require('uglify-js'), //JS压缩
    concat = require('gulp-concat'),//文件合并
    rename = require('gulp-rename'),//文件更名  
    through = require("through2"),
    plumber = require('gulp-plumber');

图片压缩任务

gulp.task('buildimg', function() {
    return gulp.src('./{distributor,consumer,retailer}/image/*.{png,jpg}', { base: './' })    
        .pipe(changed('build'))   
        .pipe(debug({title: '编译:'}))
        .pipe(imagemin({
            progressive: true,
            svgoPlugins: [{removeViewBox: false}],
            use: [pngcrush()]
        }))
        .pipe(gulp.dest('build'));
});

样式任务

gulp.task('buildCss', function() {
    return gulp.src('./{distributor,consumer,retailer}/css/*.css', { base: './' })
        .pipe(debug({title: '编译:'}))
        .pipe(minifycss())
        .pipe(gulp.dest('build'));
});

脚本任务

gulp.task('buildjs', function() {
     return gulp.src(['./{distributor,consumer,retailer}/js/*.js',
                      './js/*.js',
                      './js/jquery/1.11.3/*.js',                      
                      './js/{jquery,seajs}/*.js',
                      '!./{distributor,consumer,retailer}/js/jquery-*.js'], { base: './' })
        .pipe(changed('build'))
        .pipe(debug({title: '编译:'}))
        // .pipe(concat('all.js'))
        // .pipe(gulp.dest('dest/js'))
        // .pipe(rename({ suffix: '.min' }))
        .pipe(uglify({
            //mangle: true,//类型:Boolean 默认:true 是否修改变量名
            mangle: {except: ['require' ,'exports' ,'module' ,'$','wx','wxjsconfig']}//排除混淆关键字
        }))
        .pipe(gulp.dest('build'));
});

html

gulp.task('buildhtml', function () {
      
  return gulp
    .src('./{distributor,consumer,retailer}/page/*.html',{ base: './' })
    .pipe(changed('build'))
    .pipe(debug({title: '编译:'}))
    .pipe(through.obj(function(file, encode, cb) {
    var contents = file.contents.toString(encode);       
        var HTMLMinifier = require("html-minifier").minify; //压缩
        var minified = HTMLMinifier(contents, {
          minifyCSS: true,
          minifyJS: true,
          collapseWhitespace: true,
          removeAttributeQuotes: true
        });
        file.contents = new Buffer(minified, encode);
        cb(null, file, encode);     
    }))
    .pipe(gulp.dest('build'));
});

文件监控,这个花的时间最多,对文件的新增,删除,修改都有及时的反应


function isunlink(file) {    
    return file.event === 'unlink';
}

var filterisunlink = filter(isunlink, {restore: true});

function getfiletype(file)
{
    var filepath = file.path;    
        var index = filepath.lastIndexOf('.');
        var filetype = "";        
        if(index>0)
            filetype = filepath.substring(index,filepath.length);  
    return filetype;
}

function isAdded(file) {  
    
    return file.event === 'add' || file.event === 'change';
}
function ishtml(file)
{
    return getfiletype(file) == ".html";
}
function isjs(file)
{
    return getfiletype(file) == ".js";
}
function isCSS(file)
{
    return getfiletype(file) == ".css";
}
function isImage(file)
{
    return getfiletype(file) == ".jpg" || getfiletype(file) == ".png";
}
var filterAdded = filter(isAdded, {restore: true});

var filterHtml = filter(ishtml,{restore: true});

var filterJs = filter(isjs,{restore: true});

var filterCss = filter(isCSS,{restore: true});

var filterImage = filter(isImage,{restore: true});

gulp.task('buildwatch', function () {    
    return gulp.src('./{distributor,consumer,retailer,js}/**', { base: './' })
        .pipe(watch('./{distributor,consumer,retailer,js}/**'))
        .pipe(filterAdded)
        .pipe(debug({title: '编译:'}))      
        .pipe(filterHtml)        
        .pipe(through.obj(function(file, encode, cb) {
            var contents = file.contents.toString(encode);       
            var HTMLMinifier = require("html-minifier").minify; //压缩
            var minified = HTMLMinifier(contents, {
            minifyCSS: true,
            minifyJS: true,
            collapseWhitespace: true,
            removeAttributeQuotes: true
            });
            file.contents = new Buffer(minified, encode);
            cb(null, file, encode);     
        }))
        .pipe(filterHtml.restore)
        .pipe(filterJs)
         .pipe(uglify({
            //mangle: true,//类型:Boolean 默认:true 是否修改变量名
            mangle: {except: ['require' ,'exports' ,'module' ,'$','wx','wxjsconfig']}//排除混淆关键字
        }))
        .pipe(filterJs.restore)
         .pipe(filterImage)
        .pipe(imagemin({
            progressive: true,
            svgoPlugins: [{removeViewBox: false}],
            use: [pngcrush()]
        }))
        .pipe(filterImage.restore)
        .pipe(filterCss)
        .pipe(minifycss())
        .pipe(filterCss.restore)
        .pipe(gulp.dest('build'))        
        .pipe(filterAdded.restore)       
        .pipe(filterisunlink)          
        .pipe(gulp.dest('build'))
        .pipe(vinylPaths(del))
        .pipe(filterisunlink.restore)
        .pipe(livereload());     
});

之前的版本,对新增及删除,支持不太好

// gulp.task('watch',function(){
//     // 监听html文件变化    
//     var watcher = gulp.watch('{distributor,consumer,retailer,js}/**');
//     watcher.on('change', function(event) {
//         var filepath =  event.path;
//         var index = filepath.lastIndexOf('.');
//         var filetype = "";
//         console.log('File ' + event.path + ' was ' + event.type + ', running tasks...');
//         if(index>0)
//             filetype = filepath.substring(index,filepath.length);               
//         switch(filetype)
//         {
//             case '.html':
//                 gulp.run('buildhtml');
//             break;
//             case '.js':
//                 gulp.run('buildjs');
//             break;
//             case '.css':
//                 gulp.run('buildCss');
//             break;
//             case '.png':
//             case '.jpg':            
//                 gulp.run('buildimg');
//             break;
//             default:
//             console.log("没有找到该类型的文件" + filetype);
//         }        
        
//     });
// })

待续 2015-05-15 19:57
参考&进一步阅读
是时候搁置Grunt,耍一耍gulp了
前端打包构建工具gulp快速入门
Gulp:插件编写入门
gulp:更简单的自动化构建工具

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 207,248评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,681评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,443评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,475评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,458评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,185评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,451评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,112评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,609评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,083评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,163评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,803评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,357评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,357评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,590评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,636评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,925评论 2 344

推荐阅读更多精彩内容

  • 内向与外向的区分在于获得能量的方式不一样。内向的人独处的时候获得能量。外向的人从与人交往中获得能量。 内向的人更适...
    chinawzck阅读 1,075评论 1 0
  • 2016年的最后一个晚上,走着走着就走没了。 最后倒数五秒钟是在电影院看着手机数的。其实好像也没什么意义,时钟每天...
    狸猫酱阅读 144评论 0 0
  • 最后的最后,她将他送到返回的列车上,挂着标志性的微笑,挥手再见。即使她知道,这一挥手可能就是永远的别离了。 我们是...
    密迩儿阅读 747评论 6 5
  • 我想生活的魅力就在于此吧:享受生活带给我们的各种波澜不惊,细细品味其中的妙趣横生! 学生姓名:牛少坤 年级:五年...
    小倪老师有话说阅读 640评论 3 4