当前位置:首页 > 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}`);
});

添加异步命令支持

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

js 实现终端

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实现拖拽

实现拖拽的基本步骤 通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖拽功能。以下是核心代码逻辑: const draggableElement = document.…

js实现论坛

js实现论坛

实现论坛的基本功能 使用JavaScript实现一个论坛需要结合前端和后端技术。前端可以使用React、Vue或Angular等框架,后端可以选择Node.js配合Express或Koa框架。数据库可…

js实现求导

js实现求导

实现数值求导的方法 在JavaScript中实现求导通常采用数值方法,因为JavaScript不是符号计算语言。以下是常见的数值微分方法: 中心差分法 中心差分法提供较高精度的导数近似: func…

js实现密码

js实现密码

密码强度验证 使用正则表达式验证密码强度是一种常见方法。以下代码检查密码是否包含大小写字母、数字和特殊字符,且长度至少为8位: function checkPasswordStrength(pass…

js实现代码雨

js实现代码雨

实现代码雨效果 使用HTML5 Canvas和JavaScript可以轻松实现经典的代码雨效果。以下是完整的实现代码和说明: HTML结构 <!DOCTYPE html> <…

js实现下拉菜单

js实现下拉菜单

使用HTML和CSS创建基础结构 HTML部分需要包含一个触发下拉的按钮和隐藏的下拉菜单内容: <div class="dropdown"> <button class="dr…