使用 Node.js 输出到命令行

使用 console 模块进行基本输出

Node.js 提供了一个 console 模块,它提供了许多非常有用的方法来与命令行交互。

它基本上与你在浏览器中找到的 console 对象相同。

最基本也是最常用的方法是 console.log(),它将你传递给它的字符串打印到控制台。

如果你传递一个对象,它将把它渲染成字符串。

你可以将多个变量传递给 console.log,例如

const x = 'x';
const y = 'y';
console.log(x, y);

Node.js 将打印两者。

我们还可以通过传递变量和格式说明符来格式化漂亮的短语。

例如

console.log('My %s has %d ears', 'cat', 2);
  • %s 将变量格式化为字符串
  • %d 将变量格式化为数字
  • %i 将变量格式化为仅整数部分
  • %o 将变量格式化为对象

示例

console.log('%o', Number);

清除控制台

console.clear() 清除控制台(行为可能取决于使用的控制台)

计算元素

console.count() 是一个方便的方法。

看这段代码

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?'
);

发生的事情是 console.count() 将计算字符串被打印的次数,并在它旁边打印计数

你只需计算苹果和橙子

const oranges = ['orange', 'orange'];
const apples = ['just one apple'];

oranges.forEach(fruit => {
  console.count(fruit);
});
apples.forEach(fruit => {
  console.count(fruit);
});

重置计数

console.countReset() 方法重置与 console.count() 一起使用的计数器。

我们将使用苹果和橙子的例子来演示这一点。

const oranges = ['orange', 'orange'];
const apples = ['just one apple'];

oranges.forEach(fruit => {
  console.count(fruit);
});
apples.forEach(fruit => {
  console.count(fruit);
});

console.countReset('orange');

oranges.forEach(fruit => {
  console.count(fruit);
});

注意 console.countReset('orange') 的调用如何将值计数器重置为零。

可能有一些情况下,打印函数的调用堆栈跟踪很有用,也许是为了回答问题“你是如何到达代码的这一部分的?”

你可以使用 console.trace() 来做到这一点

const function2 = () => console.trace();
const function1 = () => function2();
function1();

这将打印堆栈跟踪。如果我们在 Node.js REPL 中尝试这样做,这就是打印的内容

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)

计算花费的时间

你可以轻松地计算函数运行需要多少时间,使用 time()timeEnd()

const doSomething = () => console.log('test');
const measureDoingSomething = () => {
  console.time('doSomething()');
  // do something, and measure the time it takes
  doSomething();
  console.timeEnd('doSomething()');
};
measureDoingSomething();

stdout 和 stderr

正如我们所见,console.log非常适合在控制台中打印消息。这被称为标准输出,或stdout

console.error打印到stderr流。

它不会出现在控制台中,但会出现在错误日志中。

为输出着色

您可以使用转义序列在控制台中为文本输出着色。转义序列是一组标识颜色的字符。

示例

console.log('\x1b[33m%s\x1b[0m', 'hi!');

您可以在 Node.js REPL 中尝试一下,它将以黄色打印hi!

然而,这是低级方法。最简单的方法是使用库来为控制台输出着色。Chalk 就是这样一个库,除了着色之外,它还有助于其他样式功能,例如使文本变为粗体、斜体或带下划线。

您可以使用npm install chalk安装它,然后就可以使用它了

const chalk = require('chalk');

console.log(chalk.yellow('hi!'));

使用chalk.yellow比尝试记住转义码方便得多,代码也更易读。

查看上面发布的项目链接以获取更多使用示例。

创建进度条

Progress 是一个很棒的包,可以在控制台中创建进度条。使用npm install progress安装它

此代码片段创建了一个 10 步的进度条,每 100 毫秒完成一步。当进度条完成时,我们将清除间隔

const ProgressBar = require('progress');

const bar = new ProgressBar(':bar', { total: 10 });
const timer = setInterval(() => {
  bar.tick();
  if (bar.complete) {
    clearInterval(timer);
  }
}, 100);