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.pswp.cn/bicheng/15640.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/15640.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/15640.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【設計模式】JAVA Design Patterns——Bytecode(字節碼模式)

&#x1f50d;目的 允許編碼行為作為虛擬機的指令 &#x1f50d;解釋 真實世界例子 一個團隊正在開發一款新的巫師對戰游戲。巫師的行為需要經過精心的調整和上百次的游玩測試。每次當游戲設計師想改變巫師行為時都讓程序員去修改代碼這是不妥的&#xff0c;所以巫師行為以數據…

環形鏈表Ⅱ-力扣

第一種解法時哈希表&#xff0c;set在使用insert插入時&#xff0c;會返回一個pair&#xff0c;如果pair的值為0&#xff0c;則插入失敗&#xff0c;那么返回這個插入失敗的節點&#xff0c;就是入環的第一個節點&#xff0c;代碼如下&#xff1a; /*** Definition for singly…

導航【面試準備】

導航【面試準備】 前言版權導航【面試準備】面經準備 最后 前言 2024-5-20 12:47:11 以下內容源自《【面試準備】》 僅供學習交流使用 版權 禁止其他平臺發布時刪除以下此話 本文首次發布于CSDN平臺 作者是CSDN日星月云 博客主頁是https://jsss-1.blog.csdn.net 禁止其他平…

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…

設計模式-策略模式-使用

設計模式-策略模式-CSDN博客 系統中有很多類&#xff0c;它們之間的區別僅在于它們的行為。策略模式可以定義一系列的算法&#xff0c;并將它們一個個封裝起來&#xff0c;使它們可以相互替換。這樣&#xff0c;算法就可以獨立于使用它的客戶而變化。需要使用算法的不同變體。…

《計算機網絡微課堂》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…

GraphSAGE

GraphSAGE 節點采樣&#xff1a;聚合&#xff08;Aggregation&#xff09;&#xff1a;更新&#xff08;update&#xff09;&#xff1a;例子&#xff1a;總結&#xff1a; 啥是GraphSAGE呢&#xff1f; 是一種用于圖嵌入的無監督學習方法。 通過采樣和聚合鄰居節點的信息來生成…

【一步一步了解Java系列】:Java中的方法對標C語言中的函數

看到這句話的時候證明&#xff1a;此刻你我都在努力~ 加油陌生人~ 個人主頁&#xff1a;Gu Gu Study 專欄&#xff1a;一步一步了解Java 喜歡的一句話&#xff1a; 常常會回顧努力的自己&#xff0c;所以要為自己的努力留下足跡。 _ 如果喜歡能否點個贊支持一下&#xff0c;謝謝…

Xfce4桌面背景和桌面圖標消失問題解決@FreeBSD

問題&#xff1a;Xfce4桌面背景和桌面圖標消失 以前碰到過好幾次桌面背景和桌面圖標消失&#xff0c;整個桌面除了上面一條和下面中間的工具條&#xff0c;其它地方全是黑色的問題&#xff0c;但是這次重啟之后也沒有修復&#xff0c;整個桌面烏黑一片&#xff0c;啥都沒有&am…

認知V2X的技術列一個學習大綱

為了深入學習和理解V2X&#xff08;Vehicle to Everything&#xff09;技術&#xff0c;以下是一個學習大綱的概述&#xff0c;結合了參考文章中的相關數字和信息&#xff1a; 一、V2X技術基礎 V2X概述 定義&#xff1a;V2X是車用無線通信技術&#xff0c;將車輛與一切事物相連…

WebService相關內容

WebService中的wsdl什么意思? WSDL(Web Services Description Language)Web服務描述語言及其功能、操作、參數和返回值的XML格式的語言。它在Java和其他編程語言中都可以使用,用于定義Web服務的接口以及如何與這些服務進行交互。 WSDL的作用 WSDL的主要作用是提供一種標準…