以交互式提示的方式运行gulp

3

运行Gulp任务所花费的大量时间都用在以下方面:

  • 加载Gulp任务;
  • 导入Node模块。

如果我们不是每次运行gulp task_name,而是运行一些能够加载gulpfile.js并启动提示符的东西,我们可以通过输入任务名称来运行Gulp任务。这将使我们只需一次花费时间来加载Gulp任务,并且require会缓存导入的Node模块,从而在后续执行任务时加载得更快。

如何实现这个?

这是一个自我回答的问题,我与社区分享我的知识。
欢迎其他答案。最佳答案将被接受。

1个回答

2

更新:

我发布了npm包gulp-interactive

只需使用以下命令进行安装:

npm install --save-dev gulp-interactive

并在 gulpfile.js 中使用它:

require('gulp-interactive')();

然后在 shell 中:

$ gulp prompt

原始答案:

我实现了一个特殊的 gulp 任务 prompt。 首先安装 inquirer

npm install --save-dev inquirer

这是一个有用的包,它将允许我们要求开发人员输入任务名称。

接下来实现任务:

gulp.task('prompt', function (cb) {
    var promptedTask;

    function startPrompt() {
        promptedTask = undefined;
        gulp.start('prompt');
    }

    function onTaskEnd(event) {
        setTimeout(function () {
            if (event && promptedTask && event.task === promptedTask) {
                gulp.removeListener('task_stop', onTaskEnd);
                gulp.removeListener('task_err', onTaskEnd);
                gulp.removeListener('task_not_found', onTaskEnd);
                startPrompt();
            }
        });
    }

    gulp.on('task_stop', onTaskEnd);
    gulp.on('task_err', onTaskEnd);
    // replace gulp default listener for 'task_not_found' because it calls process.exit(1)
    gulp.removeAllListeners('task_not_found');
    gulp.on('task_not_found', function (err) {
        console.log('Task \'' + err.task + '\' is not in your gulpfile');
        onTaskEnd(err);
    });

    var inquirer = require('inquirer');
    inquirer.prompt([{ type: 'input', name: 'task', 'message': 'Enter gulp task name:' }])
        .then(function (answers) {
            promptedTask = answers.task || 'prompt';
            cb();
            gulp.start(promptedTask);
        });
});

现在您可以通过执行gulp prompt来启动提示符。使用此优化将我的Web应用程序的构建时间从Docker for Mac容器中的50秒减少到15秒(我认为这是由于文件系统操作缓慢所致)。当直接在我的Mac上运行构建时,构建时间从13秒减少到6秒。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接