一直想搭建一个公司自己用的脚手架,可以方便快捷的开发。于是开始看vue-cli的源码和网上的一些教程。我发现一个脚手架其实很简单,主要原理就是远程下载一个模板来创建一个新的项目。同时提供了一系列的交互来动态改变模板。下面先列出搭建脚手架可能用到的插件及其使用方法:1.Commander用于编写指令和处理命令行。安装指挥官:npminstallcommander--save主要api分析(一)version函数:定义版本号用法:.version('0.0.1','-v--version')参数分析:版本号(必填)自定义flag(可省略):默认为-V和--version(2)选项功能:定义命令选项用法:.option('-n--name','namedescription','defaultname')参数解析:自定义标志:分为长短标志,以逗号、竖线或空格隔开;flags后面可以跟强制参数或可选参数,前者包含在<>中,后者包含在[]中。描述默认值<可以省略>示例:program.version('0.1.0','-v,--version').option('-i,--init','initsomething').option('-g,--generate','生成一些东西').option('-r,--remove','删除一些东西');(3)命令功能:添加命令名用法:.command('rmdir[otherDirs...]','installdescription',opts)参数解析:命令名:命令后面可以带参数包含在<>或[]中;命令的最后一个参数可以是可变的,如示例中的add..。旗帜;command后传入的参数会传递给action的回调函数和program.args数组中的commanddescription<可以省略>:如果存在,不显示callaction(fn),子命令program才会启动,否则会报错。配置选项<可省略>:可配置noHelp、isDefault等(4)描述功能:定义命令的描述用法:.description('rmdirdesc')(5)动作函数:定义命令的回调函数用法:.action(fn)(6)解析函数:解析process.argv,设置选项和触发命令用法:.parse(process.argv)(7)onFunction:自定义监听事件用法:.on('name',fn)例子://必须在.parse()之前,因为node的emit()是即时的program.on('--help',function(){console.log('例子:');console.log('');console.log('这是一个例子');console.log('');});program.on('option:verbose',function(){process.env.VERBOSE=this.verbose;})//未知命令时出错-helpforalistofavailablecommands.',program.args.join(''))process.exit(1);})Comprehensiveusageexample//引入依赖varprogram=require('commander');//定义版本和参数选项program.version('0.1.0','-v,--version').option('-i,--init','initsomething').option('-g,--generate','generatesomething').option('-r,--remove','removesomething');//必须在.parse()之前,因为node的emit()是立即执行的program.on('--help',function(){console.log('Examples:');console.log('');console.log('第是一个例子');console.log('');});程序.parse(process.argv);if(program.init){console.log('initsomething')}if(program.generate){console.log('generatesomething')}if(program.remove){console.log('removesomething')}varprogram=require('commander')program.version('0.1.1').command('rmdir[otherDirs...]').action(function(dir,otherDirs){console.log('rmdir%s',dir)if(otherDirs){otherDirs.forEach(function(oDir){console.log('rmdir%s',oDir)})}})program.parse(process.argv)执行节点索引.jsrmdir./testaaa参考链接:https://blog.csdn.net/qq_4012...https://www.cnblogs.com/miran...2.Inquirer用于交互式命令行安装:npminstallinquirer--save语法结构:constinquirer=require('inquirer');constpromptList=[//具体交互内容];inquirer.prompt(promptList).then(answers=>{console.log(answers);//返回结果})basicapitype:表示问题的类型,包括:输入,确认、列表、原始列表、展开、复选框、密码、编辑器;名称:保存存储当前问题答案的变量;message:问题的描述;default:默认值;choices:列出选项,在特定类型下可用,包含分隔符;validate:验证用户的回答;filter:过滤用户的回答并返回处理后的值;transformer:处理用户答案的??显示效果(如:修改答案的字体或背景颜色),但不会影响最终答案的内容;when:根据上一题的答案,判断当前题是否需要回答;pageSize:修改某些类型下的渲染行数;prefix:修改消息的默认前缀;后缀:修改消息的默认后缀使用示例varinquirer=require('inquirer');constpromptList=[{type:'input',message:'设置用户名',name:'name',default:'test_user'},{type:'input',message:'请输入您的电话号码',name:'phone',/*validate:function(val){if(val.match(/\d{11}/g)){//returnval}return"请输入11位数字"}*/},{type:'confirm',message:'是否开启监听',name:'watch',prefix:'prefix',suffix:'suffix',when:function(answers){//watch为真时,开始提问returnanswers.watch}},{type:'list',message:'Pleasechooseafruit',name:'fruit',choices:["Apple","Pear","Banana"],过滤器:function(val){//把answer改成小写returnval.toLowerCase()}}]inquirer.prompt(promptList).then(answers=>{//回调函数,answers是用户输入的内容是一个对象console.log(答案)})3.chalk设置控制台输出内容的样式用法示例constchalk=require('chalk')//控制颜色console.log(chalk.green('success'))console.log(chalk.blue.bgRed.bold('Helloworld'))console.log(chalk.underline.bgBlue('lala'))4.ora提供加载效果使用示例constora=require('ora')//加载效果出现letspinner=ora('downloadingtemplate')spinner.start()//加载失败效果spinner.fail()//结束加载效果spinner.succeed()5、download-git-repo下载远程模板:支持github、gitlab等使用语法:constdownload=require('download-git-repo')download(repository,destination,options,callback)repository是远程仓库地址,destination是下载的文件路径,默认当前目录,options是一些选项,比如clone:boolean表示是以http下载还是gitclone的形式下载6.Metalsmith静态网站生成器,metalsmith的所有逻辑都由插件处理,你只需要将它们链接在一起官网:https://metalsmith.io/官网示例:varMetalsmith\=require('metalsmith');varmarkdown\=require('metalsmith-markdown');varlayouts\=require('metalsmith-layouts');varpermalinks\=require('metalsmith-permalinks');Metalsmith(\_\_dirname).metadata({title:"MyStaticSite&Blog",description:"这是关于向世界说?Hello?。",generator:“Metalsmith”,网址:“http://www.metalsmith.io/”}).source('./src').destination('./build').clean(false).use(markdown()).use(permalinks()).use(layouts({engine:'handlebars'})).build(function(err,files){if(err){throwerr;}});handlebars一个简单高效的语义模板构建引擎