当module.exports引用Gulp任务而不是函数时,Gulpfile无法正常工作?

时间:2016-06-27 10:20:15

标签: gulp

我在gulp文件中有一个精灵任务:

var sprite = function() {
  // Do something
};

module.exports = {
  sprite: sprite
};

这是有效的,但我现在需要在精灵任务之前执行另一个任务。我需要在精灵任务运行之前完成此先前任务,因此我使用runSequence:

var spriteFirst = function() {
  // Do something first
};

var spriteSecond = function() {
  // Do something second 
};

gulp.task('sprite', function(callback) {
  runSequence('spriteFirst', 'spriteSecond',
    callback);
});

module.exports = {
  sprite: sprite
};

此代码给出了以下错误:

ReferenceError: sprite is not defined

似乎module.exports识别'sprite',如果它是一个正常的函数,但是如果它是一个Gulp任务则不会。它是否正确?如果是这样的话为什么会这样呢?

1 个答案:

答案 0 :(得分:1)

Gulp任务普通的JavaScript函数。每个gulp任务都是一个对象,它由名称函数和(可选)所依赖的其他任务的名称组成。所有这些信息都存储在gulp实例中。

当您在源代码中引用sprite时,Node.js会尝试按该名称查找varfunction。但是没有一个,因为gulp.task()不会创建varfunction。它仅将传递的名称函数存储为gulp实例中的新任务对象。

同样,如果不使用spriteFirst定义该任务,则无法使用runSequence()运行名为gulp.task()的任务。会发生的是runSequence()将在gulp实例中查找名为spriteFirst的任务对象。但是没有一个,因为您只声明了一个名为spriteFirst的函数。您需要使用gulp.task()创建任务对象。

这意味着您的代码应如下所示:

var spriteFirst = function() {
  // Do something first
};

var spriteSecond = function() {
  // Do something second 
};

var sprite = function(callback) {
  runSequence('spriteFirst', 'spriteSecond',
    callback);
};

gulp.task('spriteFirst', spriteFirst);
gulp.task('spriteSecond', spriteSecond);
gulp.task('sprite', sprite);

module.exports = {
  sprite: sprite
};