Terminal Web终端基础(Web IDE 技术探索 二)

        Terminal是web终端技术,类似cmd命令窗口,Webcontainer 中推荐使用的是Xterm.js,这里就不细说Xterm.js 的使用了,我们使用第三方库来实现(原生确实有点难用)。

 vue-web-terminal

        一个由 Vue 构建的支持多内容格式显示的网页端命令行窗口插件,支持表格、json、代码等多种消息格式,支持自定义消息样式、命令行库、键入搜索提示等,模拟原生终端窗口支持 ← → 光标切换和 ↑ ↓ 历史命令切换。其完善的API、中文文档、拖拽、缩放、实时回显等功能是我选择其的原因之一。

在线体验地址

github 地址

中文文档

npm install vue-web-terminal@3 --save 
import Terminal from 'vue-web-terminal'
//  3.2.0 及 2.1.13 以后版本需要引入此样式,之前版本无需引入主题样式
import 'vue-web-terminal/lib/theme/dark.css'// for vue3
const app = createApp(App).use(Terminal)
<template><terminal name="my-terminal" @exec-cmd="onExecCmd"></terminal>
</template><script setup>
function onExecCmd(cmd) {console.log(cmd);
}
</script>

切换主题

        主题的核心是导入的style 文件里面自定义的css变量,因此,我们可以通过控制导入的文件实现主题切换: 

        经过分析观察,两个文件的节点是一样的,无法通过js控制,因此,复制文件到外部文件夹,并添加标识,main.js 中引入外部文件: 

function changeTheme() {document.querySelector("html").setAttribute("t-theme", dark.value ? "dark" : "lignt");dark.value = !dark.value;
}

        这样更利于我们自定义主题,直接在原有基础上进行拓展即可。

个性化配置

show-header 是否显示头部

context 上下文内容(Root)

context-suffix 上下文后缀符号(@)

...更多配置项,大家去官网看下,比较简单,就不细说了。

事件列表

        事件这块我就说一个 exec-cmd:执行自定义命令时触发。successfailed为回调函数,必须调用两个回调其中之一才会回显failed回调参数为一个string,exec-cmd的success回调参数支持多种数据类型,不同数据类型执行逻辑也会不同:

  • 不传任何参数,立即结束本次执行
  • 传入一个消息对象,将会向记录中追加一条消息,并立即结束本次执行
  • 传入一个消息对象数组,将会向记录中追加多条消息,并立即结束本次执行
  • 传入一个TerminalFlash对象,将会进入实时回显处理逻辑,本次执行并不会结束,直到调用finish()
  • 传入一个TerminalAsk对象,将会进入用户询问输入处理逻辑,本次执行并不会结束,直到调用finish()
function onExecCmd(cmdKey, command, success, failed, name) {}

function onExecCmd(cmdKey, command, success, failed, name) {success(); // 什么都不传,直接结束
}

function onExecCmd(cmdKey, command, success, failed, name) {success({ content: "hello world" }); // 传一个消息对象
}

function onExecCmd(cmdKey, command, success, failed, name) {success([{ content: "hello world" }, { content: "hello javascript" }]); // 传一个消息对象数组
}

import { TerminalFlash } from "vue-web-terminal";
const flash = new TerminalFlash();
function onExecCmd(cmdKey, command, success, failed, name) {let count = 0;success(flash); // 传一个 TerminalFlashlet flashInterval = setInterval(() => {//  显示数据调用 flag.flush(string)flash.flush(`This is flash content: ${count}`);if (++count >= 20) {clearInterval(flashInterval);//  结束回显调用 flag.finish()flash.finish();}}, 200);
}

import { TerminalFlash, TerminalAsk } from "vue-web-terminal";
const flash = new TerminalFlash();
const asker = new TerminalAsk();
function onExecCmd(cmdKey, command, success, failed, name) {success(asker); // 传一个 TerminalAsk// 询问账号asker.ask({question: "Please input user name:",callback: askPassword,});function askPassword(value) {console.log("输入的username ==>", value);asker.ask({question: "Please input password: ",autoReview: true,isPassword: true,callback: (pass) => {//    do somethingconsole.log("输入的password ==>", pass);asker.finish();},});}
}

         后面两种复杂的情况在构建应用时常用到,大家多练习下。还支持插槽,这块大家自己看下文档,应该也能学会,就不细说了。

Terminal API

        API无非就是主动向终端发送消息,具体api 可以看官网哈

