Gulp 前端構建工具

Gulp是一個自動化的前端構建工具,具備一些優勢:css

  • 易於使用:經過代碼優於配置的策略,Gulp 讓簡單的任務簡單,複雜的任務可管理。
  • 構建快速:利用 Node.js 流的威力,你能夠快速構建項目並減小頻繁的 IO 操做。
  • 高質量的插件:Gulp 嚴格的插件指南確保插件如你指望的那樣簡潔高質得工做。
  • 易於學習:經過最少的 API,掌握 Gulp 絕不費力,構建工做盡在掌握:如同一系列流管道。

一、Gulp的安裝

  • 一、首先安裝nodejs環境
  • 二、全局安裝Gulp
npm install -g gulp
  • 三、項目中安裝gulp

切換目錄到要使用gulp的項目,在命令中執行html

npm install gulp
  • 四、若想在安裝的時候把gulp寫進項目package.json中,須要在命令行中加上--save-dev
npm install --save-dev gulp

對於全局安裝gulp後還要在項目內再進行一次gulp安裝的緣由是爲了版本的靈活性。前端

二、使用

2.一、建立主文件

建立一個主文件夾,命名爲gulpfile.js,同時將該文件放於使用gulp的項目目錄中。gulpfile.js文件用於定義咱們的任務,如下爲一個簡單的gulpfile.js文件的示例:node

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

此時目錄結構爲:jquery

|--gulpfile.js
|--node_modules
|   |--gulp
|-- package.json

2.二、運行gulp任務

切換到gulpfile.js文件的目錄下,執行命令git

gulp

若是要執行特定的任務,這執行命令:github

gulp task

若是沒有指定任務,則執行任務名爲default的默認任務。正則表達式

三、Gulp 的API

gulp經常使用的API有4個:npm

  • gulp.task()
  • gulp.src()
  • gulp.dest()
  • gulp.watch()

3.1 gulp.src()

Gulp是以stream爲媒介的,它不須要頻繁的生成臨時文件,
gulp.src() 正是用於獲取流的。這個流的內容是一個虛擬文件對象流(Vinyl files),虛擬文件對象中存儲着原始文件的路徑、文件名、內容等信息。語法爲:json

gulp.src(globs[, options])
  • globs參數是文件匹配模式(相似正則表達式),用來匹配文件路徑(包括文件名),固然這裏也能夠直接指定某個具體的文件路徑。當有多個匹配模式時,該參數能夠爲一個數組。
  • options爲可選參數。一般狀況下咱們不須要用到。

gulp匹配具備必定的規則及文件匹配技巧:

  • *匹配文件路徑中的0個或多個字符,但不會匹配路徑分隔符,除非路徑分隔符出如今末尾
  • **匹配路徑中的0個或多個目錄及其子目錄,須要單獨出現,即它左右不能有其餘東西了。若是出如今末尾,也能匹配文件。
  • ? 匹配文件路徑中的一個字符(不會匹配路徑分隔符)
  • [...] 匹配方括號中出現的字符中的任意一個,當方括號中第一個字符爲^或!時,則表示不匹配方括號中出現的其餘字符中的任意一個,相似js正則表達式中的用法
  • !(pattern|pattern|pattern) 匹配任何與括號中給定的任一模式都不匹配的
  • ?(pattern|pattern|pattern) 匹配括號中給定的任一模式0次或1次,相似於js正則中的(pattern|pattern|pattern)?
  • +(pattern|pattern|pattern) 匹配括號中給定的任一模式至少1次,相似於js正則中的(pattern|pattern|pattern)+
  • *(pattern|pattern|pattern) 匹配括號中給定的任一模式0次或屢次,相似於js正則中的(pattern|pattern|pattern)*
  • @(pattern|pattern|pattern) 匹配括號中給定的任一模式1次,相似於js正則中的(pattern|pattern|pattern)

