在 Gulp 的官方文檔中,Gulp 的任務都是寫在 gulpfile.js 這一個文件中的,若是任務數量很少,這並不會有什麼問題,但當任務數量較多時,會形成代碼可讀性差,難以維護,多人協做時還會容易形成衝突。所以,更好的處理方式是把 Gulp 的代碼結構化。javascript
這是一個前端框架,主要由一個 SASS 方法合集與內置的工做流構成,其中工做流部分提供了一系列的任務用於處理前端流程,而且因爲是可配置的框架,須要讀取配置文件,所以雖然原有的 gulpfile.js 的代碼並不龐大,但仍然須要進行結構化處理,本文將會詳細說明如何進行結構化處理。java
主要的思路是把 gulpfile.js 中的任務分散到獨立的文件中編寫,而後在 gulpfile.js 中引入這些 task。所以最簡便的方法是把每一個 task 單獨寫在獨立的文件中,以 task 名命名文件名,在 gulpfile.js 中把這些文件讀取進去,例如:git
var del = require('del');
gulp.task('clean', '清理多餘文件(清理內容在 config.json 中配置)', function() {
// force: true 即容許 del 控制本目錄之外的文件
del(common.config.cleanFileType, {force: true});
console.log(common.plugins.util.colors.green('QMUI Clean: ') + '清理全部的 ' + common.config.cleanFileType + ' 文件');
});複製代碼
var gulp = require('gulp'),
requireDir = require('require-dir');
// 遍歷目錄,加載 task 代碼
requireDir('./workflow/task', { recurse: true });
gulp.task('default', ['clean']);複製代碼
這種方法操做起來比較簡單,同時基本不須要改動原有的代碼,只需對 gulpfile.js 稍做改動便可。但同時也引入了一些問題,例如,文章開頭說過的,像 QMUI 這類須要讀取公共配置文件的需求,這裏就沒法解決,各個任務中若是須要引入配置表,都須要單獨引入,同時像工具方法這類內容也會重複引入,形成浪費。所以實際上,clean.js 中也不是像上面的例子那樣編寫的,而是採用 module 的方式拆分任務。github
爲了不在子任務文件中重複引入全局的配置、插件依賴和工具方法,更好的方式就是把全局配置、工具方法以及子任務都拆分紅模塊,並利用 require 的方式引入模塊。web
首先,能夠先看一下結構化後的目錄結構:npm
.
├── gulpfile.js
├── package.json
└── workflow
├── common.js
├── lib.js
└── task
├── clean.js
├── compass.js
├── include.js
├── initProject.js
├── merge.js
├── readToolMethod.js
├── start.js
├── version.js
└── watch.js複製代碼
接下來以其中幾個文件爲示例:json
// 聲明插件以及配置文件的依賴
var plugins = require('gulp-load-plugins')({
rename: {
'gulp-file-include': 'include',
'gulp-merge-link': 'merge'
}
}),
packageInfo = require('../package.json'),
lib = require('./lib.js'),
config = require('./config.js');;
// 建立 common 對象
var common = {};
common.plugins = plugins;
common.config = config;
common.packageInfo = packageInfo;
common.lib = lib;
module.exports = common;複製代碼
var del = require('del');
module.exports = function(gulp, common) {
gulp.task('clean', '清理多餘文件(清理內容在 config.json 中配置)', function() {
// force: true 即容許 del 控制本目錄之外的文件
del(common.config.cleanFileType, {force: true});
common.plugins.util.log(common.plugins.util.colors.green('QMUI Clean: ') + '清理全部的 ' + common.config.cleanFileType + ' 文件');
});
};複製代碼
/** * gulpfile.js QMUI Web Gulp 工做流 */
var gulp = require('gulp-help')(require('gulp'), {
description: '展現這個幫助菜單',
hideDepsMessage: true
}),
fs = require('fs'),
common = require('./workflow/common.js');
// 載入任務
var taskPath = 'workflow/task';
fs.readdirSync(taskPath).filter(function (file) {
return file.match(/js$/); // 排除非 JS 文件,如 Vim 臨時文件
}).forEach(function (_file) {
require('./' + taskPath + '/' + _file)(gulp, common);
});複製代碼
總結以下:gulp
至此,一個完整的結構化 Gulp 就處理好了,Gulp 的目錄結構變得清晰不少,這時候不管是增長工具方法,增刪子任務,尤爲是多人協做時都會方便不少了。前端框架
除了以上的主要思路,在實踐中一些事項須要注意:
gulp.src
和 gulp.dest
的相對目錄關係並不須要修改,依然是以 gulpfile.js
所在目錄爲基準。但子任務文件中 require 文件是以子任務文件所在目錄爲基準的,如上面的代碼中 common.js 在引入 package.json 是須要在上層目錄中進行操做 —— packageInfo = require('../package.json')
。./
,不然無效。