TerminalApi.textEditorOpen('my-terminal', {content: 'This is the preset content',onClose: (value, options) => {console.log('Final content: ', value, "options:", options)}
})

        在xshell中,可以在终端直接编辑 nginx配置文件,vue-web-terminal 支持调用textEditorOpen方法,打开编辑器:

 与WebContainer结合

        terminal只是网页端命令行窗口插件,并不具备实际的命令执行能力。当我输入 node -v 的时候,terminal的显示值,还需要通过 success 决定。

        因此,需要与webcontainer 结合,使得 terminal的输入,转化为 spawn 的参数,获取到output 输出流后,再回显到 terminal上。

async function onExecCmd(cmdKey, command, success, failed, name) {// 将命令行拆分为数组let argus = command.split(" ");let res = await wcInstance.spawn(argus[0], argus.slice(1));// 读取流res.output.pipeTo(new WritableStream({write(data) {success(data);},}));
}

         这只是一个简单的示例哈,并不是所有的回显都是 success,也并不是所有的回显都是直接显示文本,例如 ls 查看文件列表,使用表格更合适,npm install 使用实时回显flash 更合适。 

总结

        确实vue-web-terminal使用起来更加方便,封装的API、事件列表为我们省去了很多麻烦。使用起来也不难,大家多看文档即可学会。但是大家要记住哈,terminal仅是终端展示用,实际的执行能力还是依靠webContainer,因此,两者的参数传递、数据回显需要做精细化处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/15640.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【设计模式】JAVA Design Patterns——Bytecode(字节码模式)

&#x1f50d;目的 允许编码行为作为虚拟机的指令 &#x1f50d;解释 真实世界例子 一个团队正在开发一款新的巫师对战游戏。巫师的行为需要经过精心的调整和上百次的游玩测试。每次当游戏设计师想改变巫师行为时都让程序员去修改代码这是不妥的&#xff0c;所以巫师行为以数据…

AcW木棒-XMUOJ恢复破碎的符咒木牌-DFS与剪枝

题目 思路 话不多说&#xff0c;直接上代码 代码 /* AcW木棒-XMUOJ恢复破碎的符咒木牌 搜索顺序&#xff1a;从小到大枚举最终的长度 len从前往后依次拼每根长度为len的木棍 优化&#xff1a; 1.优化搜索顺序&#xff1a;优先选择深度短的来搜索&#xff0c;故从大到小去枚…

【系统分析师】WEB开发-案例

文章目录 1、WEB开发涉及内容1.1 负载均衡技术1.2 数据库读写分离1.3 缓存 缓解读库压力1.4 CDN1.5 WEB应用服务器1.6 整体结构1.6 相关技术1.6.1 redis相关(集群、持久化等)1.6.2 XML与JSON1.6.3 REST1.6.4 响应式web设计1.6.5 关于中台1.6.6 Web系统分层 1、WEB开发涉及内容 …

Python--面向对象

面向对象⭐⭐ 1. 面向对象和面向过程思想 面向对象和面向过程都是一种编程思想,就是解决问题的思路 面向过程&#xff1a;POP(Procedure Oriented Programming)面向过程语言代表是c语言面向对象&#xff1a;OOP(Object Oriented Programming)常见的面向对象语言包括:java c g…

19c数据库19.9以下dg切换打开hang住问题

原主库发起切换请求&#xff0c;原主库正常切换数据库角色&#xff0c;但原从库无法正常打开数据库&#xff0c;尝试关闭重启&#xff0c;依旧无法解决问题。 查看切换过程中原从库数据库后台日志&#xff0c;发现数据库一直不断重试清理 SRLs&#xff0c; 后台alert日志&…

力扣HOT100 - 21. 合并两个有序链表

解题思路&#xff1a; class Solution {public ListNode mergeTwoLists(ListNode list1, ListNode list2) {ListNode dum new ListNode(0), cur dum;while (list1 ! null && list2 ! null) {if (list1.val < list2.val) {cur.next list1;list1 list1.next;} els…

基本IO接口

引入 基本输入接口 示例1 示例2&#xff1a;有数据保持能力的外设 #RD端由in指令控制&#xff1a;将数据由端口传输到CPU内存中 #CS244信号由译码电路实现 示例3&#xff1a; a)图中由于输出端口6有连接到端口1&#xff0c;当开关与端点1闭合时期间&#xff0c;仍能维持3端口…

插件:NGUI

