所以在公司跟同事分享了初心者如何上手 gulp 跟一些簡單應用。
簡報:
簡報:
CP 值很高的 Gulp from Yvonne Yu
之後,手頭專案裡的 gulp task 簡單完成後,gulpfile.js 就被我們塵封在專案裡。
除非有另外 task 或 bug,否則很久都沒去維護。
想想有點可惜,gulp 套件那麼多,一定還有好用的套件等我們去發掘。
所以週末就找時間自行摸索了一些網路上其他大家推薦的 gulp 套件~
utility 顧名思義就是工具箱,裡面包含了很多建立 task 會使用到的工具函式庫。
我覺得最常使用到的 method 應該是 gulp.log()。
用法除了跟 console.log 一樣,還提供上色功能。讓我們可以在一堆 task 中發現錯誤或重要資訊。
ex:
顏色表來源:chalk
更多 gulp-util method:
gulp-plumber 是為了解決 node string pipe 無法中斷發生錯誤時的 task ,所建立的除錯套件。(完整解釋:Error management in gulp)
task 執行前,先使用 plumber 套件。
這樣就會當錯誤發生的時候,會立即停止 task,並把錯誤訊息整理並印出來。
發生錯誤範例:
假如 task 是被 gulp.watch 呼叫的,別忘了在 gulp-plumber 的 handleError 中增加離開的指令。
之後,手頭專案裡的 gulp task 簡單完成後,gulpfile.js 就被我們塵封在專案裡。
除非有另外 task 或 bug,否則很久都沒去維護。
想想有點可惜,gulp 套件那麼多,一定還有好用的套件等我們去發掘。
所以週末就找時間自行摸索了一些網路上其他大家推薦的 gulp 套件~
1. gulp-util
> Utility functions for gulp pluginsutility 顧名思義就是工具箱,裡面包含了很多建立 task 會使用到的工具函式庫。
我覺得最常使用到的 method 應該是 gulp.log()。
用法除了跟 console.log 一樣,還提供上色功能。讓我們可以在一堆 task 中發現錯誤或重要資訊。
ex:
var gutil = require('gulp-util');
// print "Hello Yvonne. How are you?"
gutil.log('Hello', 'Yvonne.', 'How are you?');
// print "ERROR: (紅色的) 發生錯誤"
gutil.log(gutil.colors.red('ERROR:'), '發生錯誤');
顏色表來源:chalk
更多 gulp-util method:
/* 讀到這行,會發出 '逼' 的聲音 */
gutil.beep();
/* 類似 ES6 string template 的用法 */
var info = {name: 'Yvonne', id: 12345};
gutil.template('my name is <%= name %> (<%= id %>)', info)
// print "my name is Yvonne (12345)"
/* empty funtion */
gutil.noop
/* 取得 process.argv ex: type gulp --type dev in termial*/
gutil.env.type === 'dev'
2. gulp-plumber
> Prevent pipe breaking caused by errors from gulp pluginsgulp-plumber 是為了解決 node string pipe 無法中斷發生錯誤時的 task ,所建立的除錯套件。(完整解釋:Error management in gulp)
task 執行前,先使用 plumber 套件。
var concat = require('gulp-concat');
var uglify = require('gulp-uglify');
var plumber = require('gulp-plumber');
gulp.task('scripts', function() {
gulp.src('./js/**/*.js')
.pipe(plumber())
.pipe(uglify())
.pipe(concat('all.min.js'))
.pipe(gulp.dest('./dist/'))
});
這樣就會當錯誤發生的時候,會立即停止 task,並把錯誤訊息整理並印出來。
發生錯誤範例:
MacBook-Pro:gulp-test yvonne$ gulp scripts
[22:25:19] Using gulpfile ~/gulp-test/gulpfile.js
[22:25:19] Starting 'scripts'...
[22:25:19] Finished 'scripts' after 7 ms
[22:25:19] Plumber found unhandled error:
Error in plugin 'gulp-uglify'
Message:
/Users/work/gulp-test/js/main.js: Unexpected token: eof (undefined)
Details:
fileName: /Users/gulp-test/js/main.js
lineNumber: 3
假如 task 是被 gulp.watch 呼叫的,別忘了在 gulp-plumber 的 handleError 中增加離開的指令。
gulp.task('scripts', function() {
gulp.src('./js/**/*.js')
.pipe(plumber({
handleError: function (err) {
console.log(err);
// watch 才會被通知結束
this.emit('end');
}
}))
.pipe(uglify())
.pipe(gulp.dest('./dist/'))
});
3. gulp-if/gulp-filter
> Conditionally run a task當需要有條件的跑 task 的時候,這兩個利器就非常很好用。
gulp-if 適合 if/if-else condition, 可再搭配 gulp-ignore 使得符合某些條件下可省略某些檔案。
var gulpif = require('gulp-if'),
uglify = require('gulp-uglify'),
gutil = require('gulp-util');
// 依照使用者是否輸入 dev 參數判斷
var isDev = !!(gutil.env.dev);
gulp.task('script', function() {
gulp.src('./src/*.js')
// 不是 dev 環境就不跑 uglify
.pipe(gulpif(!isDev, uglify()))
.pipe(gulp.dest('./dist/'));
});
gulp-filter 適合比較複雜的篩選過濾,像是需要把篩選過的檔案還原,或是多個不同的篩選條件。
var gulp = require('gulp');
var less = require('gulp-less');
var concat = require('gulp-concat');
var gulpFilter = require('gulp-filter');
gulp.task('default', function () {
var jsFilter = gulpFilter('**/*.js');
var lessFilter = gulpFilter('**/*.less');
return gulp.src('assets/**')
.pipe(jsFilter)
.pipe(concat('bundle.js'))
.pipe(jsFilter.restore())
.pipe(lessFilter)
.pipe(less())
.pipe(lessFilter.restore())
.pipe(gulp.dest('out/'));
})
copy from gulp-filtervar uglify = require('gulp-uglify');
gulp.task('task', function() {
// 使用 ! 忽略 node_modules 內全部的檔案
gulp.src(['./*.js', '!./node_modules/**'])
.pipe(uglify())
.pipe(gulp.dest('./dist/'));
});
copy from gulp-if
4. lazypipe
> Lazily create a pipeline out of reusable components. Useful for gulp.Lazypipe 不是專屬於 gulp 的套件,可是非常適合搭配 gulp 開發 reuse 的程式碼使用。
(撰寫 gulp 的時候也要記得 DRY - Don't repeat yourself)
var lazypipe = require('lazypipe');
var jshint = require('gulp-jshint');
var concat = require('gulp-concat');
// run jsHint
var jsHintTask = lazypipe()
.pipe(jshint)
.pipe(jshint.reporter);
gulp.task('jsHint', function() {
return gulp.src('js/main.js').pipe(jsHintTask());
});
// run jsHint then concat files
gulp.task('scripts', function() {
return gulp.src('js/**/*.js')
.pipe(jsHintTask())
.pipe(concat('./js/all.js'))
.pipe(gulp.dest('./dist'));
});
5. gulp-task-listing
列出 gulpfile.js 裡所有 task 的名稱。
我目前的用法是結合 'help' task,所以其他開發者打 gulp 或是 gulp help 都會列出所有的 task 給開發者看。
例如會印出:
Sub Tasks default 會抓取名稱含有 regular expression /[-_:]/.
如需要更改在使用 withFilters 進行調整。列出 gulpfile.js 裡所有 task 的名稱。
我目前的用法是結合 'help' task,所以其他開發者打 gulp 或是 gulp help 都會列出所有的 task 給開發者看。
var taskListing = require('gulp-task-listing');
gulp.task('help', taskListing);
gulp.task('default', ['help']);
例如會印出:
Main Tasks
------------------------------
build
help
Sub Tasks
------------------------------
build:css
build:js
Sub Tasks default 會抓取名稱含有 regular expression /[-_:]/.
除了套件外,研究的過程還有學習到一些好的應用寫法。
有機會再來寫下一篇~
----
reference:
Useful gulp recipes - Valdelama

沒有留言:
張貼留言