- Ghostty-web là một trình giả lập terminal tương thích VT100 chạy trong trình duyệt, có thể sử dụng theo đúng cách như API của xterm.js
- Sử dụng trình phân tích Ghostty được biên dịch sang WASM, cung cấp cùng một nền tảng mã nguồn với ứng dụng native và không có phụ thuộc runtime
- Các dự án xterm.js hiện có có thể di chuyển chỉ bằng cách đổi
@xterm/xterm thành ghostty-web
- Cung cấp khả năng xử lý chính xác hơn xterm.js ở các mục như render script phức tạp và hỗ trợ chuỗi XTPUSHSGR/XTPOPSGR
- Là công cụ có thể đơn giản hóa việc triển khai terminal hiệu năng cao trong môi trường phát triển trên trình duyệt hoặc cloud IDE
Tổng quan
- ghostty-web là dự án đưa trình giả lập terminal của Ghostty lên môi trường web, đồng thời giữ khả năng tương thích với API xterm.js
- Cung cấp triển khai VT100 chính xác trong trình duyệt
- Người dùng xterm.js hiện tại có thể chuyển đổi dễ dàng
- Sử dụng trình phân tích Ghostty được biên dịch sang WASM và chạy cùng đoạn mã như ứng dụng native
- Không có phụ thuộc runtime, gồm gói WASM khoảng 400KB
- Ban đầu được tạo cho Mux (ứng dụng desktop dành cho phát triển song song cách ly), nhưng có thể dùng trong nhiều môi trường khác nhau
Demo và chạy thử
So sánh với xterm.js
- xterm.js được dùng trong nhiều môi trường như VS Code, Hyper, nhưng vẫn có vấn đề render và thiếu hỗ trợ một số tính năng
- Xuất hiện lỗi render khi xử lý script phức tạp (Devanagari, tiếng Ả Rập, v.v.)
- Không hỗ trợ chuỗi XTPUSHSGR/XTPOPSGR
- ghostty-web giải quyết các vấn đề trên và cung cấp xử lý grapheme chính xác cùng hỗ trợ đầy đủ các chuỗi
- Trong khi xterm.js tái triển khai toàn bộ mô phỏng bằng JavaScript, ghostty-web sử dụng nguyên vẹn mã Ghostty native đã được kiểm chứng
Cài đặt và cách dùng
- Lệnh cài đặt
npm install ghostty-web
- Có thể sử dụng với cùng API như xterm.js
import { init, Terminal } from 'ghostty-web';
await init();
const term = new Terminal({ fontSize: 14, theme: { background: '#1a1b26', foreground: '#a9b1d6' } });
term.open(document.getElementById('terminal'));
term.onData((data) => websocket.send(data));
websocket.onmessage = (e) => term.write(e.data);
- Xem demo/index.html để tham khảo ví dụ giao tiếp client–server
Phát triển và build
- Build từ mã nguồn Ghostty, kèm bản vá (
ghostty-wasm-api.patch) để phơi bày thêm tính năng
- Cần có Zig và Bun
bun run build
- Nhờ
libghostty đang được tác giả Ghostty là Mitchell Hashimoto phát triển, quy mô bản vá nhỏ
- Trong tương lai, dự án dự kiến dựa trên bản phân phối Ghostty WASM chính thức, đồng thời duy trì API tương thích xterm.js
- Dự án được phát triển bởi nhóm Coder như một sự ủng hộ dành cho Ghostty
Giấy phép
2 bình luận
Phát hành Ghostty 1.0 - trình giả lập terminal tốc độ cao, đa nền tảng
libghostty sắp ra mắt
Tình hình trình giả lập terminal năm 2025: những nhà vô địch lang bạt
Ý kiến trên Hacker News
Bản vá rất hữu ích nên tôi có thể thấy rõ phần nào mình nên hỗ trợ
Hiện tại hiệu năng có lẽ chưa tốt hơn xterm, vì cách xử lý viewport trông hơi tốn kém
Không biết bạn đã thử benchmark chưa
Có lẽ nên dùng RenderState API mới. Hiện tại đang lấy dữ liệu theo từng hàng, cách này chậm. RenderState API hỗ trợ render delta hiệu năng cao dựa trên trạng thái
Trình render GPU thực tế cũng chạy trên API này. Nó tương thích với mọi renderer
Ngay cả ở giai đoạn đầu này tôi cũng tò mò về so sánh hiệu năng với xterm.js. Làm rất tốt
Về lâu dài tôi hy vọng nó sẽ trở thành một giải pháp thay thế drop-in cho xterm.js
Tôi sẽ sớm chuyển sang RenderState API và chia sẻ benchmark
Tôi cũng bất ngờ vì việc triển khai dễ hơn mình nghĩ
Tôi dùng nó để triển khai các tính năng kiểu TMUX trong opentui
Tôi dự định xử lý render ANSI bên trong opencode
Liên kết dự án ghostty-opentui
Ghostty rốt cuộc cũng chỉ là một trình giả lập được viết bằng ngôn ngữ khác thôi mà? Cảm giác hơi cường điệu
Chỉ là có cái có mức độ tương thích với đặc tả VT cao hơn mà thôi
Nó hoạt động khá tốt
Liên kết dự án hot-notes
cowsay hello)Liên kết demo
Nếu muốn chạy cục bộ thì làm như sau Có thể xem mã nguồn tại webassembly.sh. Việc chuyển từ xterm sang ghostty-web diễn ra khá mượt
cowsay hellohaylskhông in ra gì cảDù phần lõi được viết bằng một ngôn ngữ khá độc đáo, nó vẫn hoạt động ổn định như một ứng dụng Mac. Thiết kế cũng rất đẹp
Khi người dùng kết nối lại vào phiên, tôi dùng ghostty để render trạng thái terminal và đầu ra
Về cơ bản nó là một tmux-lite chỉ khoảng 1k LoC
Liên kết dự án zmx
Hiện tại tôi đang làm phiên bản của riêng mình chạy bên trong Unreal Engine 5
Bộ ảnh chụp màn hình
Code cùng Claude ngay trong tab UE5 Editor khá thú vị. Qua Remote Control API còn có thể điều khiển avatar, chụp màn hình, v.v. Rất hữu ích khi debug game 3D
Claude cũng có thể tạo shader Hyperspace GLSL, nhưng lại không căn đúng được header của bảng trong ảnh chụp màn hình
Nếu thêm webassembly.sh thì có vẻ nó sẽ trở thành một môi trường shell hoàn chỉnh có thể cài cả package ngay trong trình duyệt
Hiện tại mới chỉ chạy được từ dòng lệnh nên UX còn hơi đáng tiếc