Gulp的安裝使用與API詳解

前言

以前一直使用Grunt作為前端自動化構(gòu)建工具,但始終覺得配置繁瑣尺迂,在之后一個項目中便決定使用更流行的構(gòu)建工具Gulp。因為Gulp使用node的stream流進行文件和數(shù)據(jù)的讀取操作蹲盘,能減少I/O次數(shù),速度更快铃诬,主要API只有4個趣席,易上手醇蝴。下面我們來詳細學習一下Gulp這個工具吧。

安裝

確保你已經(jīng)安裝好了node環(huán)境霉涨,首先全局安裝gulp

npm install -g gulp

然后切換路徑到你項目的package.json文件所在目錄下笙瑟,本地安裝gulp

npm install gulp --save-dev

為什么要安裝兩次呢癞志?因為全局安裝是方便你直接使用gulp命令,而本地安裝是因為之后需要安裝的gulp插件需要依賴gulp秉宿。主要是為了靈活,不用太糾結(jié)蘸鲸。

開始使用gulp

與grunt依賴一個Gruntfile.js一樣窿锉,gulp也依賴一個主文件gulpfile.js酌摇,這個文件主要定義了gulp的一些任務。我們可以進入項目package.json文件所在目錄窑多,一般是根目錄洼滚,創(chuàng)建一個js文件并命名為gulpfile.js埂息,然后寫入一個最簡單的任務,例如:

var gulp = require('gulp');
gulp.task('default',function(){
    console.log('hello world');
});

這時我們的目錄結(jié)構(gòu)為
├── gulpfile.js
├── node_modules
│ └── gulp
└── package.json
在終端運行命令gulp便可看到終端打印一句hello world遥巴。你可以給任務一個特定的名字,然后運行特定任務铲掐,如gulp build,如果沒有指定任務則自動執(zhí)行default任務摆霉。

API介紹

搭建好工具后就要寫入一些任務為項目服務了,gulp的任務編寫就跟寫js一樣携栋,主要API只有4個gulp.src()婉支、gulp.dest()鸯隅、gulp.task()、gulp.watch()磅摹,易于掌握,下面主要介紹一些易理解偏差的點饼灿,所以大家還是先看一遍官網(wǎng)的介紹

1帝美、gulp.scr()

在gulp中使用的是node的stream流,首先獲取到stream庇忌,然后通過stream的pipe()方法把流導向你想要的地方舞箍,而gulp.src()方法就是獲取流的皆疹。但這個并不是原本的文件流疏橄,而是封裝過后的虛擬文件對象流(Vinyl files)捎迫,帶有原始文件的名稱表牢、路徑窄绒、內(nèi)容等信息。該方法的語法為:

gulp.src(globs [, options])

globs是文件匹配模式(類似正則匹配)崔兴,用來匹配文件路徑,也可以直接指定某個具體的文件路徑位谋,如果有多組匹配模式可以使用數(shù)組形式堰燎。options是一個可選參數(shù)。

下面介紹一下globs的匹配規(guī)則:

  • * 匹配文件路徑中的0個或多個字符,但不會匹配路徑分隔符翩腐,除非路徑分隔符出現(xiàn)在末尾。
  • ** 匹配路徑中的0個或多個目錄及其子目錄何什,需要單獨出現(xiàn)处渣,即它左右不能有其他東西了泥畅。如果出現(xiàn)在末尾方椎,也能匹配文件钧嘶。
  • ? 匹配文件路徑中的一個字符(不會匹配路徑分隔符)有决。
  • [...] 匹配方括號中出現(xiàn)的字符中的任意一個闸拿,當方括號中第一個字符為^!時疮薇,則表示不匹配方括號中出現(xiàn)的其他字符中的任意一個胸墙,類似js正則表達式中的用法按咒。
  • !(pattern|pattern|pattern) 匹配與括號中給定的任一模式都不匹配的字符励七。
  • ?(pattern|pattern|pattern) 匹配括號中給定的任一模式0次或1次吼野。
  • +(pattern|pattern|pattern) 匹配括號中給定的任一模式至少1次瞳步。
  • *(pattern|pattern|pattern) 匹配括號中給定的任一模式0次或多次嘀倒。
  • @(pattern|pattern|pattern) 匹配括號中給定的任一模式1次碳胳。

當有多組匹配模式時盗誊,可以使用數(shù)組

gulp.src(['static/**/*.js', 'static/**/*.css', 'static/**/*.html'])

使用數(shù)組的好處在于能使用!進行排除某些模式,但注意!不能為數(shù)組的第一個字符

gulp.src(['static/**/*.js', '!static/module/*.js'])
2质欲、gulp.dest()

gulp.dest()方法是用來寫文件的树埠,語法如下:

gulp.dest(path [, options])

path是路徑參數(shù),options是可選參數(shù)嘶伟,一般用不到怎憋。

