宝哥软件园

node.js命令行教程图解说明

编辑:宝哥软件园 来源:互联网 时间:2021-08-23

本文引入原生node.js实现命令行交互,并对原生api进行了理解。然后通过commander.js和inquirer.js实现一个完整的交互式命令行工具。

项目地址

过程

Process对象是一个全局变量,它提供信息并控制当前node.js进程。因为是全局变量,所以不需要在文件中引入。

要使用的几种应用编程接口

process . argv process . CWD()process . stdin process . stdout process . stdin . resume()process . argv process . argv

属性返回一个数组。数组的第一个值是process.execPath,第二个是正在执行的JavaScript的文件路径,剩下的参数是其他命令参数,这是我们自定义命令的关键。

例子

创建新的argv.js

//argv . jsconsole . log(process . argv)执行node命令nodeargv.js。

nodeargv . js-name Zhu ## Output['/usr/local/bin/Node ',# #执行当前脚本的Node二进制文件的绝对路径'/users//Node/book/argv . js ',# #文件的绝对路径'-name ',# #其他参数'

//argv.js console . log(process . argv)让argv=process . arg vlet param=argvs . splice(2)if(param[0]param[0]='-name '){ if(param[1]){ console . log(` Hello $ { param[1]} `)} else { console . log('请输入name') }}运行argv . js

nodargv . js-name Zhu # #['/usr/local/bin/node ','/users//node/book/argv . js ','-name ',' Zhu'] hello Zhu param ['-name ',' Zhu '

Process.stdin(标准输入)

process.stdin属性返回连接到stdin (fd 0)的流。这是一张网。套接字流(即双工流),除非fd 0指向一个文件,在这种情况下,它是一个可读的流。

Process.stdout(标准输出)

process.stdout属性返回连接到stdout (fd 1)的流。这是一张网。套接字流(即双工流),除非fd 1指向一个文件,在这种情况下,它是一个可写流。

process.stdin.resume()

指向标准输入流(标准输入)的可读流。默认情况下,标准输入流是暂停的,因此需要调用process.stdin.resume()来恢复接收。作为一个流,process.stdin可以在旧模式下使用。为了与节点v0.10之前的版本兼容,在旧模式下,如果您喜欢使用stdin,则必须调用process.stdin.resume()。如果调用process.stdin.resume() stdin,请注意旧模式。一般来说,控制台等待我们输入内容,而不需要退出流程并与输入和输出交互。

创建新的inputout.js

//input out . jsprocess . stdin . setencoding(' utf8 ')让argvs=process . argvlet param=argvs . splice(2)if(param[0]param[0]='-name){ if(param[1]){ console . log(` hello $ { param[1]} `)} else { process . stdout . write(`请输入name 3360 `)process . stdin . on(' data),chunk={if(!chunk . replace(/[ r n/g),{process.stdout.write(`您输入的名称是: $ { chunk } `)process . stdin . emit(' end ')} else { process . stdout . write(`请输入名称: `) })} } } } } Execute node input . js-name by process . stdin . on(' end ',()={ process . stdout . write(' end n ')})

评论

在新版本的节点模式中,可以使用process.stdin.on('可读',()={})代替process.stdin.resume()来恢复输入流接收。

示例:

process.stdin.on('可读',()={ var chunk=process . stdin . read();console.log(类型为(chunk)) if (chunk!==null){ process . stdout . write(` data : $ { chunk } `);process . stdin . emit(' end ');}});process.stdin.on('end ',()={ process . stdout . write(' end ');});从上面的例子中,我们可以得到process.argv参数进行处理并与之交互,但是如果我们想要实现更复杂的命令交互,就很难使用上面的方法。接下来,我们使用commander.js和inquirer来实现一个完整的节点命令行工具(创建项目模板)。

指挥官. js

node.js命令行界面的完整解决方案,灵感来自Ruby Commander。

commander.js简介

Program.version()声明版本

