一、TUI 为什么突然火了?
TUI 近两年的火,不是简单的"复古",而是一场由开发者"用脚投票"引发的理性回归。现代图形界面(尤其是 Electron 类应用)在性能、交互一致性、认知负担上的问题集中爆发,让开发者开始重新审视终端那块黑窗口的价值。
| 维度 | 传统 GUI(Electron 应用) | 现代 TUI | 为什么 TUI 赢了? |
|---|---|---|---|
| 资源占用 | 内存几百 MB,启动缓慢 | 通常 <50MB,毫秒级启动 | 开发者苦"卡顿"久矣,对轻盈的渴望压倒华丽特效 |
| 交互效率 | 鼠标主导,操作路径长 | 键盘驱动,双手不离主键盘区 | 对程序员而言,键盘效率远高于鼠标 |
| 界面一致性 | 各自为政,快捷键混乱 | 遵循 Vim/Emacs 经典范式 | 学习一次,随处可用,降低认知负荷 |
| 远程开发 | X11 转发或远程桌面,体验糟糕 | SSH 天生完美支持 | 云开发时代,终端操作远程服务器无可替代 |
| 视觉噪音 | 动画、渐变、阴影,信息过载 | 极简、纯粹,聚焦信息本身 | 专注场景下,"少即是多"成为共识 |
三大驱动力
1. 对"图形界面失控"的逃离
原生开发越来越复杂——Windows 上 WinForms → WPF → WinUI 更迭频繁,macOS 设计指南前后矛盾。跨平台的 Electron 成了权宜之计,却带来性能新问题。终端这个"最后的共识界面"重新进入开发者视野。
2. AI 引爆点
AI 编程工具的爆发成为 TUI 出圈关键催化剂。以 DeepSeek TUI 为代表的项目在 GitHub 迅速走红:命令行调用 AI 成本更低、过程更透明、支持超长上下文(百万 Token)。当最前沿的 AI 能力以最高效的方式在终端呈现,TUI 成了"生产力利器"而非"老古董"。
3. 框架生态成熟
两年前开发一个漂亮 TUI 应用并不容易,而现在成熟框架极大降低了门槛。更关键的是,2025–2026 年主流框架集体进入 v2 时代——Bubble Tea v2 重构了声明式 View 架构,Ratatui v0.30 支持 no_std 嵌入式场景,Textual 保持月级迭代节奏。生态基础设施已就位。
二、选型干货:主流框架全景对比
当前 TUI 框架四大阵营:
| 维度 | Bubble Tea (Go) | Ratatui (Rust) | Textual (Python) | Ink (JS/React) |
|---|---|---|---|---|
| GitHub Stars | 40.7k ⭐ | 19.1k ⭐ | 34.9k ⭐ | 35.6k ⭐ |
| 架构模式 | Elm 架构(MVU) | 即时模式(Immediate Mode) | 异步响应式 + CSS | React 组件化 |
| 渲染方式 | View() 返回 string |
每帧 draw() 全量重绘 |
即时模式 + diff | React Reconciler |
| 布局系统 | Lip Gloss(链式调用) | Constraint 约束布局 | CSS(.tcss 文件) | Yoga(Flexbox) |
| 内置组件 | 约 12 个(Bubbles 扩展) | 约 15 个 + 50+ 社区 crate | 60+ 组件 | 约 18 个(inkjs/ui) |
| 样式方案 | Lip Gloss | ratatui::style 模块 |
CSS 样式表 + 热重载 | React 内联样式 |
| 鼠标支持 | ✅ v2 原生 | ✅ 通过 crossterm | ✅ 一等公民 | ✅ 通过 ink-mouse |
| 图片渲染 | ✅ go-termimg(Sixel/Kitty/iTerm2) | ✅ ratatui-image(Sixel/Kitty/iTerm2/Halfblock) | ✅ textual-image(TGP/Sixel/Unicode) | 有限 |
| SSH 服务 | ✅ Wish 库 | ❌ | ✅ textual serve | ❌ |
| Web 运行 | ❌ | ✅ ratzilla(WASM) | ✅ textual serve(无需改代码) | ✅ 浏览器 CLI |
| 嵌入式 (no_std) | ❌ | ✅ v0.30+ | ❌ | ❌ |
| 启动耗时 | ~30ms | <10ms | ~250ms | ~200ms |
| 内存占用 | ~45MB | ~12MB | ~120MB | ~100MB+ |
| 二进制体积 | ~8MB | ~2.5MB | N/A(需 Python 运行时) | N/A(需 Node) |
数据来源: GitHub Stars、各框架官方文档、社区报告(2026 年 6 月)
各语言更多选择
Go 生态:
-
tview(13.7k ⭐)—— 命令式部件库,K9s 和 gh CLI 使用,实战验证充分
Rust 生态:
-
Cursive —— 声明式 ncurses 风格,适合表单类应用
-
FTXUI(9.8k ⭐)—— C++ 零依赖,支持 WASM 和像素级 Canvas
Python 生态:
-
Rich —— Textual 底层库,纯渲染不做交互
-
Urwid —— 老牌 TUI 库,回调风格
JS/TS 生态:
-
OpenTUI(9.4k ⭐)—— TS + Zig 后端,支持 React/SolidJS/Vue 三种 reconciler
-
Blessed —— 经典但已停维,不推荐新项目使用
三、场景化选型指南
🅰 语言已限定,怎么选?
| 如果你在用 | 首选框架 | 理由 |
|---|---|---|
| Go | Bubble Tea + Lip Gloss + Bubbles | 生态最完整(40k ⭐),Elm 架构清晰,Charm 生态开箱即用 |
| Rust | Ratatui | 性能极致,社区 crate 丰富,Netflix/OpenAI/AWS 都在用 |
| Python | Textual | 60+ 组件,CSS 样式,textual serve 一键转 Web,开发效率最高 |
| JavaScript/TypeScript | Ink | React 生态复用,Claude Code / Gemini CLI 都基于它构建 |
| C++ | FTXUI | 零依赖,功能完备,支持 Canvas 像素绘制 |
| C# (.NET) | Terminal.Gui | 40+ 组件,Swing 风格 API,v2 刚重大重写,.NET 生态首选 |
🅱 需要鼠标交互 + 图片粘贴/显示,怎么选?
核心需求: 鼠标点击、滚轮、拖拽 + 终端内显示图片(Sixel / Kitty 协议)+ 粘贴图片
推荐排名:
-
Textual(Python)⭐⭐⭐⭐⭐
-
鼠标是第一等支持,@on 装饰器即可绑定点击事件
-
textual-image库支持 Kitty TGP、Sixel、Unicode 三套渲染方案,自动检测终端 -
图片缩放、裁剪、对齐开箱即用
-
注意: Sixel 渲染性能一般,频繁刷新会闪烁,适合静态图片展示
-
开发者体验最好,适合原型快速落地
-
-
Ratatui(Rust)⭐⭐⭐⭐
-
ratatui-image支持 Sixel/Kitty/iTerm2/Halfblock 四种协议 -
通过 crossterm 捕获鼠标事件
-
StatefulImage支持 fit/crop/scale 三种自适应模式 -
性能最强,图片刷新无闪烁
-
代价: 需要自己管理事件循环,编码量较大
-
-
Bubble Tea(Go)⭐⭐⭐⭐
-
v2 原生支持鼠标
-
go-termimg支持 Kitty/Sixel/iTerm2 + Halfblock 回退 -
设置简单,几行代码即可在 View() 中插入图片
-
Charm 生态颜值最高,适合面向用户的产品
-
关键指南: 图片显示依赖终端模拟器支持。部署前务必确认目标用户的终端兼容性:
| 终端 | Sixel | Kitty 协议 | iTerm2 协议 |
|---|---|---|---|
| Kitty | ❌ | ✅ | ❌ |
| Xterm | ✅(需 -ti vt340) |
❌ | ❌ |
| WezTerm | ✅ | ✅ | ✅(最稳定) |
| iTerm2 (Mac) | ✅ Beta | ❌ | ✅ |
| Windows Terminal | ✅ | ❌ | ❌ |
| VS Code 终端 | ✅ | ❌ | ❌ |
| Alacritty | ❌(有 fork) | ❌ | ❌ |
备选方案: Halfblock(Unicode 半块字符 + 前景/背景色)在所有终端都可以工作,但分辨率较低。适合作为"兜底"方案。
🅲 需要读取/播放视频,怎么选?
这是一个小众但增长的需求。 终端播放视频本质上是逐帧提取 → 转换为 Sixel/Kitty 协议 → 送往终端渲染。
| 方案 | 原理 | 推荐度 |
|---|---|---|
| sakura(独立工具) | 使用 ffmpeg 解码 + libsixel 渲染,支持 GIF/MP4/MKV | ⭐⭐⭐⭐⭐ 拿来即用 |
| Ratatui + ffmpeg 子进程 | 通过 Ratatui 画 Canvas,ffmpeg 输出帧到管道 | ⭐⭐⭐⭐ 深度集成但编码量大 |
| Bubble Tea + ffmpeg | 在 Cmd 中异步 ffmpeg 解码,View 渲染 | ⭐⭐⭐ 适合轻量场景 |
实操建议:
-
如果目标是轮子而不是造轮子,直接集成
sakura或ffmpeg + libsixel作为子进程调用 -
如果要在 TUI 框架内实现视频预览,推荐 Ratatui——它的 Canvas 组件支持低层像素绘制,配合
ratatui-image协议,可以做到逐帧刷新 -
视频播放对终端性能要求极高,建议加上帧率限制(15–24fps)和音频同步机制
-
重要: 绝大多数终端模拟器无法流畅播放视频,部署前必须圈定终端类型(Kitty / WezTerm / Xterm vt340)
四、最终推荐方案
最流行(Follow the Crowd)
| 你的语言 | 推荐框架 | 理由 |
|---|---|---|
| Go | Bubble Tea | 40.7k ⭐,Charm 生态一统江湖,开发者体验最佳 |
| Python | Textual | 34.9k ⭐,组件最丰富,CSS 给 Web 开发者零门槛 |
| Rust | Ratatui | 19.1k ⭐,行业巨头背书,性能天花板 |
| JS/TS | Ink | 35.6k ⭐,React 生态复用,大厂背书 |
| C# (.NET) | Terminal.Gui | 10.8k ⭐,40+ 组件,v2 重大重写,.NET 开发者首选 |
最合适(Pick the Right Tool)
| 你的场景 | 最佳选择 | 备选 |
|---|---|---|
| 快速原型 / 企业内部工具 | Textual(Python)CSS + 60+ 组件,当天出活 | Bubble Tea |
| 高性能监控面板 / 实时数据流 | Ratatui(Rust)<10ms 启动,12MB 内存 | FTXUI (C++) |
| 面向用户的 CLI 工具 | Bubble Tea(Go)颜值最高,单二进制分发 | Textual Serve |
| 嵌入式 / IoT / 资源受限 | Ratatui no_std | FTXUI |
| 既有 React 代码库 / 前端团队 | Ink(React)或 OpenTUI(TS) | — |
| 需要 SSH 远程使用 | Bubble Tea + Wish 或 Textual Serve | — |
| 需鼠标 + 图片交互 | Textual > Ratatui > Bubble Tea | 参见上节 |
| 需视频播放 | Ratatui + ffmpeg 或独立工具 sakura | — |
一句话总结
快糙猛选 Textual,严肃高性能选 Ratatui,颜值控选 Bubble Tea,前端转过来的选 Ink。
没有银弹。选型三角:团队语言栈 → 性能要求 → 交互复杂度,按这个顺序排除,答案自然浮现。
五、主流 AI TUI 应用选型一览
AI 编程助手的爆发是 TUI 复兴的最大催化剂。来看看主流 AI TUI 应用都用了什么框架、以及为什么这么选:
| 应用 | 所属 | 框架 | 语言 | 体积 | 启动响应 | 选型亮点 |
|---|---|---|---|---|---|---|
| Claude Code | Anthropic | Ink(深度魔改) | TypeScript / Node.js | 200–400MB | 启动 2–5s,渲染 60fps | React 生态 + 140+ 组件,自定义渲染引擎(类型数组 + 双缓冲 + 对象池) |
| OpenCode | 社区(anomalyco) | OpenTUI(自研) | TypeScript + Zig 核心 | ~50MB | 毫秒级启动 | Zig 原生核心 + SolidJS 响应式;多线程架构(UI Worker 分离);C ABI 跨语言调用;OSC52 剪贴板原生集成 |
| Crush | Charm | Bubble Tea | Go | 单 ~10MB | 毫秒级启动 | 全 Charm 生态(Lip Gloss / Bubbles / Glamour),颜值最高;支持多模型切换;跨平台最广(含 Android) |
| Codex CLI | OpenAI | Ink(React) | TypeScript / Node.js | ~200MB+ | 启动 2–5s | 沿袭 Ink 路线,与 Claude Code 架构思路相似 |
| Gemini CLI | Ink(React) | TypeScript / Node.js | ~200MB+ | 启动 2–5s | 同样基于 Ink,Google 内部 CLI 工具家族统一技术栈 | |
| Claude Code Rust(社区) | srothgan | Ratatui | Rust | 单 ~3MB | <100ms 启动,内存 20–50MB | 替换官方 Node 版,内存降至 1/10;Tokio 异步事件循环;语法高亮 + 虚拟滚动聊天历史 |
| GitHub Copilot CLI | GitHub | Ink(React) | TypeScript / Node.js | ~200MB+ | 启动 2–5s | 微软/.NET 系但 CLI 层仍选 Ink,React 终端渲染事实标准 |
关键趋势
-
Ink(React)是 AI TUI 的默认起点——Claude Code、Codex、Gemini CLI、Copilot CLI 都在用。React 组件化 + 声明式渲染的优势在复杂 TUI(140+ 组件)中无可替代。
-
但性能瓶颈驱动了分化——Claude Code 不得不深度魔改 Ink 渲染引擎(自写类型数组双缓冲),社区甚至直接用 Ratatui 重写了 Claude Code Rust 版,内存降为 1/10、启动快 50 倍。
-
原生语言正在反攻——OpenTUI(Zig)和 Crush(Go)证明,编译型语言 + TUI 框架可以提供接近 GUI 的体验,同时保持终端原生性能。
-
"性能"不是唯一维度——Crush 靠 Charm 生态的"颜值"出圈,说明在 AI TUI 领域,开发体验和视觉品质同样重要。
-
