命令行

一、从命令行接受参数

在调用 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
2

yarn add 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 是最佳选择。