当前位置: 首页 > news >正文

Bubble Tea:用 Go 写终端 UI,这事没那么难

文章目录

  • Bubble Tea:用 Go 写终端 UI,这事没那么难
    • Elm 架构在终端里的落地
    • 周边生态
    • 谁在用
    • 安装和快速上手

Bubble Tea:用 Go 写终端 UI,这事没那么难

Bubble Tea 在 GitHub 上拿了 43,400 Star。

charmbracelet 团队出的这个 Go 框架,专门用来写终端应用。它基于 Elm 架构,把终端程序拆成 Model、Update、View 三层,写起来清晰,维护起来也省事。

Elm 架构在终端里的落地

Elm 架构的核心思路是把应用分成三块:Model 管状态,Update 处理消息,View 负责渲染。Bubble Tea 把这套搬到了终端环境里。

写一个终端程序,定义一个 struct 当 Model,然后实现三个方法就行。Init 返回初始命令,Update 收到键盘输入或系统消息后更新状态,View 根据当前状态输出界面。三个方法各管各的,不会互相干扰。

框架把终端渲染、事件循环这些脏活都包了。内置的渲染器是基于单元格的,性能不错,还自带颜色降采样。键盘和鼠标事件处理也是原生的,剪贴板操作同样内置。开发者只需要管业务逻辑。

行内模式和全屏模式都支持,也能混着用。写个简单的命令行工具用行内模式,写个复杂的交互式应用切全屏,不用换框架。

周边生态

Bubble Tea 不是一个人在战斗。

Bubbles 是配套的组件库,文本输入框、列表、表格、进度条这些常见 UI 组件都有现成的,不用自己从头写。Lip Gloss 管样式和布局,终端里的排版问题它来解决。Harmonica 是动画库,做平滑过渡效果用的。BubbleZone 处理鼠标事件的区域追踪,鼠标点哪响应哪。

这几个库组合起来,写终端 UI 的体验跟写 Web 前端有点像,组件化、样式分离、状态管理一套流程。

谁在用

Bubble Tea 的 dependents 页面显示有超过 18,000 个应用在用它。

大厂也没少用。微软 Azure 的 Aztify 把 Azure 资源导入 Terraform,AWS 的 eks-node-viewer 可视化 EKS 集群节点使用情况,NVIDIA 的 container-canary 做容器验证,CockroachDB 的命令行工具也是用它写的。

社区项目里,chezmoi 管多台机器的 dotfiles,circumflex 在终端里读 Hacker News,gh-dash 是 GitHub CLI 的扩展,Superfile 是个文件管理器。还有 Glow 读 Markdown,Huh? 做交互式表单,Wishlist 当 SSH 跳板机。

覆盖的场景很广,从 DevOps 工具到日常小工具都有。

安装和快速上手

go get charm.land/bubbletea/v2

一个最简单的程序,Model 是个 struct,Init 返回 nil,Update 处理按键,View 输出文本:

typemodelstruct{choices[]stringcursorintselectedmap[int]struct{}}func(m model)Init()tea.Cmd{returnnil}func(m model)Update(msg tea.Msg)(tea.Model,tea.Cmd){switchmsg:=msg.(type){casetea.KeyPressMsg:switchmsg.String(){case"ctrl+c","q":returnm,tea.Quitcase"up","k":ifm.cursor>0{m.cursor--}case"down","j":ifm.cursor<len(m.choices)-1{m.cursor++}}}returnm,nil}func(m model)View()tea.View{s:="What should we buy?\n\n"fori,choice:=rangem.choices{cursor:=" "ifm.cursor==i{cursor=">"}checked:=" "if_,ok:=m.selected[i];ok{checked="x"}s+=fmt.Sprintf("%s [%s] %s\n",cursor,checked,choice)}returntea.NewView(s)}funcmain(){p:=tea.NewProgram(initialModel())if_,err:=p.Run();err!=nil{fmt.Println(err)os.Exit(1)}}

