Vue xtermjs 黑窗口 插件的使用

这篇具有很好参考价值的文章主要介绍了Vue xtermjs 黑窗口 插件的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

官网地址:https://xtermjs.org/
但其实感觉官网没什么用,只有一个最简单的demo,具体的使用手册,还是得靠前人栽树了

1.展示效果

因为我这里已经和后台对接了ws 所以会有重复的返回(单数行都是ws返回的信息)

vue xterm.js,vue.js,javascript,前端
2.具体代码
一、下载插件

  • xterm

npm install --save xterm

  • xterm-addon-fit

使终端的尺寸适合包含元素):
npm install --save xterm-addon-fit

  • xterm-addon-attach

xterm.js的附加组件,用于附加到Web Socket
npm install --save xterm-addon-attach

二、创建容器

  • html
<template>
    <div id="xterm" class="xterm" />
</template>
  • js

由于我已经写好了ws通用组件,所以这里并没有创建此组件和使用AttachAddon
只使用了this.$emit("websocketSend", wsParams, server);传递参数
ws的通信可以参考此博客

<script>
import "xterm/css/xterm.css";
import { Terminal } from "xterm";
import { FitAddon } from "xterm-addon-fit";
// import { AttachAddon } from "xterm-addon-attach";
export default {
	name: "terminal",
	data() {
		return {
			term: "",//terminal 黑窗口容器
			prefix: "[root@serverip ~]# ",//前缀
			inputText: "",//输入内容,每次回车后进行ws通信然后清空此数据
		};
	},
	watch: {},
	methods: {
		//初始化黑窗口
		async initTerm() {
			const fitAddon = new FitAddon();
			this.term = new Terminal({
				fontSize: 14,
				cursorBlink: true,
				allowProposedApi: true,
				disableStdin: false,
				LogLevel: "debug",
			});

			this.term.loadAddon(fitAddon);
			//开启Xterm终端
			this.term.open(document.getElementById("xterm"));
			this.term.writeln("\x1b[1;1;32mwellcom to web terminal!\x1b[0m");
			this.term.write(this.prefix); //黑窗口 前缀

			await this.termPromt(); //term.promt
			await this.termKeyCode(); //事件

			fitAddon.fit(); //黑窗口适应实际div宽高
			this.term.focus(); //自动聚焦
		},
		//事件
		termKeyCode() {
			const TERMINAL_INPUT_KEY = {
				BACK: 8, // 退格删除键
				ENTER: 13, // 回车键
				UP: 38, // 方向盘上键
				DOWN: 40, // 方向盘键
				LEFT: 37, // 方向盘左键
				RIGHT: 39, // 方向盘右键
			};
			const { eqpCode, server } = this.selectObj;
			let inputText = "";
			let currentIndex = 0;
			let inputTextList = [];
			this.term.onKey((e) => {
				const { key, domEvent } = e;
				const { keyCode, altKey, altGraphKey, ctrlKey, metaKey } = domEvent;

				const printAble = !(altKey || altGraphKey || ctrlKey || metaKey); // 禁止相关按键
				const totalOffsetLength = inputText.length + this.prefix.length; // 总偏移量
				const currentOffsetLength = this.term._core.buffer.x; // 当前x偏移量

				switch (keyCode) {
					//删除
					case TERMINAL_INPUT_KEY.BACK:
						if (currentOffsetLength > this.prefix.length) {
							const cursorOffSetLength = this.getCursorOffsetLength(totalOffsetLength - currentOffsetLength, "\x1b[D"); // 保留原来光标位置

							this.term._core.buffer.x = currentOffsetLength - 1;
							this.term.write("\x1b[?K" + inputText.slice(currentOffsetLength - this.prefix.length));
							this.term.write(cursorOffSetLength);
							inputText = `${inputText.slice(0, currentOffsetLength - this.prefix.length - 1)}${inputText.slice(
								currentOffsetLength - this.prefix.length
							)}`;
						}
						break;
					//回车
					case TERMINAL_INPUT_KEY.ENTER: {
						this.term.write("\r\n");
						console.log("inputText", inputText);
						//ws 通信参数
						let wsParams = { EqpCode: eqpCode, Action: "terminal", Data: inputText };
						this.$emit("websocketSend", wsParams, server);

						if (!inputText.trim()) {
							this.term.prompt();
							return;
						}

						if (inputTextList.indexOf(inputText) === -1) {
							inputTextList.push(inputText);
							currentIndex = inputTextList.length;
						}

						this.term.prompt();
						inputText = "";
						break;
					}

					case TERMINAL_INPUT_KEY.UP: {
						if (!inputTextList[currentIndex - 1]) break;

						const offsetLength = this.getCursorOffsetLength(inputText.length, "\x1b[D");

						inputText = inputTextList[currentIndex - 1];
						this.term.write(offsetLength + "\x1b[?K");
						this.term.write(inputTextList[currentIndex - 1]);
						this.term._core.buffer.x = totalOffsetLength;
						currentIndex--;

						break;
					}
					case TERMINAL_INPUT_KEY.LEFT:
						if (currentOffsetLength > this.prefix.length) {
							this.term.write(key); // '\x1b[D'
						}
						break;

					case TERMINAL_INPUT_KEY.RIGHT:
						if (currentOffsetLength < totalOffsetLength) {
							this.term.write(key); // '\x1b[C'
						}
						break;
					default: {
						// 在当前的坐标写上 key 和坐标后面的字符
						// 移动停留在当前位置的光标
						if (!printAble) break;
						if (totalOffsetLength >= this.term.cols) break;
						if (currentOffsetLength >= totalOffsetLength) {
							this.term.write(key);
							inputText += key;
							break;
						}
						let cursorOffSetLength = this.getCursorOffsetLength(totalOffsetLength - currentOffsetLength, "\x1b[D");
						this.term.write("\x1b[?K" + `${key}${inputText.slice(currentOffsetLength - this.prefix.length)}`);
						this.term.write(cursorOffSetLength);
						inputText = inputText.slice(0, currentOffsetLength) + key + inputText.slice(totalOffsetLength - currentOffsetLength);
						break;
					}
				}
			});
		},
		//限制和后端交互,只有输入回车键才显示结果
		termPromt() {
			this.term.prompt = () => {
				this.term.write(this.prefix);
			};
		},
		//获取光标当前位置
		getCursorOffsetLength(offsetLength, subString) {
			let cursorOffsetLength = "";
			for (let offset = 0; offset < offsetLength; offset++) {
				cursorOffsetLength += subString;
			}
			return cursorOffsetLength;
		},
		//写入黑窗口
		wirteTerm(data) {
			console.log("写入黑窗口", data);
			this.term.writeln(data);
			this.term.prompt();
		},
		//加载基础数据
		pageLoad(data) {
			this.selectObj = data;
			this.drawerFlag = true;
			this.$nextTick(() => {
				this.initTerm();
			});
		},
		cancelClick() {
			this.drawerFlag = false;
			//关闭弹框
			this.term.dispose(document.getElementById("xterm"));
		},
	},
};
</script>