const program=require(' commander ')const pkg=require('./package . JSON’)程序。版本(pkg.version)选项解析

使用。选项()方法定义指挥官的选项选项,也可以作为选项的文档。

定义变量程序=require(' commander ');程序。版本(' 0.1.0 ')。选项('-p,-辣椒','添加辣椒')。选项('-P,-菠萝','添加菠萝')。选项('-b,-烧烤酱','加入烧烤酱')。选项('-c,- cheese [type]','添加指定类型的奶酪[大理石]'、'大理石')。解析(进程。argv);console.log('您点了一个带:的披萨');if(程序。胡椒)控制台。原木('-辣椒');if(程序。菠萝)console.log(' -菠萝');if(程序。bbqsauce)控制台。日志('-BBQ ');控制台。日志(-% s奶酪,程序。奶酪);添加自定义命令program.command()

定义变量程序=require(' commander ');程序。命令(“RM dir”)//必选参数,如果是[]则是可选参数。选项('-r,-递归','递归移除')。操作(功能(目录,cmd){控制台。日志(' remove ' dir(cmd。递归?递归地: ' '))})程序。解析(进程。argv)//命令()可变参数/** 命令命令有且只有最后一个参数可变不固定的。要使参数变量可变,必须将.附加到参数名称* */程序。版本(' 0.1.0 ')。命令(' rmdir[其他dir.]') .操作(功能(目录,其他目录){控制台。日志(' rmdir % s ',dir);if(其他dir){其他dir。foreach(函数(Odir){控制台。日志(' rmdir % s ',Odir);});} });程序。解析(进程。argv);program.action()定义命令的回调函数

定义变量程序=require(' commander ');程序。命令(' rm目录')。选项('-r,-递归','递归移除')。选项('-f,- force ',' remove force ').操作(函数(dir,cmd) { //cmd为选择权参数选项//console.log('cmd ',cmd)if(cmd。递归){控制台。日志('递归移除dir’);} if (cmd.force) { console.log('强制移除dir’);} });程序。解析(进程。argv);inquirer.js

查询rer。射流研究…使用开发做的一个通用交互式命令行用户界面的集合。具有常用的控制台交互操作。

由于交互的问题种类不同问询者为每个问题提供很多参数:

类型:表示提问的类型,包括:输入、确认、列表、列表、展开、复选框、密码、编辑器;名称:存储当前问题回答的变量;消息:问题的描述;默认值:默认值;选择:列表选项,在某些类型下可用,并且包含一个分隔符(分隔符);验证:对用户的回答进行校验;过滤器:对用户的回答进行过滤处理,返回处理后的值;变压器:对用户回答的显示效果进行处理(如:修改回答的字体或背景颜色),但不会影响最终的答案的内容;当:根据前面问题的回答,判断当前问题是否需要被回答;页面大小:修改某些类型类型下的渲染行数;前缀:修改消息默认前缀;后缀:修改消息默认后缀。创建命令行界面。jsconst program=require(' commander ')const inquirer=require(' inquirer ')const fs=require(' fs ')const path=require(' path ')const pkg=require('./package。CWD常量=过程。CWD()常量提示列表=[{ type : ' list ',message: '请选择一种模版,name: 'template ',choice :[' vue ',' angular ',' web pack-m-page '],filter : function(val){ return val。tolowercase()}]程序。版本(pkg.version).命令("创建目录")。描述("创建项目模板")。action(function(dir,cmd){ const TEMPLATE _ PATH=PATH。加入(CWD,迪尔)if(fs。existssync(TEMPLATE _ PATH)){ } else { fs。mkdirsync(TEMPLATE _ PATH)} if(dir){ inquirer。提示(提示列表)).然后(一个用户={控制台。登录(一个用户)})})程序。解析(进程。argv)运行node cli/cli.js创建某视频剪辑软件

已经可以运行了,我们自定义一个命名替代每次都执行结节

命令为:test-cli创建目录

1、创建容器文件夹,在容器文件夹下创建index.js文件

#!/usr/bin/env节点需要('./CLI/CLI’)2。修改package.json文件

添加媒体夹选项

Bin' : {'test-CLI' : '。/bin/index.js'},3。执行npm链接(如果没有权限,执行sudo npm链接)

4.测试

5.发布npm发布(如果您没有登录,则必须先使用npm登录)

6.发布后,需要npm unlink来释放本地命令映射

npm安装-g XXX

摘要

以上是边肖介绍的命令行教程node.js的详细讲解,希望对大家有所帮助。如果你有任何问题,请给我留言,边肖会及时回复你。非常感谢您对我们网站的支持!如果你觉得这篇文章对你有帮助,请转载,请注明出处,谢谢!

更多资讯
游戏推荐
更多+