要实现一个类似bower init的问答式命令行工具,要通过process来和命令行进行交互
通过process.stdout的输出流来对输出进行控制
process.stdout.write();
将内容输出到命令行上面
通过process.stdin的输入流来对输入进行控制
需要使用process.stdin.resume();重置输入流,来打开输入流
然后通过process.stdin.on("data",function(chunk){});//对输入流进行监听,每个chunk代表一段输入流,即在输入之后按下enter键表示一段chunk
如果需要终止输入可以使用process.stdin.pause();
下面的一段代码中我们通过对输入流进行引导性的处理来实现bower init的效果
//步骤处理
var initjson = require('../lib/init');
var len = initjson.length, i = 1, inputArr = [];
// gets 函数的简单实现
function gets(cb){
process.stdout.write(initjson[0].description);
process.stdin.resume();
process.stdin.setEncoding('utf8');
process.stdin.on('data', function(chunk) {
var inputJson = { title: initjson[i-1].title, data: chunk};
inputArr.push(inputJson);
if((len--)>1){
process.stdout.write(initjson[i++].description);
}else{
process.stdin.pause();
cb(inputArr);
}
});
}
gets(function(reuslt){
console.log(reuslt);
});
init.js是一段步骤的数组对象
module.exports = [
{
title: 'projectName',
description: 'project name(ucweb-back):',
defaults: 'ucweb-back'
},
{
title: 'test2',
description: 'input something here(test2):',
defaults: 'test2'
},
{
title: 'test3',
description: 'input something here(test3):',
defaults: 'test3'
}
];
通过判断每次输入enter键的时候,下一次是否还有步骤,以进行继续下一步的输入或者是退出输入检测
在结束完输入之后,调用回调函数,将输入的数据输出处理
这里是等全部输入完成之后才对输入结果进行处理,而不是每次输入都进行相应的处理,减少阻塞时间