二.利用xterm-addon-attach进行实时通信文章来源地址https://www.toymoban.com/news/detail-636140.html

<script>
import 'xterm/css/xterm.css'
import { Terminal } from 'xterm'
import { FitAddon } from 'xterm-addon-fit'
import { AttachAddon } from 'xterm-addon-attach'

export default {
  name: 'Xterm',
  props: {
    socketURI: {
      type: String,
      default: ''
    },
  },
  mounted() {
    this.initSocket()
  },
  beforeDestroy() {
    this.socket.close()
    this.term.dispose()
  },
  methods: {
    initTerm() {
      const term = new Terminal({
        fontSize: 14,
        cursorBlink: true
      });
      const attachAddon = new AttachAddon(this.socket);
      const fitAddon = new FitAddon();
      term.loadAddon(attachAddon);
      term.loadAddon(fitAddon);
      term.open(document.getElementById('xterm'));
      fitAddon.fit();
      term.focus();
      this.term = term
    },
    initSocket() {
      this.socket = new WebSocket(this.socketURI);
      this.socketOnClose();
      this.socketOnOpen();
      this.socketOnError();
    },
    socketOnOpen() {
      this.socket.onopen = () => {
        // 链接成功后
        this.initTerm()
      }
    },
    socketOnClose() {
      this.socket.onclose = () => {
        // console.log('close socket')
      }
    },
    socketOnError() {
      this.socket.onerror = () => {
        // console.log('socket 链接失败')
      }
    }
  }
}
</script>