有多種匹配模式時可使用數組:

//使用數組的方式來匹配多種文件
gulp.src(['js/*.js','css/*.css','*.html'])

使用數組還能夠很方便的使用排除模式,在數組中的單個匹配模式前加上!便是排除模式,在匹配結果中排除這個匹配,可是不能在數組中的第一個元素中使用排除模式。

gulp.src([ .js,'!b.js']) //匹配全部js文件,但排除掉以b開頭的js文件
gulp.src(['!b .js',.js]) //不會排除任何文件,由於排除模式不能出如今數組的第一個元素中

3.2 gulp.task()

gulp.task方法用來定義任務:

gulp.task(name[, deps], fn)
  • name 爲任務名
  • deps 是當前定義的任務須要依賴的其餘任務,爲一個數組。當前定義的任務會在全部依賴的任務執行完畢後纔開始執行。若是沒有依賴,則可省略這個參數
  • fn 爲任務函數,咱們把任務要執行的代碼都寫在裏面。該參數也是可選的。

定義一個有依賴的任務:

gulp.task('mytask', ['array', 'of', 'task', 'names'], function() { 
  // Do something
});

gulp.task()任務的執行順序爲:當任務相互之間沒有依賴時,任務會按照書寫的順序來執行,若是有依賴的話則會先執行依賴的任務(當依賴的任務是同步的)。
當依賴的任務爲異步時,gulp並不會等依賴執行完,而是緊接着執行後續的任務。

若是想要在異步任務執行完再執行後續的任務,有三種方式:

一、異步操做完成時設置回調函數通知gulp異步任務已經完成,此時的回調函數就是任務函數的第一個參數

gulp.task('one',function(cb){ //cb爲任務函數提供的回調,用來通知任務已經完成
  //one是一個異步執行的任務
  setTimeout(function(){
    console.log('one is done');
    cb();  //執行回調,表示這個異步任務已經完成
  },5000);
});

//這時two任務會在one任務中的異步操做完成後再執行
gulp.task('two',['one'],function(){
  console.log('two is done');
});

二、定義任務時返回一個流對象。適用於任務就是操做gulp.src獲取到的流的狀況。

gulp.task('one',function(cb){
  var stream = gulp.src('client/**/*.js')
      .pipe(dosomething()) //dosomething()中有某些異步操做
      .pipe(gulp.dest('build'));
    return stream;
});

gulp.task('two',['one'],function(){
  console.log('two is done');
});

三、返回一個promise對象

var Q = require('q'); //一個著名的異步處理的庫 https://github.com/kriskowal/q
gulp.task('one',function(cb){
  var deferred = Q.defer();
  // 作一些異步操做
  setTimeout(function() {
     deferred.resolve();
  }, 5000);
  return deferred.promise;
});

gulp.task('two',['one'],function(){
  console.log('two is done');
});

3.3 gulp.dest()

gulp.src() 用於寫文件,其語法爲:
語法爲:

gulp.dest(path[,options])
  • path爲寫入文件的路徑
  • options爲一個可選的參數對象,一般咱們不須要用到

gulp的使用流程以下:
首先經過gulp.src()方法獲取到咱們想要處理的文件流,而後把文件流經過pipe方法導入到gulp的插件中,最後把通過插件處理後的流再經過pipe方法導入到gulp.dest()中,gulp.dest()方法則把流中的內容寫入到文件中,這裏首先須要弄清楚的一點是,咱們給gulp.dest()傳入的路徑參數,只能用來指定要生成的文件的目錄,而不能指定生成文件的文件名,它生成文件的文件名使用的是導入到它的文件流自身的文件名,因此生成的文件名是由導入到它的文件流決定的,即便咱們給它傳入一個帶有文件名的路徑參數,而後它也會把這個文件名當作是目錄名,例如:

var gulp = require('gulp');
gulp.src('script/jquery.js')
    .pipe(gulp.dest('dist/foo.js'));
