跳到主要内容

创建任务

每个 gulp 任务都是一个异步 JavaScript 函数 - 一个接受错误优先回调(error-first callback)或返回流(stream)、承诺(promise)、事件发射器(event emitter)、子进程(child process)或可观察对象(observable)的函数(稍后会详细介绍)。由于某些平台限制,不支持同步任务,不过还有一个相当不错的替代方案

导出

任务可以被视为公共的私有的

  • 公共任务从你的 gulpfile 中导出,允许它们通过 gulp 命令运行。
  • 私有任务用于内部使用,通常作为 series()parallel() 组合的一部分。

私有任务看起来和表现得与其他任务一样,但终端用户永远无法独立执行它。要公开注册任务,请从 gulpfile 中导出它。

const { series } = require('gulp');

// `clean` 函数没有被导出,所以它可以被视为私有任务。
// 它仍然可以在 `series()` 组合中使用。
function clean(cb) {
// 省略的代码
cb();
}

// `build` 函数被导出,所以它是公共的,可以通过 `gulp` 命令运行。
// 它也可以在 `series()` 组合中使用。
function build(cb) {
// 省略的代码
cb();
}

exports.build = build;
exports.default = series(clean, build);

图片说明缺失

过去,task() 被用来注册你的函数作为任务。虽然该 API 仍然可用,但导出应当是主要的注册机制,除非在导出无法工作的边缘情况下。

组合任务

Gulp 提供了两个强大的组合方法,series()parallel(),允许将单个任务组合成更大的操作。这两个方法都接受任意数量的任务函数或组合操作。series()parallel() 可以相互嵌套到任意深度。

要按顺序执行任务,请使用 series() 方法。

const { series } = require('gulp');

function transpile(cb) {
// 省略的代码
cb();
}

function bundle(cb) {
// 省略的代码
cb();
}

exports.build = series(transpile, bundle);

要使任务以最大并发运行,请使用 parallel() 方法将它们组合。

const { parallel } = require('gulp');

function javascript(cb) {
// 省略的代码
cb();
}

function css(cb) {
// 省略的代码
cb();
}

exports.build = parallel(javascript, css);

当调用 series()parallel() 时,任务会立即组合。这允许在组合中实现变化,而不是在单个任务内部使用条件行为。

const { series } = require('gulp');

function minify(cb) {
// 省略的代码
cb();
}


function transpile(cb) {
// 省略的代码
cb();
}

function livereload(cb) {
// 省略的代码
cb();
}

if (process.env.NODE_ENV === 'production') {
exports.build = series(transpile, minify);
} else {
exports.build = series(transpile, livereload);
}

series()parallel() 可以嵌套到任意深度。

const { series, parallel } = require('gulp');

function clean(cb) {
// 省略的代码
cb();
}

function cssTranspile(cb) {
// 省略的代码
cb();
}

function cssMinify(cb) {
// 省略的代码
cb();
}

function jsTranspile(cb) {
// 省略的代码
cb();
}

function jsBundle(cb) {
// 省略的代码
cb();
}

function jsMinify(cb) {
// 省略的代码
cb();
}

function publish(cb) {
// 省略的代码
cb();
}

exports.build = series(
clean,
parallel(
cssTranspile,
series(jsTranspile, jsBundle)
),
parallel(cssMinify, jsMinify),
publish
);

当运行组合操作时,每个任务都会在其被引用的每次执行。例如,在两个不同任务之前引用的 clean 任务将运行两次并导致不期望的结果。相反,应该重构 clean 任务以在最终组合中指定。

如果你有像这样的代码:

// 这是不正确的
const { series, parallel } = require('gulp');

const clean = function(cb) {
// 省略的代码
cb();
};

const css = series(clean, function(cb) {
// 省略的代码
cb();
});

const javascript = series(clean, function(cb) {
// 省略的代码
cb();
});

exports.build = parallel(css, javascript);

应该迁移到这样:

const { series, parallel } = require('gulp');

function clean(cb) {
// 省略的代码
cb();
}

function css(cb) {
// 省略的代码
cb();
}

function javascript(cb) {
// 省略的代码
cb();
}

exports.build = series(clean, parallel(css, javascript));