一个 Go 的 Web 组件库,首页第一屏不是 import 语句,是三条命令:go install、gsxui init、gsxui add button。敲完最后一条,按钮组件的源码直接摊在你自己的项目文件夹里。不是从依赖仓库拉下来的黑盒包,是一份你随手就能改的 Go 代码。
这套打法有名字,叫 shadcn 风格,原本是 React 圈子里的发明,这次被搬进了 Go 的服务端渲染世界。主角是 gsxui,给 gsx 框架配了一整套按钮、表单、对话框、菜单、表格。它要解决的问题很具体:Go 团队想要现代一点的界面组件,又不想为此引入 React 或 Node 工具链。能不能成,取决于一件事——复制来的代码,以后谁维护。
速读:三条命令,装进项目的是代码
gsxui 的自我定位就四个词:copy-in(复制进项目,不是依赖包)、type-checked(走 Go 静态类型检查)、server-rendered(服务端直接渲染出 HTML)、Tailwind(样式全靠 Tailwind 定制)。
装法很直白。go install 装好 CLI,gsxui init 初始化项目,之后想要哪个组件就 gsxui add 哪个,不是整包全装。官网列出的组件有 48 个,从按钮、徽章、卡片这类基础件,到对话框、抽屉、下拉菜单、命令面板、数据表格,常见界面元素基本覆盖了一遍。
“shadcn 风格”是 gsxui 自己的说法,跟 shadcn/ui 官方没有从属或认证关系,只是沿用了同一套设计思路。官网演示里,Dialog 组件特别注明靠原生 <dialog> 元素渲染,不需要客户端框架。这句话官网只对 Dialog 这一个组件这么讲,其余 47 个组件是不是都能做到零 JS,官网没有逐一交代。
决定权在你手里,账本官网没写全
三条命令能看懂产品长什么样,看不出它是不是一个能放心接进生产环境的选择。以下几项,官网首页目前都没有说清楚:
| 决策维度 | 目前能看到的信息 |
|---|---|
| 开源协议 | 官网页面未标注,需要自己去仓库查 |
| 版本号 / 更新频率 | 官网没有展示,无法判断项目是否活跃 |
| 升级机制 | 复制进项目后不会自动同步,新版本要靠自己比对合并 |
| 组件 JavaScript 依赖 | 只有 Dialog 注明用原生 <dialog>,其余组件未逐一说明 |
| 浏览器 / 无障碍测试 | 官网未提供测试报告或兼容性说明 |
| 生产案例 | 目前公开信息里看不到规模化落地案例 |
这些空白不代表 gsxui 有问题,只说明它还在早期阶段。想认真评估的团队,得自己去翻仓库的 commit 记录和 issue 列表,官网给不了答案。
锐评:复制来的自由,账单在后面
真正要判断的不是“Go 有没有 UI 组件库”这种表面问题,而是 shadcn 那套“复制代码、自己负责”的逻辑,搬到 Go 的服务端渲染场景里划不划算。
shadcn/ui 当年能火,是因为反着 npm 的逻辑来:不装包,给你可读、可改的源码,你拥有它,不必等上游发新版本。这套打法在前端圈子讨巧,是因为 React 生态本来就习惯了各种脚手架生成代码。放进 Go,情况不完全一样。
Go 社区自己有 vendor 的老传统,把依赖复制进项目、自己管理不是新鲜事。gsxui 的 copy-in 谈不上突兀移植,倒像是跟 Go 工程师的老直觉搭上了。但 vendor 针对的是很少改动的第三方库,组件 UI 代码却是要天天改的东西。这层区别不能含糊过去。
授人以鱼,通常用来夸“教方法比给答案强”。gsxui 反过来做:直接把鱼——组件源码——扔给你,怎么钓明天的鱼,教程里没写。
类型检查解决的是这段 Go 代码编译对不对,解决不了下拉菜单在 Safari 上炸不炸、屏幕阅读器读不读得出这个按钮。代码复制进项目那一刻,组件的交互正确性、浏览器兼容、可访问性,很大程度上从官方的问题变成了你自己的问题。
对谁合适、对谁不合适,可以划条线。已经用 Go 做全栈、不想碰 Node 工具链的团队,可以先挑几个非核心页面的组件试用,边用边看维护成本再决定要不要扩大范围。需要成熟无障碍认证、或者产品交互本来就复杂的团队,现阶段更适合观望,或者继续用经过大规模验证的现成方案。
三条命令装完,项目里多的不是一个依赖,是一份要长期维护的家产。谁真心愿意签下这份账单,谁才该用 gsxui。
