加载文件后运行gulp任务

 平淡人生路20111212 发布于 2023-01-09 09:15

我正在尝试使用清单JSON文件将特定的javascript文件复制,连接并缩小到dist bower_components目录以保持清洁.

我想在一个单独的任务中运行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

mikaelb.. 14

据我所知,您遇到的主要问题是您尝试将此任务用作另一个任务的依赖项,并且该任务在此任务完成之前启动.

要支持异步任务,您需要返回promise,stream或调用done回调.你现在做的是返回一个流,但在回调中.因此任务函数不会返回流(因为它是异步).因此,更简单的方法是使用promise或回调.

使用回调的示例:

// 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;
});

这有任何意义吗?这样,家属就知道这项任务何时完成.阅读文档中有关异步支持的更多信息

1 个回答
  • 据我所知,您遇到的主要问题是您尝试将此任务用作另一个任务的依赖项,并且该任务在此任务完成之前启动.

    要支持异步任务,您需要返回promise,stream或调用done回调.你现在做的是返回一个流,但在回调中.因此任务函数不会返回流(因为它是异步).因此,更简单的方法是使用promise或回调.

    使用回调的示例:

    // 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;
    });
    

    这有任何意义吗?这样,家属就知道这项任务何时完成.阅读文档中有关异步支持的更多信息

    2023-01-09 09:20 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有