在 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')
。./
,不然无效。