加载文件后运行gulp任务

我试图复制,连接和缩小特定的JavaScript文件到dist bower_components目录使用清单JSON文件,以保持清洁。

我想在一个单独的任务中运行concat和uglify,但是加载文件的延迟意味着任何依赖任务在完成之前运行。

// editorial tools gulp file var gulp = require("gulp"); var path = require("path"), argv = require("yargs").argv, fs = require("fs"), runSequence = require("run-sequence"); // load plugins var $ = require("gulp-load-plugins")({ lazy: false }); gulp.task("other-task", ["read-manifest"], function () { // something else before read-manifest... }); gulp.task("read-manifest", function () { var cwd = process.cwd(); // vendor JS to compile (get manifest of files to bring in) fs.readFile(cwd + "/src/bower_manifest.json", "utf-8", function (err, _data) { if (err) { console.log("Error: " + err); return; } // manifest string to JSON data = JSON.parse(_data); // copy bower files in manifest var fileList = data.fileUrls, loadOrder = data.loadOrder, filesToCopy = []; for ( var i = 0, len = loadOrder.length; i < len; i ++ ) { filesToCopy.push("./src/bower_components/" + fileList[loadOrder[i]]); } // add shared js filesToCopy.push("./src/javascripts/*.js"); console.log(filesToCopy); // concat and uglify return gulp.src(filesToCopy) .pipe($.concat("shared.min.js")) // .pipe($.uglify()) .pipe(gulp.dest("./dist/javascripts/")); $.util.log($.util.colors.green("JS combined and uglified")); }); }); 

安慰:

 [gulp] Starting 'read-manifest'... [gulp] Finished 'read-manifest' after 476 μs [gulp] Starting 'other-task'... [ './src/bower_components/jquery/jquery.min.js', './src/bower_components/aight/aight.min.js', './src/bower_components/d3/d3.min.js', './src/bower_components/aight/aight.d3.min.js', './src/javascripts/*.js' ] [gulp] Finished 'other-task' after 15 ms 

据我所知,你所面临的主要问题是你试图把这个任务作为另一个任务的依赖,这个任务在这个任务完成之前就开始了。

要支持asynchronous任务,您需要返回承诺stream或调用完成的callback 。 你现在所做的是返回一个stream,但在一个callback。 所以任务函数不会得到一个返回的stream(因为它是asynchronous的)。 所以更简单的方法是使用承诺或callback。

使用callback的示例:

 // note the "done" callback gulp.task("read-manifest", function (done) { var cwd = process.cwd(); // vendor JS to compile (get manifest of files to bring in) fs.readFile(cwd + "/src/bower_manifest.json", "utf-8", function (err, _data) { if (err) { console.log("Error: " + err); return; } // ... etc ... gulp.src(filesToCopy) .pipe($.concat("shared.min.js")) // .pipe($.uglify()) .pipe(gulp.dest("./dist/javascripts/")) // when stream ends, call callback .on('end', done); }); }); 

或者你可以使用这样的承诺:

 var Q = require('q'); gulp.task("read-manifest", function () { var deferred = Q.defer(); var cwd = process.cwd(); // vendor JS to compile (get manifest of files to bring in) fs.readFile(cwd + "/src/bower_manifest.json", "utf-8", function (err, _data) { if (err) { console.log("Error: " + err); return; } // ... etc ... gulp.src(filesToCopy) .pipe($.concat("shared.min.js")) // .pipe($.uglify()) .pipe(gulp.dest("./dist/javascripts/")) // when stream ends, call callback .on('end', function () { deferred.resolve(); }); }); return deferred.promise; }); 

这有任何意义吗? 这样,受抚养者知道这个任务何时完成。 阅读文档中有关asynchronous支持的更多信息

 // gulpfile.js var gulp = require('gulp'); var Promise = require('promise'); gulp.task('lazy-load-task', function(){ var LazyLoad = require('your-lazy-load-js'); return new Promise(function(resolve, reject){ // define your lazy task depends on LazyLoad gulp.task('lazy-task', function(){ // TODO: do your logic with LazyLoad here resolve(0); return Promise.resolve(0); // optional }); // execute it gulp.start('lazy-task'); }); }); gulp.task('default', ['lazy-load-task']);