
1. xterm.js 是什么?能干嘛?
在很多 DevOps 平台、在线运维系统、云 IDE 中,你是不是常看到一个网页就能打开"黑窗口"?没错,那大概率用的就是 xterm.js
。它是一个基于 JavaScript 的前端终端模拟器,完美模拟了本地终端的交互体验,像腾讯云的远程SSH终端就是基于 xterm.js
实现的.
它的出现,让你不再需要依赖本地命令行工具,只要一个浏览器,就能实现 ssh 操作、容器日志查看,甚至直接和后端交互调试。
简而言之,xterm.js
= 浏览器里的终端界面模拟 + 强大的字符处理能力 + 良好的生态兼容性。
2. 为什么这么多项目都选 xterm.js?
xterm.js 的受欢迎不是偶然,它有几个杀手锏:
- 性能优秀:即使是连续快速打印大量日志,它也不会卡顿。
- 插件系统强大 :比如
xterm-addon-fit
可以让终端自适应窗口大小,xterm-addon-web-links
支持链接点击。 - API 友好:提供了一整套面向开发者的调用方式,上手门槛低。
- 跨平台兼容好:主流浏览器和系统都能跑,无需担心兼容问题。
更别说 GitHub 上超过 18k+ 的 star,以及 VSCode 都是基于它做的终端模拟,这背书,不是随便哪个库能有的。
3. 如何在项目中集成 xterm.js?
不啰嗦,直接上手干货:
第一步:安装依赖
bash
npm install @xterm/xterm
第二步:HTML 中准备容器
html
<div id="terminal"></div>
第三步:初始化终端
html
<!doctype html>
<html>
<head>
<link rel="stylesheet" href="node_modules/@xterm/xterm/css/xterm.css" />
<script src="node_modules/@xterm/xterm/lib/xterm.js"></script>
</head>
<body>
<div id="terminal"></div>
<script>
var term = new Terminal();
term.open(document.getElementById('terminal'));
term.write('Hello from \x1B[1;3;31mxterm.js\x1B[0m $ ')
</script>
</body>
</html>
第四步:与后端交互(WebSocket 示例)
js
const socket = new WebSocket('ws://localhost:8080/terminal');
socket.onmessage = (event) => {
terminal.write(event.data);
};
terminal.onData(data => {
socket.send(data);
});
第五步:后端 WebSocket 服务
后端基于 WebSocket
、PTY(伪终端)
实现,需要先下载 github.com/gorilla/websocket
、github.com/creack/pty
这两个库。其中 WebSocket
用于进行前后端的数据传输,pty
用于开启一个 shell 子进程。
go
package main
import (
"log"
"net/http"
"os/exec"
"github.com/creack/pty"
"github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{
CheckOrigin: func(r *http.Request) bool { return true }, // 允许跨域
}
func terminalHandler(w http.ResponseWriter, r *http.Request) {
// 升级为 WebSocket
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println("WebSocket Upgrade:", err)
return
}
defer conn.Close()
// 创建 bash 终端
cmd := exec.Command("bash")
f, err := pty.Start(cmd)
if err != nil {
log.Println("启动 pty 出错:", err)
return
}
defer f.Close()
// 从终端输出 -> 发给前端
go func() {
buf := make([]byte, 1024)
for {
n, err := f.Read(buf)
if err != nil {
return
}
conn.WriteMessage(websocket.TextMessage, buf[:n])
}
}()
// 从前端输入 -> 写入终端
for {
_, msg, err := conn.ReadMessage()
if err != nil {
return
}
f.Write(msg)
}
}
func main() {
http.HandleFunc("/ws", terminalHandler)
http.ListenAndServe(":8080", nil)
}
至此,一个可交互的 Web 终端就搭建好了!

4. 开发 Tips:用起来更丝滑
- 配合
resize
事件监听,终端窗口大小可以自动适应浏览器变化。 - 想要支持粘贴、快捷键等交互?xterm 提供丰富事件监听支持,比如
onKey
、onSelectionChange
等。
5. 结语:用对工具,事半功倍
xterm.js 不是一个新鲜的库,但却是无数远程终端项目的基石。无论你是在做云开发平台,还是想远程控制一台设备,xterm.js 都能成为你最值得信赖的选择。