按順序逐個(gè)同步地運(yùn)行 Gulp 任務(wù)

寫在前面

Gulp是一個(gè)非常好用的代碼發(fā)布軟件(比fis3好了不知多少倍)

但它有一個(gè)缺點(diǎn)(不過也是它的優(yōu)點(diǎn)),就是它的所有任務(wù)都是異步完成的,對(duì)于一些必須要同步執(zhí)行的操作,就會(huì)有問題了。

例如我要進(jìn)行一個(gè)工程的樣式文件進(jìn)行發(fā)布,那我要先對(duì)scss進(jìn)行編譯,然后對(duì)里面的圖片合并為雪碧圖,最后在對(duì)處理好的css進(jìn)行合并壓縮。

這是一個(gè)環(huán)環(huán)相扣的任務(wù)鏈,這時(shí)Gulp的異步操作就不能用了。

那怎么辦呢?

gulp-sequence

這個(gè)gulp的社區(qū)早就有很多此類控件可以讓我們調(diào)用了,例如gulp的開發(fā)文檔里就有如何同步執(zhí)行任務(wù)的說明(不過這個(gè)太簡(jiǎn)單了),還有國(guó)內(nèi)的 Teambition 團(tuán)隊(duì)開源了 gulp-sequence,以及國(guó)外開發(fā)者開發(fā)的 run-sequence

下面我就用 gulp-sequence來做為例子說說怎么順序逐個(gè)同步地運(yùn)行 Gulp 任務(wù)

就用我上面說的樣式發(fā)布的操作來做例子:

這是編譯scss的任務(wù):

gulp.task( 'spriteScss', function( cb ) {
    var src = [];
    src.push( cssSrc + "home/" + projectModule + '/**/*.scss' );

    return gulp.src( src )
        .pipe( sass().on( 'error', sass.logError ) )
        .pipe( gulp.dest( 'spriteScss' ) );
} );

合并樣式文件

gulp.task( 'spriteCss', function( cb ) {
    var src = [];
    src.push( 'spriteScss/**/*.css' );
    //- 創(chuàng)建一個(gè)名為 concat 的 task
    return gulp.src( src )
        //- 合并后的文件名
        .pipe( concat( projectModule + '.css' ) )
        .pipe( replace( /\(images\//g, '(../spriteImg/' ) )
        //- 輸出文件本地
        .pipe( gulp.dest( 'spriteCss' ) );
} );

生成雪碧圖

gulp.task( 'spriteDest', function( cb ) {
    return gulp.src( 'spriteCss/' + projectModule + '.css' )
        .pipe( cssSprite( {
            // sprite背景圖源文件夾,只有匹配此路徑才會(huì)處理
            imagepath: 'spriteImg/',
            // 映射CSS中背景路徑,支持函數(shù)和數(shù)組,默認(rèn)為 null
            imagepath_map: null,
            // 雪碧圖輸出目錄,注意,會(huì)覆蓋之前文件!默認(rèn) images/
            spritedest: 'spriteImg/',
            // 替換后的背景路徑,默認(rèn) ../images/
            spritepath: '../images/' + projectModule + '/',
            // 各圖片間間距,如果設(shè)置為奇數(shù),會(huì)強(qiáng)制+1以保證生成的2x圖片為偶數(shù)寬高,默認(rèn) 0
            padding: 2,
            // 是否使用 image-set 作為2x圖片實(shí)現(xiàn),默認(rèn)不使用
            useimageset: false,
            // 是否以時(shí)間戳為文件名生成新的雪碧圖文件,如果啟用請(qǐng)注意清理之前生成的文件,默認(rèn)不生成新文件
            newsprite: mode === "release", //判斷是否發(fā)布模式,是就建以時(shí)間戳為文件名的文件,否則不建。
            // 給雪碧圖追加時(shí)間戳,默認(rèn)不追加
            spritestamp: false,
            // 在CSS文件末尾追加時(shí)間戳,默認(rèn)不追加
            cssstamp: false
        } ) )
        .pipe( gulp.dest( 'spriteDest/' ) );
} );

那我們只要這樣使用控件

gulp.task( 'css', gulpSequence( 'spriteScss', 'spriteCss', 'spriteDest', function() {
    console.log( "輸出完成!" );
} ) );

就可以完成任務(wù)的同步運(yùn)行了。

當(dāng)然 gulp-sequence還不止這種用方法,如果感興趣的話可以去它的github去了解。

————
前端·小h
紙上得來終覺淺,絕知此事要躬行

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 安裝Gulp首先需要安裝Node.js,并在控制臺(tái)輸入$ npm install gulp -gMac端需要寫成$...
    LaBaby_閱讀 1,024評(píng)論 0 1
  • 在現(xiàn)在的前端開發(fā)中,前后端分離、模塊化開發(fā)、版本控制、文件合并與壓縮、mock數(shù)據(jù)等等一些原本后端的思想開始...
    Charlot閱讀 5,669評(píng)論 1 32
  • 原文標(biāo)題:Gulp for Beginners作者: Zell Liew翻譯:治電小白菜原文地址:https://...
    ZZES_ZCDC閱讀 1,725評(píng)論 6 18
  • 參照Gulp for Beginners來學(xué)習(xí)Gulp基本內(nèi)容。以下為學(xué)習(xí)記錄筆記。 安裝Gulp 首先需要安裝N...
    JenniferYe閱讀 2,669評(píng)論 1 17
  • 原文地址:https://css-tricks.com/gulp-for-beginners/原文代碼:https...
    小雨雪smile閱讀 1,566評(píng)論 0 2

友情鏈接更多精彩內(nèi)容