Gulp
是一個自動化的前端構建工具,具備一些優勢:css
npm install -g gulp
切換目錄到要使用gulp的項目,在命令中執行html
npm install gulp
npm install --save-dev gulp
對於全局安裝gulp後還要在項目內再進行一次gulp安裝的緣由是爲了版本的靈活性。前端
建立一個主文件夾,命名爲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
切換到gulpfile.js文件的目錄下,執行命令git
gulp
若是要執行特定的任務,這執行命令:github
gulp task
若是沒有指定任務,則執行任務名爲default的默認任務。正則表達式
gulp經常使用的API有4個:npm
Gulp是以stream爲媒介的,它不須要頻繁的生成臨時文件,gulp.src()
正是用於獲取流的。這個流的內容是一個虛擬文件對象流(Vinyl files),虛擬文件對象中存儲着原始文件的路徑、文件名、內容等信息。語法爲:json
gulp.src(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]) //不會排除任何文件,由於排除模式不能出如今數組的第一個元素中
gulp.task
方法用來定義任務:
gulp.task(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'); });
gulp.src()
用於寫文件,其語法爲:
語法爲:
gulp.dest(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()
把文件流寫入文件後,文件流仍然能夠繼續使用
gulp.watch()
用來監視文件的變化,當文件發生變化後,咱們能夠利用它來執行相應的任務,例如文件壓縮等.
gulp.watch(glob[, opts], tasks)
glob 爲要監視的文件匹配模式,規則和用法與gulp.src()
方法中的glob
相同。
opts 爲一個可選的配置對象,一般不須要用到
tasks 爲文件變化後要執行的任務,爲一個數組
另外一種使用方式爲:
gulp.watch(glob[, opts, cb])
glob 和 opts 參數與第一種用法相同
cb 爲一個函數。每當監視的文件發生變化時,就會調用這個函數,而且會給它傳入一個對象,該對象包含了文件變化的一些信息,type屬性爲變化的類型,能夠是added,changed,deleted;path屬性爲發生變化的文件的路徑
gulp.watch('js/**/*.js', function(event){ console.log(event.type); //變化類型 added爲新增,deleted爲刪除,changed爲改變 console.log(event.path); //變化的文件的路徑 });
命令:
npm install --save-dev gulp-load-plugins
命令:
npm install --save-dev gulp-rename
命令:
npm install --save-dev gulp-uglify
命令:
npm install --save-dev gulp-minify-css
命令:
npm install --save-dev gulp-minify-html
命令:
npm install --save-dev gulp-jshint
命令:
npm install --save-dev gulp-concat
命令:
npm install --save-dev gulp-lessnpm install --save-dev gulp-sass
命令:
npm install --save-dev gulp-imagemin
命令:
npm install --save-dev gulp-livereload