在 Node.js 中,TTY(Teletypewriter)是一个表示终端设备(例如终端或控制台)的抽象概念。TTY 模块提供了对终端 I/O 的访问,使得 Node.js 应用程序能够与用户通过命令行交互。

以下是一些关于 Node.js TTY 模块的基本概念和用法:

1. 获取 TTY 流:

可以使用 process.stdin、process.stdout 和 process.stderr 来获取标准输入、标准输出和标准错误的 TTY 流。
const tty = require('tty');

console.log('Is stdin a TTY?', tty.isatty(process.stdin.fd));
console.log('Is stdout a TTY?', tty.isatty(process.stdout.fd));
console.log('Is stderr a TTY?', tty.isatty(process.stderr.fd));

2. 创建 TTY 流:

可以使用 tty.ReadStream 和 tty.WriteStream 构造函数来创建 TTY 流。
const tty = require('tty');

const inputStream = new tty.ReadStream(fd);
const outputStream = new tty.WriteStream(fd);

3. 监听 TTY 事件:

TTY 流可以监听一些特定的事件,例如 resize 事件,该事件在终端窗口大小发生变化时触发。
const tty = require('tty');

process.stdout.on('resize', () => {
  const { columns, rows } = process.stdout;
  console.log(`Terminal size: ${columns}x${rows}`);
});

4. 判断是否为 TTY:

使用 tty.isatty(fd) 方法可以判断给定文件描述符是否对应于 TTY。
const tty = require('tty');

const isTTY = tty.isatty(0);  // 0 是标准输入的文件描述符
console.log('Is stdin a TTY?', isTTY);

5. 读取用户输入:

可以使用 TTY 流来读取用户的输入。
const tty = require('tty');

process.stdin.setRawMode(true);

process.stdin.on('data', (chunk) => {
  const key = chunk.toString('hex');
  if (key === '1b') {  // 1b 表示 Esc 键
    process.exit();
  } else {
    console.log('Key pressed:', key);
  }
});

上述示例设置了标准输入为原始模式,以便直接捕获键盘输入,然后监听 data 事件处理按键。

TTY 模块提供了一些功能,使得 Node.js 应用程序能够更好地适应终端环境。在构建命令行工具或需要与用户进行交互的应用程序时,TTY 模块是一个有用的工具。


转载请注明出处:http://www.zyzy.cn/article/detail/4784/Node.js