当前位置:首页 > JavaScript

js 实现终端

2026-02-02 11:44:46JavaScript

使用 Node.js 实现终端功能

Node.js 提供了 readline 模块和 process 标准输入输出流,可以轻松实现终端交互功能。

const readline = require('readline');

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

rl.question('请输入命令: ', (command) => {
  console.log(`执行命令: ${command}`);
  rl.close();
});

添加命令历史记录

通过维护一个数组来存储命令历史,并实现上下箭头浏览历史功能。

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

const history = [];
let historyIndex = -1;

rl.on('line', (input) => {
  history.push(input);
  console.log(`执行: ${input}`);
});

process.stdin.on('keypress', (str, key) => {
  if (key.name === 'up' && historyIndex < history.length - 1) {
    historyIndex++;
    rl.write(null, {ctrl: true, name: 'u'});
    rl.write(history[history.length - 1 - historyIndex]);
  }
  if (key.name === 'down' && historyIndex > 0) {
    historyIndex--;
    rl.write(null, {ctrl: true, name: 'u'});
    rl.write(history[history.length - 1 - historyIndex]);
  }
});

实现自动补全功能

利用 readline 的 completer 选项可以添加命令自动补全功能。

const commands = ['help', 'exit', 'clear', 'list'];

const completer = (line) => {
  const hits = commands.filter(c => c.startsWith(line));
  return [hits.length ? hits : commands, line];
};

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

添加彩色输出

使用 chalk 库可以为终端输出添加颜色。

const chalk = require('chalk');

console.log(chalk.blue('蓝色信息'));
console.log(chalk.red.bold('红色加粗错误'));
console.log(chalk.green('成功信息'));

实现多行输入

通过检测特定字符(如分号)来判断命令是否结束。

let buffer = '';

rl.on('line', (input) => {
  buffer += input;
  if (input.endsWith(';')) {
    console.log(`执行多行命令: ${buffer}`);
    buffer = '';
  } else {
    console.log('继续输入...');
  }
});

创建自定义提示符

可以动态修改提示符来显示当前工作目录或其他信息。

function setPrompt() {
  rl.setPrompt(`[${process.cwd()}] $ `);
  rl.prompt();
}

rl.on('line', (input) => {
  if (input === 'cd') {
    // 改变目录逻辑
    setPrompt();
  }
});

setPrompt();

处理 SIGINT 信号

优雅地处理 Ctrl+C 中断信号。

rl.on('SIGINT', () => {
  rl.question('确定要退出吗? (y/n) ', (answer) => {
    if (answer.match(/^y(es)?$/i)) rl.close();
    else rl.prompt();
  });
});

实现命令路由

建立一个命令路由系统来处理不同命令。

const commands = {
  help: () => console.log('可用命令: help, exit'),
  exit: () => process.exit(0),
  greet: (args) => console.log(`Hello, ${args[0] || 'stranger'}!`)
};

rl.on('line', (input) => {
  const [cmd, ...args] = input.trim().split(/\s+/);
  if (commands[cmd]) commands[cmd](args);
  else console.log(`未知命令: ${cmd}`);
});

添加异步命令支持

处理需要异步操作的命令。

const commands = {
  fetch: async (url) => {
    const response = await fetch(url[0]);
    console.log(await response.text());
  }
};

rl.on('line', async (input) => {
  const [cmd, ...args] = input.trim().split(/\s+/);
  if (commands[cmd]) await commands[cmd](args);
});

js 实现终端

标签: 终端js
分享给朋友:

相关文章

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 使用JavaScript实现拖拽功能需要监听鼠标事件,包括mousedown、mousemove和mouseup。以下是实现的基本逻辑: const draggableEleme…

js实现轮播图

js实现轮播图

轮播图实现方法 基础HTML结构 <div class="slider"> <div class="slides"> <img src="image1.jpg…

js实现分页

js实现分页

分页的基本实现思路 在JavaScript中实现分页功能通常需要结合前端和后端逻辑。前端负责渲染分页控件和处理用户交互,后端负责提供分页数据。 前端分页实现 纯前端分页适用于数据量较小的情况,可以…

js 实现倒计时

js 实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是两种常见实现方式。 使用 setInterval…

js实现选项卡

js实现选项卡

实现选项卡的基本思路 选项卡通常由一组标签和对应的内容面板组成。点击标签时,显示对应的内容面板,隐藏其他面板。实现这一效果需要结合HTML结构、CSS样式和JavaScript交互逻辑。 HTML结…

js实现图片预览

js实现图片预览

使用FileReader API实现图片预览 通过FileReader对象读取用户选择的图片文件并显示预览: const input = document.getElementById('imag…