gulp

gulp

什么是gulp

gulp:前端自動(dòng)化項(xiàng)目管理工具
功能: 自動(dòng)化壓縮js, css文件稽亏, 自動(dòng)壓縮圖片文件论熙,自動(dòng)合并文件沛硅,編譯less眼刃,sass,es6轉(zhuǎn)es5等

要使用gulp摇肌,需要安裝node環(huán)境

  • 安裝:
$ npm install gulp -g
$ npm install gulp -D
  • API:
    gulp.src() --全局匹配一個(gè)或多個(gè)文件
    gulp.dest() --將文件寫入目錄
    gulp.symlink() --與dest相似擂红,但是使用軟件連接形式
    gulp.task() --定義任務(wù)
    gulp.parallel() --并行運(yùn)行任務(wù)
    gulp.series() --運(yùn)行任務(wù)序列
    gulp.watch() --當(dāng)文件發(fā)生變化時(shí)做某些操作
    gulp.lastRun() --獲得上次成功運(yùn)行的時(shí)間戳
    gulp.tree() --獲得任務(wù)書樹
    gulp.registry() --獲得或注冊(cè)任務(wù)

發(fā)布任務(wù)

  • 安裝好gulp后,可以在當(dāng)前文件夾下開啟命令行工具,然后輸入gulp,結(jié)果如下
[19:48:29]   No gulpfile found

結(jié)果告訴我們昵骤,在目錄下找不到gulpfile树碱。
注:gulpfile是一個(gè)js文件,我們需要在目錄下創(chuàng)建一個(gè)gulpfile.js文件变秦,將來的任務(wù)都在gulfile.js中執(zhí)行成榜。

  • 目錄下創(chuàng)建gulpfile.js文件,再次輸入命令gulp,結(jié)果如下 :
[19:59:54] Using gulpfile D:\個(gè)人\nodelearn\gulpDemo\gulpfile.js
[19:59:54] Task never defined: default
[19:59:54] To list available tasks, try running: gulp --tasks

結(jié)果提示,default任務(wù)沒有定義蹦玫,可以嘗試運(yùn)行g(shù)ulp --tasks

  • gulpfile.js中使用task定義的default任務(wù)
const gulp = require("gulp");
gulp.task("default",function(){
     console.log("default任務(wù)執(zhí)行了");
});

結(jié)果如下:

[20:11:00] Using gulpfile D:\個(gè)人\nodelearn\gulpDemo\gulpfile.js
[20:11:00] Starting 'default'...
default任務(wù)執(zhí)行了
[20:11:00] The following tasks did not complete: default
[20:11:00] Did you forget to signal async completion?

說明:執(zhí)行了default任務(wù)赎婚,但是并沒有結(jié)束任務(wù)(如果結(jié)束?往下看)樱溉。

gulp.task("default",function(done){
    console.log("default任務(wù)執(zhí)行了");
        done();
});

done();//結(jié)束任務(wù)

  • 創(chuàng)建并行任務(wù)(多個(gè)任務(wù)同時(shí)執(zhí)行)
const gulp = require("gulp")
//創(chuàng)建并行任務(wù)
gulp.task("default",gulp.parallel(taskA,taskB));
function taskA(){
  console.log("執(zhí)行了A");
}
function taskB(){
  console.log("執(zhí)行了B");
}

taskA,taskB任務(wù)同時(shí)執(zhí)行

  • 創(chuàng)建序列任務(wù)(任務(wù)執(zhí)行完一個(gè)再一個(gè))
gulp.task("default",gulp.series(taskA,taskB));
function taskA(){
    console.log("執(zhí)行了A");
}
function taskB(){
    console.log("執(zhí)行了B");
}

沒有調(diào)用done(),taskA沒有執(zhí)行完挣输,則taskB不會(huì)執(zhí)行

  • 給任務(wù)添加別名,執(zhí)行命令時(shí)需要使用: gulp+任務(wù)名
gulp.task("taskA",taskA);
function taskA(){
    console.log("執(zhí)行了A");
}

輸入命令:gulp taskA;

布置一個(gè)任務(wù):將src目錄下的index.html文件復(fù)制到dest目錄下
//布置一個(gè)任務(wù):將src目錄下的index.html文件復(fù)制到dest目錄下
gulp.task("copyHtml",copyHtml);
function copyHtml(){
    return gulp.src("src/index.html").pipe(gulp.dest("dest"));
}

dest目錄會(huì)自動(dòng)生成
src()源文件路徑 讀取文件 是一個(gè)輸出流
pipe()管道輸送 處理文件 是一個(gè)輸出流
dest()目標(biāo)目錄 輸入文件 是一個(gè)輸入流
return:結(jié)束任務(wù)福贞,相當(dāng)于done()撩嚼。