一、版本 安装完毕后重启一下即可&#xff0c;否则可能创建的UI元素不生效 二、使用 Label文字 1、创建Canvs 2、只有根节点的这些脚本全部展开才能鼠标右键创建UI元素 3、选择字体 Sprite图片 1、选择图集 2、选择图集中的精灵 Panel容器 用来装UI的容器&#xff0c;一般UI…

《计算机网络微课堂》2-5 信道的极限容量

本节课我们介绍信道极限容量的有关问题。 我们都知道信号在传输过程中会受到各种因素的影响&#xff0c;如图所示&#xff0c;这是一个数字信号&#xff0c;‍‍当它通过实际的信道后&#xff0c;波形会产生失真&#xff0c;当失真不严重时&#xff0c;在输出端‍‍还可根据以失…

Redis实现热点数据排行榜或游戏积分排行榜

数据库中的某张表中存储着文章的浏览量&#xff0c;或者点赞数等&#xff0c;或者游戏积分等数据...... 这些数据的更新在redis中完成&#xff0c;并定时同步到mysql数据库中。 而如果要对这些数据进行排序的话&#xff1a; Redis中的Sorted Set(有序集合)非常适合用于实现排…

vue源码2

vue之mustache库的机理其实是将模板字符串转化为tokens 然后再将 tokens 转化为 dom字符串&#xff0c;如下图 对于一般的将模板字符串转化为dom字符串&#xff0c;这样不能实现复杂的功能 let data {name:小王,age:18 } let templateStr <h1>我叫{{name}},我今年{{ag…

centos7 服务开机自启动 - systemctl -以禅道为例

在服务器上安装的各种中间件&#xff0c;一般都需要配置成开机自启动。但是有些中间件的安装过程中并没有提供相关配置开机自启动的说明文档。本文总结一下Centos7通过systemctl enble配置服务自启动的方法。一、Centos7通过systemctl enble配置服务自启动 在Centos7后&#x…

【一步一步了解Java系列】:Java中的方法对标C语言中的函数

看到这句话的时候证明&#xff1a;此刻你我都在努力~ 加油陌生人~ 个人主页&#xff1a;Gu Gu Study 专栏&#xff1a;一步一步了解Java 喜欢的一句话&#xff1a; 常常会回顾努力的自己&#xff0c;所以要为自己的努力留下足迹。 _ 如果喜欢能否点个赞支持一下&#xff0c;谢谢…

Xfce4桌面背景和桌面图标消失问题解决@FreeBSD

问题&#xff1a;Xfce4桌面背景和桌面图标消失 以前碰到过好几次桌面背景和桌面图标消失&#xff0c;整个桌面除了上面一条和下面中间的工具条&#xff0c;其它地方全是黑色的问题&#xff0c;但是这次重启之后也没有修复&#xff0c;整个桌面乌黑一片&#xff0c;啥都没有&am…

idea上传git命令

git init git remote add origin git add . git commit -m "标题" git push -u origin master

Python编程之调试魔法与列表逆转之谜

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、调试魔法&#xff1a;揭开Python编程的神秘面纱 代码调试实例 二、列表逆转之谜&#…

实验一:通过路由器实现内外网互联

通过路由器实现内外网互联 一、实验拓扑 相关配置详见下图&#xff0c;内网区域为AR2以内设备&#xff0c;外网区域以AR1和PC1代替进行实验测试。 二、实验要求 通过路由器实现内外网互联&#xff1a; 1.各内网PC可自动获取ip地址&#xff1b; 2.各内网PC可ping通外网PC&…

蓝海卓越计费管理系统 agent_setstate.php SQL注入漏洞复现

0x01 产品简介 蓝海卓越计费管理系统是一套以实现网络运营为基础,增强全局安全为中心,提高管理效率为目的的网络安全运营管理系统,提供“高安全、可运营、易管理”的运营管理体验,基于标准的RADIUS协议开发,它不仅支持PPPOE和WEB认证计费,还支持802.1X接入控制技术,与其…

Kubernetes部署dashboard

Kubernetes部署dashboard Kubernetes集群安装 鲲鹏arm64架构下安装KubeSphere linux安装部署k8s(kubernetes)和解决遇到的坑 dashboard部署 $ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashbo…

STM32学习和实践笔记(30):窗口看门狗(WWDG)实验

1.WWDG介绍 1.1 WWDG简介 上一章我们已经介绍了IWDG&#xff0c;知道它的工作原理就是一个12位递减计数器不断递减计数&#xff0c;当减到0之前还未进行喂狗的话&#xff0c;产生一个MCU复位。 窗口看门狗WWDG其实和独立看门狗类似&#xff0c;它是一个7位递减计数器不断的往…