Gulp in action

gulp 和grunt一樣,都是任務自動管理工具,和grunt相比,gulp更加好用,配置也更加靈活。


1、安裝

gulp也是基於nodejs的,同樣可以通過npm安裝,

全局安裝

npm install -g gulp

在項目中安裝

npm install gulp --save-dev

2、兩個例子

創建名爲gulpfile.js,在這個文件中通過gulp命令定義gulp 任務,在gulpfile.js添加如下代碼:

var gulp =require('gulp'),
   uglify =require('gulp-uglify');

gulp.task('minify',function(){
   gulp.src('js/app.js').pipe(uglify()).pipe(gulp.dest('build'))
});

需要先安裝gulp-uglify, 命令如下:

npm install gulp-uglify  --save-dev

然後再該目錄下簡歷一個js目錄,在這個目錄下建一個app.js文件,鍵入內容:

function test(){
 var info= "This is a gulp information"
 return info.indexOf("gulp");
}

這時候就可以看下 效果瞭然後再解釋其中的流程。命令如下:

gulp minify

稍等一下,會看到如下效果:

wKiom1T5UJaSVeiQAABda2AgEXc226.jpg

流程到底是什麼樣子的?我們先分析一下:

首先,先加載gulp和gulp-uglify插件,然後定義一個名字爲minify的task,當這個task被調用時,會運行第二個匿名方法。最後,方法中的代碼纔是真正要實現的功能,gulp是採用流的方式,從一個功能點流向另一個功能點。gulp.src()參數是一個字符串,指向一個或多個文件,它會創建一個指向文件的流對象,這些對象會被傳遞到uglify方法,返回一個包含壓縮代碼的文件對象,然後返回的對象傳遞給gulp.dest(),用來保存文件。

上面的例子是執行一個任務,如果是多個任務,先看下面的代碼:

gulp.task('js', function () {
   return gulp.src('js/*.js')
      .pipe(jshint())
      .pipe(uglify())
      .pipe(concat('app.js'))
      .pipe(gulp.dest('build'));
});

運行之前,先安裝 gulp, gulp-jshint, gulp-uglify and gulp-concat上面的代碼分別進行jshint,uglify,concat處理。

3、方法解釋

(1)gulp.src()

    這個方法主要產生數據流,參數是對應一個或者多個的字符串,一般有幾種形式:

        js/app.js 完整匹配一個文件

   js/*.js  匹配js目錄下的所有js文件

   js/**/*.js  匹配js文件夾下的所有js文件,包括子文件夾

   !js/app.js 除了js/app.js以外的所有文件

   *.+(js|css)匹配根目錄下的js或者css文件

(2)定義task

使用gulp.tash()來定義一個task,當定義一個簡單任務時,這個方法接受兩個參數:task的名字和要執行的方法。

 gulp.task('greet', function () {
   console.log('Hello world!');
  });

還可以執行一系列的任務:

gulp.task('build', ['css', 'js', 'imgs']);

build任務有三個任務組成,這三個任務都是異步執行的,所以無法保證js的任務在css任務執行完纔開始執行。要是想實現這樣的效果也不是不可能的,如果想在某個任務執行前執行某個任務,可以通過指定依賴的方式,例子說明:

gulp.task('css', ['greet'], function () {
   // Deal with CSS here
});

上面代碼的意思是,等task greet執行完纔開始執行task css。

(3)默認的task

gulp.task('default', function () {
   // Your default task
});

(4)監控文件

gulp也提供了監控文件內容變化的功能,當文件變化時運行一個或多個task,

gulp.task('watch', function () {
   gulp.watch('templates/*.tmpl.html', ['build']);
});

當templates目錄下的html文件變化時,會執行build任務。當然你也可以將上面的task改造一下,將事件對象event傳進去:

gulp.watch('templates/*.tmpl.html', function (event) {
   console.log('Event type: ' + event.type); // added, changed, or deleted
   console.log('Event path: ' + event.path); // The path of the modified file
});

gulp.watch()還有一個比較好的特性,就是返回一個watcher,使用watcher來註冊事件,看一個例子:

var watcher = gulp.watch('templates/*.tmpl.html', ['build']);
watcher.on('change', function (event) {
   console.log('Event type: ' + event.type); // added, changed, or deleted
   console.log('Event path: ' + event.path); // The path of the modified file
});

當然除了change事件還有其他的事件:

 end: 當文件變化後還沒有出發任何的回調函數

 error:文件有錯誤

 ready:文件被搜索到後,開始監視

 nomatch:沒有匹配到任何文件

watcher還包含其他的方法:end(),files(), files(), add(), remove()

4 插件

1、gulp完整的插件可以訪問http://gulpjs.com/plugins/ 查看,在前面的例子中我們已經使用 gulp-jshint, gulp-uglify and gulp-concat插件,

var gulp = require('gulp'),
    jshint = require('gulp-jshint'),
    uglify = require('gulp-uglify'),
    concat = require('gulp-concat');

gulp.task('js', function () {
   return gulp.src('js/*.js')
      .pipe(jshint())
      .pipe(jshint.reporter('default'))
      .pipe(uglify())
      .pipe(concat('app.js'))
      .pipe(gulp.dest('build'));
});

如果gulp的插件很多,一個一個require進來還是挺麻煩的,像grunt一樣,gulp也有插件可以一次性加載所有的gulp plugins,即gulp-load-plugins:

var gulpLoadPlugins = require('gulp-load-plugins'),
    plugins = gulpLoadPlugins();

當然也可以寫成一行,

var plugins = require('gulp-load-plugins')();

這個插件也是從package.json中讀取gulp 插件的信息,假設package.json的devDependencies 字段中有各個插件的版本信息

{
   "devDependencies": {
      "gulp-concat": "~2.2.0",
      "gulp-uglify": "~0.2.1",
      "gulp-jshint": "~1.5.1",
      "gulp": "~3.5.6"
   }
}

2、插件實例

gulp-livereload模塊用於自動刷新瀏覽器,反映出源碼的最新變化,但是要藉助瀏覽器插件

var gulp = require('gulp'),
    less = require('gulp-less'),
    livereload = require('gulp-livereload'),
    watch = require('gulp-watch');

gulp.task('less', function() {
   gulp.src('less/*.less')
      .pipe(watch())
      .pipe(less())
      .pipe(gulp.dest('css'))
      .pipe(livereload());
});

參考:

http://www.smashingmagazine.com/2014/06/11/building-with-gulp/

https://github.com/gulpjs/gulp/blob/master/docs/API.md

https://github.com/vohof/gulp-livereload


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章