到了这里,关于Vue xtermjs 黑窗口 插件的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Vue】使用print.js插件实现打印预览功能,超简单

    目录 一、实现效果  二、实现步骤 【1】安装插件 【2】在需要打印的页面导入 【3】在vue文件中需要打印的部分外层套一层div,给div设置id。作为打印的区域 【4】在打印按钮上添加打印事件 【5】在methods中添加点击事件 三、完整代码   print.js插件,可以打印html、pdf、json数

    2024年02月14日
    浏览(48)
  • vue3 终端实现 (vue3+xterm+websocket)

      目录 一、xterm介绍 二、效果展示 三、vue文件实现代码 一、xterm介绍 xterm是一个使用 TypeScript 编写的前端终端组件,可以直接在浏览器中实现一个命令行终端应用,通常与 websocket 一起使用。 二、效果展示 三、vue文件实现代码

    2024年02月04日
    浏览(36)
  • vue + xtermjs + websocket 前端网页版终端,操作后端的docker容器

    简介: 1.自动版,无需维护websocket,由xterm-addon-attach插件监控输入输出(推荐,简单好用) 2.自定义版,维护websocket,自己实现输入输出 3.xtermjs、xterm-addon-attach、xterm-addon-fit、docker 4.以上版本都是由cdn形式html页面实现,如需vue-cli工程化实现,只需import引入fitAddon 、attachAdd

    2024年02月12日
    浏览(39)
  • 使用 vue-3-socket.io 插件以及node.js实现实时聊天(1)

     这篇文章使用选项式API的写法,以实现群聊和私聊为主 客户端自然是对应使用vue3框架,服务端使用node.js配合express、http、socket.io、file等库来实现,具体如下: 1、下载所需的依赖 2、做socket客户端配置 注:\\\"http://localhost:3000\\\",该地址端口是对应后面配置服务端时所开放的端

    2024年02月05日
    浏览(41)
  • 2023 ~【VUE+Xterm+Websocket】模拟SSH连接效果

    1、安装包 xterm 、 xterm-addon-attach 、 xterm-addon-fit 安装最新版本即可 2、在页面中使用

    2024年02月07日
    浏览(35)
  • 使用JavaScript和Vue.js框架开发的电子商务网站,实现商品展示和购物车功能

    引言: 随着互联网的快速发展和智能手机的普及,电子商务行业正迎来一个全新的时代。越来越多的消费者选择网上购物,而不再局限于传统的实体店。这种趋势不仅仅是改变了消费者的习惯购物,也给企业带来了巨大的商机。为了不断满足消费者的需求,电子商务网站需要

    2024年02月15日
    浏览(54)
  • Vue3 开发实战分享——打印插件 Print.js 的使用(Vue3 + Nodejs + Print.js 实战)以及 el-table 与 el-pagination 的深入使用(下)

    在进入文章的正文之前,我们先一起了解一下关于 CSDN 今年的 1024 程序员节。与此同时这也是我在 CSDN 参与的第二个 1024 程序员节日,转眼间也快写博客两年时间,去年很遗憾没有去到深圳(疫情原因)线下参加这个有趣而充实的峰会。今年没有特殊情况的话一定会如约而至

    2024年02月06日
    浏览(48)
  • Vue3 开发实战分享——打印插件 Print.js 的使用(Vue3 + Nodejs + Print.js 实战)以及 el-table 与 el-pagination 的深入使用(上)

    今天久违的更新一下关于 Vue 的文章了,本篇文章是基于 Vue3 + Node.js + ElementPlus 的实战项目分享,实战内容包括有打印插件 Print.js 的使用,以及关于 ElementPlus 中的 el-table 与 el-pagination 的深入使用。本次项目以文章(axios 实战进阶练习——基于 Vue3 + Node.js + ElementPlus 实现的联

    2024年02月06日
    浏览(44)
  • Vue,js 监听window窗口尺寸变化

    1.监听window窗口变化 VueJs 监听 window.resize 方法,同时窗口拉伸时会频繁触发resize函数,导致页面性能 卡顿 ,可以搭配setTimeout来提升性能 在mounted中挂载resize方法 watch 监听 data中或props传递的数据

    2024年02月11日
    浏览(71)
  • WebSocket+xterm+springboot+vue 实现 xshell 操作linux终端功能

    1.1 xterm.js xterm 是一个使用 TypeScript 编写的前端终端组件,可以直接在浏览器中实现一个命令行终端应用。Xterm.js 适用于大多数终端应用程序,如 bash,vim 和 tmux,这包括对基于curses的应用程序和鼠标事件的支持。 1.2 安装 安装完之后可以在package.json看到依赖 1.3 websocket websoc

    2023年04月10日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包