一、从命令行接受参数
在调用 Node.js 应用程序时,可以使用任意数量的参数
参数可以是独立的,也可以有一个键和一个值。
1
2
3
4
5
6
|
node app.js joe
// or
node app.js name=joe
|
这会改变 Node.js 代码中检索此值的方式。
检索它的方式是使用 Node.js 中内置的 process 对象。
它公开了一个 argv 属性,这是一个包含所有命令行调用参数的数组。
第一个元素是节点命令的完整路径。
第二个元素是正在执行的文件的完整路径。
所有附加参数都从第三个位置开始。
可以使用循环遍历所有参数(包括节点路径和文件路径):
1
2
3
4
|
process.argv.forEach((val, index) => {
console.log(`${index}: ${val}`)
})
|
可以通过创建一个排除前 2 个参数的新数组来仅获取附加参数:
1
2
|
const args = process.argv.slice(2)
|
如果有一个没有索引名称的参数,如下所示:
1
2
3
4
5
6
|
node app.js joe
// 需要这样子访问它
const args = process.argv.slice(2)
args[0]
|
args[0] 是 name=joe,需要解析它。 最好的方法是使用 minimist 库,它有助于处理参数:
需要在每个参数名称前使用双破折号:
1
2
|
node app.js --name=joe
|
二、输出到命令行
1. 使用 console.log() 的基本输出
Node.js 提供了一个console模块,它提供了大量非常有用的方式来与命令行交互。
1
2
3
4
|
const x = 'x'
const y = 'y'
console.log(x, y)
|
还可以通过传递变量和格式说明符来格式化漂亮的短语。
1
2
|
console.log('My %s has %d years', 'cat', 2)
|
- %s 将变量格式化为字符串
- %d 将变量格式化为数字
- %i 仅将变量格式化为其整数部分
- %o 将变量格式化为对象
1
2
|
console.log('%o', Number)
|
2. 清除 console.clear()
console.clear()
清除控制台(行为可能取决于所使用的控制台)
3. 计数 console.count()
console.count() 是一个方便的方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
const x = 1
const y = 2
const z = 3
console.count(
'The value of x is ' + x +
' and has been checked .. how many times?'
)
console.count(
'The value of x is ' + x +
' and has been checked .. how many times?'
)
console.count(
'The value of y is ' + y +
' and has been checked .. how many times?'
)
// The value of x is 1 and has been checked .. how many times?: 1
// The value of x is 1 and has been checked .. how many times?: 2
// The value of y is 2 and has been checked .. how many times?: 1
|
1
2
3
4
5
6
7
8
9
|
const oranges = ['orange', 'orange']
const apples = ['just one apple']
oranges.forEach(fruit => {
console.count(fruit)
})
apples.forEach(fruit => {
console.count(fruit)
})
|
4. 重置计数 console.countReset()
1
2
|
console.countReset('orange')
|
5. 打印堆栈跟踪 console.trace()
1
2
3
4
|
const function2 = () => console.trace()
const function1 = () => function2()
function1()
|
1
2
3
4
5
6
7
8
9
10
11
12
|
Trace
at function2 (repl:1:33)
at function1 (repl:1:25)
at repl:1:1
at ContextifyScript.Script.runInThisContext (vm.js:44:33)
at REPLServer.defaultEval (repl.js:239:29)
at bound (domain.js:301:14)
at REPLServer.runBound [as eval] (domain.js:314:12)
at REPLServer.onLine (repl.js:440:10)
at emitOne (events.js:120:20)
at REPLServer.emit (events.js:210:7)
|
6. 计算花费的时间 time() timeEnd()
1
2
3
4
5
6
7
8
9
|
const doSomething = () => console.log('test')
const measureDoingSomething = () => {
console.time('doSomething()')
//do something, and measure the time it takes
doSomething()
console.timeEnd('doSomething()')
}
measureDoingSomething()
|
7. 标准输出 console.log 和标准错误 console.error
console.log 非常适合在控制台中打印消息。这就是所谓的标准输出,或 stdout.
console.error 打印到 stderr 流。
它不会出现在控制台中,但会出现在错误日志中。
8. 为输出着色 chalk
1
2
|
console.log('\x1b[33m%s\x1b[0m', 'hi!')
|
hi! 以黄色打印。
但是,这是执行此操作的低级方法。为控制台输出着色的最简单方法是使用库。Chalk 就是这样一个库,除了着色之外,它还有助于其他样式工具,例如使文本加粗、斜体或下划线。
1
2
3
|
const chalk = require('chalk')
console.log(chalk.yellow('hi!'))
|
使用 chalk.yellow 起来比试图记住转义码要方便得多,而且代码的可读性要强得多
9. 创建进度条 progress
Progress是一个很棒的包,用于在控制台中创建进度条。安装它使用npm install progress
此代码段创建了一个 10 步进度条,每 100 毫秒完成一个步骤。当柱线完成时,我们清除间隔:
1
2
3
4
5
6
7
8
9
10
|
const ProgressBar = require('progress')
const bar = new ProgressBar(':bar', { total: 10 })
const timer = setInterval(() => {
bar.tick()
if (bar.complete) {
clearInterval(timer)
}
}, 100)
|
三、接受命令行的输入
使 Node.js CLI 程序具有交互性
yarn add inquirer
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
const inquirer = require('inquirer')
var questions = [
{
type: 'input',
name: 'name',
message: "What's your name?"
}
]
inquirer.prompt(questions).then(answers => {
console.log(`Hi ${answers['name']}!`)
})
|
Inquirer.js 可以让你做很多事情,比如询问多项选择、有单选按钮、确认等等。
了解所有替代方案是值得的,尤其是 Node.js 提供的内置替代方案,但如果您打算将 CLI 输入提升到一个新的水平,Inquirer.js 是最佳选择。