# 命令行编程

# 读取环境变量

Node.js 的 process 核心模块提供了 env 属性,该属性承载了在启动进程时设置的所有环境变量

示例:

console.log(process.env.NODE_EVN);

# 与控制台交互

打印输出

const x = "x";
const y = "y";
console.log(x, y);
// 可以传入格式说明符来格式化用语
console.log("我的%s已经%d岁", "猫", 2);

%s 格式化变量为字符串 %d 格式化变量为数字 %i 格式便变量为其整数部分 %o 格式化变量为对象

清空控制台

console.clear();

追踪堆栈

const fn1 = () => console.trace();
const fn2 = () => fn1();
fn2();

计算耗时

console.time();
console.timeEnd();

创建进度条

npm install progress
const ProgressBar = require("progress");
const bar = new ProgressBar(":bar", {
  total: 10
});

const timer = setInterval(() => {
  bar.tick();
  if (bar.complete) {
    clearInterval(timer);
  }
}, 100);

# 从命令行接收启动参数

当使用命令调用 Node.js 程序的时候,可以传入任意数量的参数
比如:

node app.js joe bob alice

如何拿到传入的参数?获取参数值的方法时使用 Node.js 中内置的 process 对象,此对象公开了 argv 属性,该属性时一个包含所有命令行调用参数的数组,可以使用循环遍历所有的参数

process.argv.forEach((val, index) => {
  console.log(`${index}:${val}`);
});

第一个参数时 node 命令的完整路径 第二个参数时正在被执行文件的完整路径 所有其他的参数从第三个位置开始

node app.js 12 3 name=gauss
# 0:C:\Program Files\nodejs\node.exe
# 1:E:\Webdev\Frontend\07Node\02Node.js文档\app.js
# 2:1
# 3:两
# 4:2
# 5:3
# 6:name=gauss

因此,如果我们如果想要只访问我们在命令行传入的参数时,可以这样

cosnt args = process.argv.slice(2)

注意到上面的第六个参数,name=gauss,我们需要对其进行解析,最好的方法是使用一个叫做 minimist 的库,该库有助于我们处理参数,但是传参的时候需要在参数名称前加上 double dash

node app.js --name=gauss
const args = require("minimist")(process.argv.slice(2));
args["name"]; // gauss

# 从命令行接收可交互的输入

如何时 Node.js CLI 程序具有交互性?
Node.js 提供了readline模块来执行一下操作,每次一行的从可读流(Node.js 终端)获取输入

# 内置模块 readline

const readline = require("readline").createInterface({
  input: process.stdin,
  output: process.stdout
});

readline.question(`你叫什么名字?`, (name) => {
  console.log(`你好${name}!`);
  readline.close();
});

question()方法会显示第一个参数,并等待用户的输入,当按下回车(下一行)时,触发其事件监听函数

也可以使用第三方模块,比如 inquirer.js

# 第三方模块 inquirer

npm install inquirer

使用示例:

const inquirer = require("inquirer");

var questions = [
  {
    type: "input",
    name: "name",
    message: "你叫什么名字?"
  }
];

inquirer.prompt(questions).then((answers) => {
  console.log(`你好 ${answers["name"]}!`);
});

TIP

实际开发中,一般使用inquirer