运行Gulp任务所花费的大量时间都用在以下方面:
- 加载Gulp任务;
- 导入Node模块。
如果我们不是每次运行gulp task_name
,而是运行一些能够加载gulpfile.js
并启动提示符的东西,我们可以通过输入任务名称来运行Gulp任务。这将使我们只需一次花费时间来加载Gulp任务,并且require
会缓存导入的Node模块,从而在后续执行任务时加载得更快。
如何实现这个?
这是一个自我回答的问题,我与社区分享我的知识。
欢迎其他答案。最佳答案将被接受。
运行Gulp任务所花费的大量时间都用在以下方面:
如果我们不是每次运行gulp task_name
,而是运行一些能够加载gulpfile.js
并启动提示符的东西,我们可以通过输入任务名称来运行Gulp任务。这将使我们只需一次花费时间来加载Gulp任务,并且require
会缓存导入的Node模块,从而在后续执行任务时加载得更快。
如何实现这个?
这是一个自我回答的问题,我与社区分享我的知识。
欢迎其他答案。最佳答案将被接受。
更新:
我发布了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秒。