//最終生成的文件路徑爲 dist/foo.js/jquery.js,而不是dist/foo.js

生成的文件與傳入gulp.dest()的參數有必定的聯繫,gulp.dest(path)生成的文件路徑是咱們傳入的path參數後面再加上gulp.src()中有通配符開始出現的那部分路徑。

var gulp = reruire('gulp');
//有通配符開始出現的那部分路徑爲 **/*.js
gulp.src('script/**/*.js')
    .pipe(gulp.dest('dist')); //最後生成的文件路徑爲 dist/**/*.js
//若是 **/*.js 匹配到的文件爲 jquery/jquery.js ,則生成的文件路徑爲 dist/jquery/jquery.js

經過指定gulp.src()方法配置參數中的base屬性,咱們能夠更靈活的來改變gulp.dest()生成的文件路徑。
當咱們沒有在gulp.src()方法中配置base屬性時,base的默認值爲通配符開始出現以前那部分路徑,例如:

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

實際上,gulp.dest()所生成的文件路徑的規則,其實也能夠理解成,用咱們給gulp.dest()傳入的路徑替換掉gulp.src()中的base路徑,最終獲得生成文件的路徑。

gulp.src('app/src/**/*.css') //此時base的值爲app/src,也就是說它的base路徑爲app/src
     //設該模式匹配到了文件 app/src/css/normal.css
    .pipe(gulp.dest('dist')) //用dist替換掉base路徑,最終獲得 dist/css/normal.css

因此改變base路徑後,gulp.dest()生成的文件路徑也會改變

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

gulp.src(script/lib/*.js, {base:'script'}) //配置了base參數,此時base路徑爲script
    //假設匹配到的文件爲script/lib/jquery.js
    .pipe(gulp.dest('build')) //此時生成的文件路徑爲 build/lib/jquery.js

gulp.dest()把文件流寫入文件後,文件流仍然能夠繼續使用

3.4 gulp.watch()

gulp.watch()用來監視文件的變化,當文件發生變化後,咱們能夠利用它來執行相應的任務,例如文件壓縮等.

gulp.watch(glob[, opts], tasks)

glob 爲要監視的文件匹配模式,規則和用法與gulp.src()方法中的glob相同。
opts 爲一個可選的配置對象,一般不須要用到
tasks 爲文件變化後要執行的任務,爲一個數組

另外一種使用方式爲:

gulp.watch(glob[, opts, cb])

globopts 參數與第一種用法相同
cb 爲一個函數。每當監視的文件發生變化時,就會調用這個函數,而且會給它傳入一個對象,該對象包含了文件變化的一些信息,type屬性爲變化的類型,能夠是added,changed,deleted;path屬性爲發生變化的文件的路徑

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

四、經常使用插件

4.1 自動加載插件(gulp-load-plugins)

命令:

npm install --save-dev gulp-load-plugins

4.2 重命名(gulp-rename)

命令:

npm install --save-dev gulp-rename

4.3 js文件壓縮(gulp-uglify)

命令:

npm install --save-dev gulp-uglify

4.4 css文件壓縮(gulp-minify-css)

命令:

npm install --save-dev gulp-minify-css

4.5 html文件壓縮(gulp-minify-html)

命令:

npm install --save-dev gulp-minify-html

4.6 js代碼檢查(gulp-jshint)

命令:

npm install --save-dev gulp-jshint

4.7 文件合併(gulp-concat)

命令:

npm install --save-dev gulp-concat

4.8 less 和 sass 編譯(gulp-less/gulp-sass)

命令:

npm install --save-dev gulp-less

npm install --save-dev gulp-sass

4.9 圖片壓縮(gulp-imagemin)

命令:

npm install --save-dev gulp-imagemin

4.10 自動刷新(gulp-livereload)

命令:

npm install --save-dev gulp-livereload
相關文章
相關標籤/搜索