如果想用好這個方法,就要理解好文件傳入路徑與傳出路徑的關系九昧。gulp的工作流程是通過src()獲取指定路徑下的文件流绊袋,通過pipe()導到某些gulp插件中處理,完成后通過pipe()導到dest()中铸鹰,最后寫到指定的目錄下愤炸。

  • 這里重要的一點是,gulp.dest()的路徑參數(shù)只能指定生成文件的目錄路徑名稱掉奄,不能指定生成文件的文件名稱,而文件名稱是由傳入的文件流名稱決定的凤薛。
var gulp = require('gulp');
gulp.src('script/jquery.js')
    .pipe(gulp.dest('dist/foo.js'));
//最終生成的文件路徑為 dist/foo.js/jquery.js,而不是dist/foo.js

如果想改變文件名稱可以使用其他gulp插件完成姓建。

  • 另一點是gulp.dest()生成的路徑是由path參數(shù)加上gulp.src()文件匹配路徑的通配符開始出現(xiàn)后的部分組成,舉例說明:
var gulp = require('gulp');
// 如果匹配到的文件是static/js/me/me.js
gulp.src('static/js/**/*.js')
      // 由于通配符出現(xiàn)的部分是**/*.js缤苫,所以導出的文件路徑是dist/js/me/me.js
      .pipe(gulp.dest('dist/js'));

再比如

gulp.src('script/avalon/avalon.js') //沒有通配符出現(xiàn)的情況
    .pipe(gulp.dest('dist')); //最后生成的文件路徑為 dist/avalon.js

通過設置gulp.src()base參數(shù)速兔,可以靈活的修改gulp.dest()生成的路徑,如果沒有設置則base參數(shù)默認是指傳入路徑匹配模式通配符出現(xiàn)前的部分活玲,比如:

gulp.src('app/src/**/*.css') //此時base的值為 app/src

所以上面的說法可以理解為涣狗,gulp.dest()生成的路徑是path參數(shù)替換傳入文件路徑的base部分谍婉,修改base參數(shù)就可以修改生成文件路徑,比如:

// 沒有配置base參數(shù)镀钓,此時默認的base路徑為script/lib
gulp.src('script/lib/*.js') 
     // 假設匹配到的文件為script/lib/jquery.js
    .pipe(gulp.dest('build')); // 生成的文件路徑為 build/jquery.js

// 如果配置了base參數(shù)穗熬,此時base路徑為script
gulp.src('script/lib/*.js', {base:'script'}) 
    //假設匹配到的文件為script/lib/jquery.js
    .pipe(gulp.dest('build'));// 此時生成的文件路徑為 build/lib/jquery.js
  • gulp.dest()把文件流寫入文件后,文件流還能導入其他插件繼續(xù)使用
3丁溅、gulp.task()

gulp.task()是用來定義任務的唤蔗,內(nèi)部使用的是Orchestrator,一個以最大并發(fā)排列和運行任務和依賴的模塊窟赏,task的語法為:

gulp.task(name [, deps] fn)

name是定義的任務名妓柜,deps是任務依賴的其他任務,是一個數(shù)組的形式涯穷,定義的任務會在依賴的任務執(zhí)行完成后再執(zhí)行棍掐,如果沒有依賴任務可以省略,fn是任務具體執(zhí)行的操作拷况,該參數(shù)也是可選的作煌。

gulp.task()中執(zhí)行多個任務,可以通過依賴來完成蝠嘉,比如要執(zhí)行default任務時最疆,還要執(zhí)行one、two蚤告、three三個任務努酸,可以這樣寫

// 這樣one tow three三個任務都被執(zhí)行了
gulp.task('default', ['one', 'two', 'three'], function() {
    // do something
})

如果任務相互間沒有依賴,則任務會按照你寫的順序執(zhí)行杜恰,如果有依賴則先執(zhí)行依賴的任務获诈。但如果某個依賴的任務是異步的,那gulp不會等待這個異步任務執(zhí)行完心褐,而會繼續(xù)執(zhí)行后面的任務舔涎。例如:

gulp.task('one',function(){
  //one是一個異步執(zhí)行的任務
  setTimeout(function(){
    console.log('one is done')
  },5000);
});

//two任務雖然依賴于one任務,但并不會等到one任務中的異步操作完成后再執(zhí)行
gulp.task('two',['one'],function(){
  console.log('two is done');
});

最終的結(jié)果是先打印'two is done',然后再打印'one is done'逗爹。
那我們?nèi)绾螌崿F(xiàn)異步任務同步的功能呢亡嫌,請看另一篇文章《以同步的方式運行 Gulp 任務和任務中的步驟》

4掘而、gulp.watch()

gulp.watch()是用來監(jiān)聽文件變化的挟冠,這樣你就可以在開發(fā)中實時監(jiān)測文件的改動,然后自動做出相應的變化袍睡,比如壓縮知染,其語法為

gulp.watch(glob [, opts] task)

glob是文件的通配符模式,匹配文件路徑斑胜,opts是可配置參數(shù)控淡,一般不用嫌吠,task是監(jiān)聽變化后要執(zhí)行的任務,是一個數(shù)組掺炭。

