Gulp的前端工程构建配置

创建一个文件夹并进入,使用Git bash进入这个文件夹下,执行npm init来生成package.json文件,创建工程目录如下:

image.png

在工程根目录下创建gulpfile.js文件,文件名称必须这么写。文件中的配置如下[根据需要自行配置]

var gulp = require("gulp"), 
    $ = require("gulp-load-plugins")(), //在方法后面加上括号,表示立即调用
    open = require("gulp-open"),
    spritesmith = require("gulp.spritesmith"), //制作雪碧图
    pngquant = require("imagemin-pngquant");

var app = {
    srcPath:"src/", // 源代码路径
    devPath:"build/", //整合后的路径,开发路径
    prdPath:"dist/" //生产环境路径
}


//html任务
gulp.task("html",()=>{
    let option = {
        removeComments: true,//清除HTML注释
        collapseWhitespace: true,//压缩HTML
        collapseBooleanAttributes: false,//省略布尔属性的值 <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(app.srcPath+"**/*.html")
    .pipe(gulp.dest(app.devPath))
    .pipe($.htmlmin(option))
    .pipe(gulp.dest(app.prdPath))
})

//JSON任务
gulp.task("json",()=>{
    gulp.src(app.srcPath+"data/*.json")
    .pipe(gulp.dest(app.devPath+"data"))
    .pipe(gulp.dest(app.prdPath+"data"))
})

//css任务
gulp.task("css",()=>{
    gulp.src(app.srcPath+"style/index.less")
    .pipe($.less()) //编译less
    .pipe(gulp.dest(app.devPath+"/css/"))
    .pipe($.cssmin()) //压缩css
    .pipe(gulp.dest(app.prdPath+"/css/"))
})

//js任务
gulp.task("js",()=>{
    gulp.src(app.srcPath+"script/**/*.js")
    .pipe($.concat("index.js"))  //拼接js
    .pipe($.babel())
    .pipe(gulp.dest(app.devPath+"/js/"))
    .pipe($.uglify()) //压缩js
    .pipe(gulp.dest(app.prdPath+"/js/"))
})

//image任务
gulp.task("img",()=>{
    gulp.src([app.srcPath+"images/app/**/*","!"+app.srcPath+"images/sprites/**/*","!"+app.srcPath+"images/sprites/**"])
    .pipe(gulp.dest(app.devPath+"/images/"))
    .pipe($.imagemin())
    .pipe(gulp.dest(app.prdPath+"/images/"))
})

//制作雪碧图 spritemith
gulp.task("sprite",function(){
    gulp.src(app.srcPath+"images/sprites/**/*")
    .pipe($.imagemin({ //图片压缩
      progressive:true,
      use: [pngquant()] //使用pngquant深度压缩png图片的imagemin插件
    }))
    .pipe(spritesmith({
        imgName:'images/sprite.png', //合并后大图的名称
        cssName:'css/sprite.css',
        padding:5,// 每个图片之间的间距,默认为0px
        algorithm:'binary-tree',
        cssFormat:"less",
        cssTemplate:function(data){
        // data为对象,保存合成前小图和合成打大图的信息包括小图在大图之中的信息
        let arr = [],
          width = data.spritesheet.px.width,
          height = data.spritesheet.px.height,
          url =  data.spritesheet.image
          data.sprites.forEach(function (sprite) {
            arr.push(
              ".unify-" + sprite.name +
              "{" +
              "background: url('" + url + "') " +
              "no-repeat " +
              sprite.px.offset_x + " " + sprite.px.offset_y + ";" +
              "background-size: " + width + " " + height + ";" +
              "width: " + sprite.px.width + ";" +
              "height: " + sprite.px.height + ";" +
              "}\n"
            )
          });
        return arr.join("")
        }
    }))
    .pipe(gulp.dest(app.devPath+"/"))
    .pipe(gulp.dest(app.prdPath+"/"))
})


//clean任务
gulp.task("clean",()=>{
    gulp.src([app.devPath,app.prdPath])
    .pipe($.clean())
})

//build任务
gulp.task("build",['html','css','js','json','img','sprite']);

//server任务
gulp.task("server",['build'],()=>{
    $.connect.server({
        root:[app.prdPath], //服务器从那个路径开始读取,默认从开发路径读取
        livereload:true, //每当写完之后自动刷新浏览器,只支持高版本浏览器
        port:3344//端口号
    })
    open("http://localhost:3344") //启动服务器,打开页面
    watchFuncs();
})

//watch监听任务
const watchPath = {
    html:app.srcPath + "**/*.html",
    less:app.srcPath + "css/**/*.less",
    json:app.srcPath + "data/**/*.json",
    js:app.srcPath + "script/**/*.js",
    img:app.srcPath + "images/**/*"
}
gulp.task("watch",()=>{
    watchFuncs()
})

let watchFuncs = ()=>{
    gulp.watch(watchPath.html,["html"])
    gulp.watch(watchPath.less,["css"])
    gulp.watch(watchPath.json,["json"])
    gulp.watch(watchPath.js,["js"])
    gulp.watch(watchPath.img,["img"])
}

//默认执行任务
gulp.task("default",['server'])

以上配置知识简单的介绍应用,具体可以更具项目需要修改。

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