跑起来就是一个带光标移动和选择的列表。加上 Bubbles 组件库,能做出更复杂的界面。

调试的时候 stdout 被 TUI 占着,可以用tea.LogToFile写日志文件,Delve 调试器要开 headless 模式。这些细节官方文档里都有。

如果你在用 Go 写命令行工具,Bubble Tea 值得试试。43,000 多个 Star 不是白来的。

oFile` 写日志文件,Delve 调试器要开 headless 模式。这些细节官方文档里都有。

如果你在用 Go 写命令行工具,Bubble Tea 值得试试。43,000 多个 Star 不是白来的。

http://www.jsqmd.com/news/1099779/

相关文章:

  • GPT-5.6全面公开与Cerebras 750 t/s上线:从受限预览到开发者普惠
  • 第9篇:《AMS1117输出振荡排查:输出电容用陶瓷替代钽电容的稳定性问题》
  • MiniMax Code Plan 限时 9 折!分享我的订阅体验和优惠领取方式
  • 孟获MengHuo——一站式智能直播信息采集分析工具
  • 泰戈尔的诗歌
  • 【毕业设计】基于 SpringBoot 的动漫游戏周边线上交易服务系统的设计与实现 基于 SpringBoot 的游戏手办周边销售管理系统(源码+文档+远程调试,全bao定制等)
  • ChatGPT Pro 200美元付款失败怎么办?国内用户没有海外卡怎么开通更稳妥
  • 第十章 结构体与共用体 结构体仿真测试
  • 计算机Java毕设实战-基于 SpringBoot 的高校心理咨询服务管理系统的设计与实现 基于 SpringBoot 的学生心理健康档案管理系【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 开源多Agent投资研究框架ai-berkshire:从架构到部署实战
  • AIGC 应用上线前安全能力清单:模型、内容、账号、业务与合规
  • 强强联手赴慕展!中国星坤 × 立创商城,一站式解锁互连方案 + 全链条研发采购
  • 计算机毕业设计之二手书回收平台设计与实现
  • Web渗透测试课程学习心得:零基础入门Web安全攻防实战总结
  • 覆盖 190 国、400 品牌:中国 TV OS 如何撬开全球智慧家庭市场
  • Python学习笔记·第25天:Pandas高级技巧——用最通俗的话讲懂重采样、多索引和数据合并
  • Java毕设选题推荐:基于 SpringBoot 的潮流游戏周边网购交易平台的设计与实现 基于 SpringBoot 的游戏周边商品订单管理系统【附源码、mysql、文档、调试+代码讲解+全bao等】
  • VSCode Remote SSH 中 Codex 连接超时的排查与解决记录
  • 一句指令完成电脑操作!腾讯的AI助手Marvis让我电脑会干活了:改设置、查文件、整理文档
  • 请问微信小程序域名迁移有懂行的吗?有偿咨询
  • ChatGPTPlus和Pro怎么选?普通用户别再乱花钱了
  • SeaweedFS:33000 Star 的分布式文件系统,小文件读写做到了极致
  • Java毕设项目:基于 SpringBoot 的高校心理健康普查管理系统的设计与实现 基于 SpringBoot 的学生心理测评统计分析系统 (源码+文档,讲解、调试运行,定制等)
  • Java计算机毕设之基于 SpringBoot 的二次元潮玩交易商城管理系统的设计与实现 基于 SpringBoot 的游戏周边二手交易流转系统(完整前后端代码+说明文档+LW,调试定制等)
  • SpringDoc OpenAPI 配置
  • ESP32实验教程:三位按键输入译码控制8路输出(替代74HC138逻辑)
  • python: Fail-Fast Pattern
  • AI优化mRNA翻译效率:从密码子优化到深度学习驱动的序列设计
  • AI工具集
  • 【计算机毕业设计案例】基于 SpringBoot 的高校外卖配送调度监控系统的设计与实现 基于 SpringBoot 的校园餐饮消费配送管理系统(程序+文档+讲解+定制)