gulp.task('uglify',function(){
  //do something
});
gulp.task('reload',function(){
  //do something
});
gulp.watch('js/**/*.js', ['uglify','reload']);

gulp.watch()還有另一種形式

gulp.watch(glob [, opts] cb)

前兩個參數(shù)一樣辫诅,cb是回調(diào)函數(shù),監(jiān)聽的文件變化時會調(diào)用該方法竹伸,方法傳遞一個參數(shù)泥栖,該參數(shù)帶有文件變化的信息,type屬性為變化的類型勋篓,可以是added吧享,changeddeleted譬嚣;path屬性為發(fā)生變化的文件的路徑

gulp.watch('js/**/*.js', function(event){
    console.log(event.type); //變化類型 added為新增,deleted為刪除钢颂,changed為改變 
    console.log(event.path); //變化的文件的路徑
}); 

gulp常用插件

  • gulp-rename 重命名文件
  • gulp-sass 編譯scss文件
  • gulp-uglify 壓縮js文件
  • gulp-concat 合并文件,css和js
  • gulp-htmlmin 壓縮html文件
  • gulp-autoprefixer 編譯廠商前綴
  • gulp-clean 刪除文件
  • gulp-rev 根據(jù)文件內(nèi)容生成hash值拜银,做靜態(tài)資源版本管理
  • gulp-rev-collector 替換html中的文件引用殊鞭,與gulp-rev一起用
  • gulp.spritesmith 生成精靈圖
  • gulp-load-plugins加載gulp插件,減少require的書寫
  • gulp-requirejs-optimize 合并打包requirejs的模塊引用
  • pump 使gulp的文件流往下傳遞尼桶,包括error操灿,如果有一個地方報錯,流的傳遞會停止
  • gulp-util 用來在命令中輸入?yún)?shù)泵督,給任務傳遞自定義的參數(shù)
  • run-sequence 以同步的方式執(zhí)行異步任務

最后希望本文能幫助初學gulp的朋友理解gulp趾盐,參考自《前端構(gòu)建工具gulpjs的使用介紹及技巧》,謝謝小腊!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末救鲤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子秩冈,更是在濱河造成了極大的恐慌本缠,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件入问,死亡現(xiàn)場離奇詭異丹锹,居然都是意外死亡,警方通過查閱死者的電腦和手機芬失,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門卷仑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人麸折,你說我怎么就攤上這事≌匙颍” “怎么了垢啼?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵窜锯,是天一觀的道長。 經(jīng)常有香客問我芭析,道長锚扎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任馁启,我火速辦了婚禮驾孔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘惯疙。我一直安慰自己翠勉,他們只是感情好,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布霉颠。 她就那樣靜靜地躺著对碌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蒿偎。 梳的紋絲不亂的頭發(fā)上朽们,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天,我揣著相機與錄音诉位,去河邊找鬼骑脱。 笑死,一個胖子當著我的面吹牛苍糠,可吹牛的內(nèi)容都是我干的叁丧。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼椿息,長吁一口氣:“原來是場噩夢啊……” “哼歹袁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起寝优,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤条舔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后乏矾,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體孟抗,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年钻心,在試婚紗的時候發(fā)現(xiàn)自己被綠了凄硼。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡捷沸,死狀恐怖摊沉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情痒给,我是刑警寧澤说墨,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布骏全,位于F島的核電站,受9級特大地震影響尼斧,放射性物質(zhì)發(fā)生泄漏姜贡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一棺棵、第九天 我趴在偏房一處隱蔽的房頂上張望楼咳。 院中可真熱鬧,春花似錦烛恤、人聲如沸母怜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽糙申。三九已至,卻和暖如春船惨,著一層夾襖步出監(jiān)牢的瞬間柜裸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工粱锐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留疙挺,地道東北人。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓怜浅,卻偏偏與公主長得像铐然,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子恶座,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容

  • gulpjs是一個前端構(gòu)建工具搀暑,與gruntjs相比,gulpjs無需寫一大堆繁雜的配置參數(shù)跨琳,API也非常簡單自点,學...
    井皮皮閱讀 1,292評論 0 10
  • gulpjs是一個前端構(gòu)建工具,與gruntjs相比脉让,gulpjs無需寫一大堆繁雜的配置參數(shù)桂敛,API也非常簡單,學...
    MC丶逗逼嘿閱讀 671評論 0 3
  • gulpjs是一個前端構(gòu)建工具溅潜,與gruntjs相比术唬,gulpjs無需寫一大堆繁雜的配置參數(shù),API也非常簡單滚澜,學...
    小裁縫sun閱讀 921評論 0 3
  • Gulp 是一個前端構(gòu)建工具粗仓,與 Grunt 相比,Gulp 無需寫一大堆繁雜的配置參數(shù),API也非常簡單借浊,學習起...
    侯工閱讀 443評論 0 3
  • gulpjs是一個前端構(gòu)建工具眶掌,與gruntjs相比,gulpjs無需寫一大堆繁雜的配置參數(shù)巴碗,API也非常簡單,學...
    build1024閱讀 527評論 0 0