一般的 nodejs 命令行都是 流水线代码, 执行完就退出了.
下面的代码可以让 控制台窗口保持运行不退出,
按下某个键 , 执行某个代码 , 用来做复杂的命令行程序
import * as readline from 'readline';
readline.emitKeypressEvents(process.stdin);
process.stdin.setRawMode(true);
process.stdin.on('keypress', (str: string, key: { sequence: string, name: string, ctrl: boolean, meta: boolean, shift: boolean }) => {
console.log(str, key);
// ctrl + c 退出
if (key.ctrl && key.name === 'c') {
process.exit(0)
return;
}
// q 退出
if (key.name === 'q') {
process.exit(0)
return;
}
// p
if (str === 'p') {
console.log('p 被按下了')
// 执行自己的逻辑
return;
}
});
扩展一下
export interface IReadKey { sequence: string, name: string, ctrl: boolean, meta: boolean, shift: boolean }
export interface IFnArr { expression: (key: IReadKey) => boolean, fn: () => void }
export type ReadKeyProps = IFnArr[]
export let readKey = (fnArr: ReadKeyProps) => {
let readline = require("readline")
readline.emitKeypressEvents(process.stdin);
process.stdin.setRawMode(true);
process.stdin.on('keypress', (str: string, key: IReadKey) => {
console.log(str, key);
// ctrl + c 退出
if (key.ctrl && key.name === 'c') {
process.exit(0)
return;
}
// 执行符合条件的方法
for (let item of fnArr) {
if (item.expression(key)) {
item.fn()
return; // 阻止执行多个符合条件的方法
}
}
});
}
使用
readKey([
{
expression: key => key.name == "1",
fn: () => {
console.log(111);
}
},
{
expression: key => key.name == "2",
fn: () => {
console.log(222);
}
},
{
expression: key => key.name == "3",
fn: () => {
console.log(333);
}
},
])