node.js命令行教程图文详解

process (进程)

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

需要用到的几个api

process.argv

process.cwd()

process.stdin

process.stdout

process.stdin.resume()

process.argv

process.argv

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

示例

新建argv.js

// argv.js console.log(process.argv)

执行node命令node argv.js

node argv.js --name zhu ## 输出 [ '/usr/local/bin/node', ## 执行当前脚本的Node二进制文件的绝对路径 '/Users/zhuhuilong/Node/Book/argv.js', ## 文件的绝对路径 '--name', ## 其余参数 'zhu' ]

接收自定义的命令参数进行处理输出

// argv.js console.log(process.argv) let argvs = process.argv let param = argvs.splice(2) if(param[0] && param[0] == '--name'){ if(param[1]){ console.log(`hello ${param[1]}`) }else{ console.log('请输入name') } }

运行argv.js

node argv.js --name zhu ## 输出 [ '/usr/local/bin/node', '/Users/zhuhuilong/Node/Book/argv.js', '--name', 'zhu' ] hello zhu param [ '--name', 'zhu' ]

process.stdin与process.stdout

process.stdin(标准输入)

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

process.stdout(标准输出)

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

process.stdin.resume()

一个指向 标准输入流(stdin) 的可读流(Readable Stream)。标准输入流默认是暂停 (pause) 的,所以必须要调用 process.stdin.resume() 来恢复 (resume) 接收。

作为流,process.stdin可以在旧模式下使用。为了兼容node v0.10以前的版本。在旧模式喜爱使用stdin必须调用process.stdin.resume()。注意如果调用了process.stdin.resume() stdin将转为旧模式。

通俗来讲就是控制台等待我们输入内容不退出进程,对输入输出进行交互。

新建inputout.js

// inputout.js process.stdin.setEncoding('utf8') let argvs = process.argv let param = argvs.splice(2) if (param[0] && param[0] == '--name') { if (param[1]) { console.log(`hello ${param[1]}`) } else { process.stdout.write(`请输入name:`) process.stdin.resume() process.stdin.on('data', chunk => { if (!!chunk.replace(/[\r\n]/g, '')) { process.stdout.write(`你输入的name是: ${chunk}`) process.stdin.emit('end') } else { process.stdout.write(`请输入name:`) } }) } } process.stdin.on('end', () => { process.stdout.write('结束\n') })

>执行node inputout.js --name

node.js命令行教程图文详解

备注

在新版本node模式下可以使用process.stdin.on("readable",()=>{})代替process.stdin.resume()恢复输入流接收。

示例:

process.stdin.on("readable", () => { var chunk = process.stdin.read(); console.log(typeof(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来实现一个完整的node命令行工具(创建项目模版)。

commander.js

node.js命令行界面的完整解决方案,受Ruby Commander启发。

commander.js的API简述

program.version() 声明版本

const program = require('commander') const pkg = require('../package.json') program.version(pkg.version)

Options 解析

使用.option()方法定义commander的选项options,也可以作为选项的文档。

var program = require('commander'); program .version('0.1.0') .option('-p, --peppers', 'Add peppers') .option('-P, --pineapple', 'Add pineapple') .option('-b, --bbq-sauce', 'Add bbq sauce') .option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble') .parse(process.argv); console.log('you ordered a pizza with:'); if (program.peppers) console.log(' - peppers'); if (program.pineapple) console.log(' - pineapple'); if (program.bbqSauce) console.log(' - bbq'); console.log(' - %s cheese', program.cheese);

添加自定义命令program.command()

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/6ae146002c29eb89c9d73134a1f8aa6e.html