布置一個(gè)任務(wù):將lib目錄下的所有js文件復(fù)制到j(luò)s目錄下
gulp.src("lib/*.js").pipe( gulp.dest("js") );
  • gulp.src("lib/")與gulp.src("lib//的區(qū)別")
    lib/
    :代表src下的所有一級(jí)目錄的文件,不包含二級(jí)目錄文件
    lib/
    :代表src下的所有文件,包含所有二級(jí)目錄文件和多級(jí)目錄文件
    lib/
    /**:代表src下的二級(jí)目錄下的所有文件
匹配模式
  • 單匹配模式
image.png
  • 多匹配模式

    1.類正則:


    image.png

    2.數(shù)組匹配:

布置一個(gè)任務(wù):將不同目錄下的文件復(fù)制到dest目錄下

src參數(shù)可以是一個(gè)數(shù)組

gulp.task("copyCss",function(){
    return gulp.src(["src/*.css","lib/*.css"]).pipe( gulp.dest("dest") );
});
gulp.watch()監(jiān)聽
gulp.task("watchCss",function(){
    return gulp.watch(["src/*.css","lib/*.css"],()=>{
        return gulp.src(["src/*.css","lib/*.css"]).pipe( gulp.dest("dest") );
    });
})

ctrl+c結(jié)束監(jiān)聽

文件合并:npm install gulp-concat --save-dev
css文件壓縮:npm install gulp-cssmin --save-dev
文件重命名:npm install gulp-rename --save-dev
task("concatCss",function(done){
    return src(["src/*.css","lib/*.css"])
            .pipe(concat("concat.css"))
            .pipe(cssmin())
            .pipe(rename("concat.min.css"))
            .pipe(dest("dest"));
})
js文件壓縮:npm install gulp-uglify --save-dev
task("uglifyJs",function(done){
    return src("lib/*.js")
        .pipe(concat("concatJs.js"))
        .pipe(uglify())
        .pipe(rename("concatJs.min.js"))
        .pipe(dest("dest/js"))
})
圖片壓縮:npm install gulp-imagemin@4 --save-dev
//寫法一
task("minImg",function(done){
    return src("images/*.{png,jpg,gif,ico}")
            .pipe(imagemin())
            .pipe(dest("dest/photo"));
})
//寫法二
task("minImg",function(done){
    return src("images/*.{png,jpg,gif,ico}")
            .pipe(imagemin({
                optimizationLevel: 5, //類型:Number  默認(rèn):3  取值范圍:0-7(優(yōu)化等級(jí))
                progressive: true,    //類型:Boolean 默認(rèn):false 無損壓縮jpg圖片
                interlaced: true,     //類型:Boolean 默認(rèn):false 隔行掃描gif進(jìn)行渲染
                multipass: true,      //類型:Boolean 默認(rèn):false 多次優(yōu)化svg直到完全優(yōu)化
            }))
            .pipe(dest("dest/photo"));
})
//寫法三
task("minImg",function(done){
    pump([
        src("images/*.{png,jpg,gif,ico}"),
        imagemin({
            optimizationLevel: 5, //類型:Number  默認(rèn):3  取值范圍:0-7(優(yōu)化等級(jí))
            progressive: true,    //類型:Boolean 默認(rèn):false 無損壓縮jpg圖片
            interlaced: true,     //類型:Boolean 默認(rèn):false 隔行掃描gif進(jìn)行渲染
            multipass: true,      //類型:Boolean 默認(rèn):false 多次優(yōu)化svg直到完全優(yōu)化
        }),
        dest("dest/images")
    ],done)
})
//寫法四
task("minImg",function(done){
    pump([
        src("images/*.{png,jpg,gif,ico}"),
        imagemin([
            imagemin.gifsicle({interlaced: true}),
            imagemin.jpegtran({progressive: true}),
            imagemin.optipng({optimizationLevel: 5}),
            imagemin.svgo({
                plugins: [
                    {removeViewBox: true},
                    {cleanupIDs: false}
                ]
            }),
        ]),
        dest("dest/images")
    ],done)
})
es6轉(zhuǎn)es5 :npm install gulp-babel @babel/core @babel/preset-env --save-dev
task("ES6ToES5",function(done){
    return src("lib/*.js")
        .pipe(babel({
            "presets":["@babel/env"] //es6轉(zhuǎn)es5 這里需要設(shè)置presets
        }))
        .pipe(dest("dest/e6te5"))
})
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末挖帘,一起剝皮案震驚了整個(gè)濱河市完丽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌肠套,老刑警劉巖舰涌,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件猖任,死亡現(xiàn)場(chǎng)離奇詭異你稚,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)朱躺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門刁赖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人长搀,你說我怎么就攤上這事宇弛。” “怎么了源请?”我有些...
    開封第一講書人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵枪芒,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我谁尸,道長(zhǎng)舅踪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任良蛮,我火速辦了婚禮抽碌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘决瞳。我一直安慰自己货徙,他們只是感情好左权,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著痴颊,像睡著了一般赏迟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蠢棱,一...
    開封第一講書人閱讀 51,604評(píng)論 1 305
  • 那天瀑梗,我揣著相機(jī)與錄音,去河邊找鬼裳扯。 笑死抛丽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的饰豺。 我是一名探鬼主播亿鲜,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼冤吨!你這毒婦竟也來了蒿柳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤漩蟆,失蹤者是張志新(化名)和其女友劉穎垒探,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怠李,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡圾叼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了捺癞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片夷蚊。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖髓介,靈堂內(nèi)的尸體忽然破棺而出惕鼓,到底是詐尸還是另有隱情,我是刑警寧澤唐础,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布箱歧,位于F島的核電站,受9級(jí)特大地震影響一膨,放射性物質(zhì)發(fā)生泄漏呀邢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一汞幢、第九天 我趴在偏房一處隱蔽的房頂上張望驼鹅。 院中可真熱鬧,春花似錦、人聲如沸输钩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽买乃。三九已至姻氨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間剪验,已是汗流浹背肴焊。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留功戚,地道東北人娶眷。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像啸臀,于是被迫代替她去往敵國(guó)和親届宠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355