# 更新日志 (/docs/changelog)
## 2026-06-10 [#2026-06-10]
* 解除速率限制,全面放开,不再限制查询参数访问
## 2026-06-04 [#2026-06-04]
* 凭据仅支持通过链接配置,不再提供手动输入
* 已配置的凭据只能删除,无法修改
* 移除文档页内的 GitHub 入口
## 2026-06-03 [#2026-06-03]
### MCP 工具更新 [#mcp-工具更新]
* 上游 MCP 从 Pro-only 4 工具升级为 Pro + OSS 统一 9 工具,详见 [Local MCP — 工具更新](/docs/ai-tools/mcp#2026-06-03-工具更新)
## 2026-06-02 [#2026-06-02]
### 修复 MCP 文档链接 [#修复-mcp-文档链接]
* 修复首页和 Skills 页中指向 `/docs/ai-tools/mcp/local` 的错误链接,改为正确路径 `/docs/ai-tools/mcp`
## 2026-06-01 [#2026-06-01]
### 安装命令支持多包管理器 [#安装命令支持多包管理器]
* `hpsetup` 安装命令现在以 Tabs 形式展示 npm / pnpm / bun / yarn 四种包管理器的等效命令
## 2026-05-31 [#2026-05-31]
### 用户反馈系统上线 [#用户反馈系统上线]
* 新增页级反馈:文档底部 Good/Bad 评分,支持文字反馈
* 新增块级反馈:选中文字后弹出反馈框,精确定位到具体段落
* 反馈内容通过 Resend 实时发送至邮箱
### 文档更新时间显示 [#文档更新时间显示]
* 所有文档页面底部显示最后更新日期(基于 frontmatter `date` 字段)
### LLM 文档入口 [#llm-文档入口]
* 侧边栏图标栏新增 llms.txt 和 llms-full.txt 快捷入口,方便 AI 工具直接抓取文档
* hover 显示 tooltip 说明(索引 / 完整文档)
### 凭据状态指示器 [#凭据状态指示器]
* 侧边栏图标栏新增凭据状态圆点,实时反映 personal token 配置状态
* 已配置时显示绿色呼吸灯动画,hover 显示凭据详情和清除按钮
* 未配置时显示灰色圆点,点击跳转到凭据配置区域
### 凭据配置组件优化 [#凭据配置组件优化]
* 保存按钮移至头部右侧,回车快捷保存
* 已配置卡片显示 HP Key / Personal Token 独立状态 badge
* 支持一键删除凭据
## 2026-05-30 [#2026-05-30]
### TOC 样式升级 [#toc-样式升级]
* 目录(On this page)切换为 Clerk 风格,带树状连接线和高亮指示器
### Monorepo 文档上线 [#monorepo-文档上线]
* 新增 Default Monorepo 文档:单 Web 端 monorepo 安装指南(基于 Better T Stack)
* 原 Monorepo 文档拆分为 Default / Web + Native 两篇,侧边栏新增 Monorepo 分组
## 2026-05-22 [#2026-05-22]
### 站点清理 [#站点清理]
* 移除 Ask AI 浮窗功能
### hpsetup 用法页上线 [#hpsetup-用法页上线]
* 新增完整的 hpsetup 用法文档,覆盖 CI、Vercel、Monorepo 等场景
* 安装命令统一为 npx,组件支持动态 key 注入
* hpsetup 文档链接更新至新路径
### hpsetup 文档优化 [#hpsetup-文档优化]
* 新增「工作原理」页,详解安装流程与模块职责
* 命令行参数独立成页,方便查阅
### 私有仓库重构 [#私有仓库重构]
* 组件源码仓库从 hp-components 重命名为 hp-component-docs
* 组件文档改用 md 格式替代纯 tsx 代码
### 重构 Web 快速开始文档 [#重构-web-快速开始文档]
* 新增「一步到位」模板克隆方式,克隆即可用
* 手动安装拆分为项目准备、安装 HeroUI Pro、引入 demo 组件三个子章节
* 包管理器 tabs 全局联动,切换一次即可同步所有命令
* 新增常见问题:HeroUI CLI 选项说明、ERR\_PNPM\_IGNORED\_BUILDS 报错处理
## 2026-05-21 [#2026-05-21]
### 首页重写 & 凭据卡片升级 [#首页重写--凭据卡片升级]
* 首页改为 FAQ 式简介 + 分步引导,更易懂
* 凭据配置卡片视觉升级:绿色主题、ping 动画、圆角样式
### Skills 安装命令代码块修复 [#skills-安装命令代码块修复]
* 修复 Skills 安装命令丢失语法高亮和一键复制按钮的问题
## 2026-05-20 [#2026-05-20]
### Monorepo 文档补充初始化步骤 [#monorepo-文档补充初始化步骤]
* 新增"创建项目"步骤,使用 `pnpm create better-t-stack@latest` 初始化包含 Turborepo 的 monorepo 项目
* 新增"运行 hpsetup"小节,与原有"配置样式"部分衔接
* 添加站点公告 Banner,提示文档更新及近期迭代计划
### 侧边栏更新提示 [#侧边栏更新提示]
* 侧边栏新增 "New" 标记,提示有更新的文档页面
* 点击该页面后标记自动消失
* 点击后直接跳转到对应更新内容的子标题
## 2026-05-16 [#2026-05-16]
### 快速开始文档重构 [#快速开始文档重构]
* 新增"验证运行"步骤,安装依赖后先确认项目能正常启动
* 新增"初始化 Git"步骤(可选),安装 Pro 前提交基线版本
* "引入样式"和"使用组件"步骤按框架分栏展示(Next.js / Vite / Pages)
* 新增更多截图,直观展示安装和运行效果
### 凭据链接即时生效 [#凭据链接即时生效]
* 修复通过 URL 参数传入凭据后,配置卡片不会立即显示"已就绪"状态的问题
### 文档体验优化 [#文档体验优化]
* 命令示例按包管理器分栏展示(pnpm / Bun / npm),方便选择
* 增加提示信息卡片,提升可读性
* 不推荐使用 Yarn 的说明以醒目提示形式展示
# 简介 (/docs)
请认准 [CollectUI](https://e.tb.cn/h.RiZXMqfQxiJVXH3?tk=4i5Ng093BkD)(店铺同名)。非 CollectUI 店铺提供的 key/token 近期内将会被暂停或封禁。
抱歉,诸位。
由于个别买家照搬销售的缘故,紧急开启了**速率限制**,且颇为严格。
这里边,难免有误伤。尤其是**带参数访问、多 IP 使用、CI 部署**的时候。
抱歉,给大家添麻烦了。
以后非必要不会这么干的。就算这么干,也会**放宽一些**,尽可能不影响大家的正常使用。
另外,相关卖家已经下架了。所以之前加的限制也已**同步解除,全面放开**。
大家可以和亲友共享,也可以在团队内部使用,不设额外限制(本来也没打算限制)。
不过,仍然禁止在淘鱼照搬销售和大范围共享(**10 人以上**),系统保留了观察和限制的能力,可以应对,并快速采取措施。
## 这是什么? [#这是什么]
[heroui v3 pro](https://heroui.pro) 😎(或者叫 heroui pro v3 也成)。
当然,不是账密,也不共享官 key(官方有风控)。
不过有办法使用,体验和结果和官方基本一致。
## 和官方的有什么区别? [#和官方的有什么区别]
区别是:
* 没有账密
* 不能使用网页访问(镜像上线后可用)
* 不能使用 [pro theme builder](https://heroui.pro/dashboard/themes)(镜像上线后可用)
* 使用 [hpsetup cli](/docs/hpsetup/usage)(官方复刻)安装 pro 依赖而非 [heroui-pro cli](https://www.npmjs.com/package/heroui-pro)(官方)
* mcp、skills 走转发而非直连
## 是官网最新的吗? [#是官网最新的吗]
当然😎。
* [hpsetup](/docs/hpsetup/usage) 一运行,就会从 npm 获取官方包的最新版本,然后更新、应用到项目
* [hpmcp](/docs/ai-tools/mcp) 发出的请求,间隔一段时间就会直达上游,忽略缓存
## 完整吗? [#完整吗]
当然😎,服务端有授权,随时可以从官方获取。
## MCP 和 Skills 都能用吧? [#mcp-和-skills-都能用吧]
当然😎,看图:
## 永久可用吗? [#永久可用吗]
当然😎,所有的工具请求的资源都有全量备份(不断更新)。万一上游不可用,会自动 fallback,不至于服务中断。
## 永久更新吗? [#永久更新吗]
不,官方的套餐里边没有永久的选项,需要一年一续。
所以只能更新到套餐结束 —— 2027年5月1日。
## 遇到 Bug 咋办? [#遇到-bug-咋办]
随时滴滴,我都在的😎。
大部分时间都在,没在那可能是睡着了,通知铃声没吵醒我😂。
## 接下来做什么? [#接下来做什么]
### 配置凭据 [#配置凭据]
hpsetup 需要一个 hp key,mcp 和 skills 需要一个 personal token。两者不同,可以在下边统一配置,之后所有页面都会内嵌真实的 key/token,方便复制。
非 [CollectUI](https://e.tb.cn/h.RiZXMqfQxiJVXH3?tk=4i5Ng093BkD) 店铺购买的 key/token 无法通过链接设置,此类 key/token 可能随时暂停或吊销。
### 安装 Pro 依赖 [#安装-pro-依赖]
从 [hpsetup](/docs/hpsetup/usage) 开始,安装 pro 依赖(pro 组件和模板都需要这个)。
### 配置 AI 工具 [#配置-ai-工具]
配置 [mcp](/docs/ai-tools/mcp) 和 [skills](/docs/ai-tools/skills),用 AI 辅助开发。
# 速率限制 (/docs/rate-limit)
此限制主要针对在闲鱼等平台复制销售的卖家,正常用户使用不受影响(足够个人使用)。
原来没想对共享使用做任何限制,但最近在平台上发现完全照搬的商品,故不得不作此限制。
此限制在平台无照搬竞品时,适时撤销。
## 安装限制(hpsetup) [#安装限制hpsetup]
| 使用方式 | 每天配额 |
| ------------ | --------------- |
| 交互模式(本地开发) | **5 次**(同一设备无限) |
| CI 模式(自动化构建) | **20 次** |
同一版本的 Pro 依赖是固定的,官方 CLI 安装后会自动缓存到本地。下次安装同版本时直接用缓存,**不消耗配额**——所以在同一台设备上,装过一次就等于无限次。
配额每天零点(UTC)自动重置。超出配额后返回 429 错误。
`--no-cache` 强制绕过缓存从源站拉取,全局每天 **1 次**(所有用户共享),超出后返回 `Source fetch limit reached for today.`
***
## MCP 请求限制 [#mcp-请求限制]
每个 Token 每秒最多 **20 次**请求——正常写代码完全够用,相当于你每秒狂按 10 次键盘。
但如果像机器人一样不停请求(比如用脚本爬取),系统会自动踩刹车:
| 行为 | 后果 |
| ------------ | ------------ |
| 短时间疯狂请求被拦多次 | 暂停 **3 小时** |
| 长时间持续高频被拦多次 | 暂停 **6 小时** |
| 连续批量爬取不停 | 暂停 **12 小时** |
| 多人共用同一 Token | 暂停 **24 小时** |
暂停到期后违规记录不会清零,继续犯会更快被停。累计 **3 次**暂停 = 永久吊销。
***
## 汇总 [#汇总]
| 类型 | 配额 | 说明 |
| ------------ | ------------ | ------------------ |
| 交互模式安装 | 每天 **5 次** | 同一设备无限(用缓存) |
| CI 模式安装 | 每天 **20 次** | 无本地缓存,每次都计 |
| `--no-cache` | 全局每天 **1 次** | 所有用户共享 |
| MCP 请求 | 每秒 **20 次** | 正常开发绰绰有余,多人共用会触发暂停 |
| `--dry-run` | **无限制** | 不消耗任何配额 |
如有疑问,请联系 [CollectUI](https://e.tb.cn/h.RiZXMqfQxiJVXH3?tk=4i5Ng093BkD) 店铺客服(非 CollectUI 店铺购买不提供支持)。
# Local MCP (/docs/ai-tools/mcp)
> 本文由 GLM-5.1 驱动的 CC 基于项目源码生成。
`hpmcp` 是 HeroUI Pro MCP Server 的本地代理。自动缓存上游响应,离线时仍可使用。
***
## 2026-06-03 工具更新 [#2026-06-03-工具更新]
上游 MCP 已从 **Pro-only(4 个工具)** 升级为 **Pro + OSS 统一(9 个工具)**。`hpmcp` 会自动同步,无需更新配置。
### 新增工具(5 个) [#新增工具5-个]
| 工具 | 说明 |
| --------------------------- | -------------------------------------------------------- |
| `get_component_source_code` | 获取 OSS 组件的 React/TypeScript 源码(仅 `@heroui/react`,不含 Pro) |
| `get_chat_export_manifest` | 获取 HeroUI AI Chat 导出的文件清单(commitSha、文件列表、预览 URL) |
| `get_chat_export_files` | 根据 manifest 拉取指定的导出文件内容 |
| `get_theme_variables` | 获取主题变量和 design tokens(default、brutalism、glass、mouve) |
### 已有工具变化 [#已有工具变化]
| 工具 | 旧版 | 新版 |
| -------------------- | ---------------- | ------------------------------------------- |
| `list_components` | 仅列 Pro 组件 | Pro + OSS 统一列表(133 个) |
| `get_component_docs` | 固定 enum,仅 Pro | 自由 string 数组,Pro + OSS |
| `get_css` | 仅 Pro,含 theme 参数 | Pro + OSS,theme 参数独立到 `get_theme_variables` |
| `get_docs` | 20 个 Pro 文档路径 | 大幅扩充,新增 `/pro/docs/react/...` 及更多 OSS 路径 |
MCP 不再区分 Pro 和 OSS 两套服务 — 一份配置即可访问所有组件的文档、源码和主题变量。如果之前单独配置过 OSS MCP,可以移除。
# Agent Skills (/docs/ai-tools/skills)
> 本文由 GLM-5.1 驱动的 CC 参考官方文档生成。
HeroUI Pro 提供 **Skills(技能包)**,是教 AI 代理正确使用 Pro 组件的知识库。包含组件模式、API 约定和设计原则。
Skills 是缓存的知识,离线可用,代理启动时自动加载。与 [MCP](/docs/ai-tools/mcp) 实时数据配合使用效果最佳。
***
## 安装 [#安装]
`@heroui-pro/react` — 图表、高级表单、导航、浮层、数据展示,共 55 个组件。
`heroui-native-pro` — 日期选择器、步进器、进度按钮、滑动按钮、数字输入框,共 30 个组件。
`heroui-pro-design-taste` — 78 条设计原则,覆盖 10 个分类,适用于所有 HeroUI 包。
Skills 使用的是 **Personal Token**,不是 hpsetup 的 HP Key,两者是不同的认证体系,请勿混用。
***
## 支持的 AI 工具 [#支持的-ai-工具]
安装脚本会自动检测已安装的工具并安装到对应目录:
| AI 工具 | 安装路径 |
| -------------------- | -------------------------------------------- |
| Claude Code | `~/.claude/skills/{skill-name}/` |
| Cursor | `~/.cursor/skills/{skill-name}/` |
| Codex CLI | `~/.codex/skills/{skill-name}/` |
| OpenCode | `~/.config/opencode/skill/{skill-name}/` |
| Antigravity (Gemini) | `~/.gemini/antigravity/skills/{skill-name}/` |
如果没有检测到已安装的 AI 工具,脚本会输出下载链接。也可以设置 `HEROUI_PRO_SKILLS_DIR` 安装到自定义路径。
***
## 技能包详情 [#技能包详情]
### heroui-react-pro [#heroui-react-pro]
`@heroui-pro/react` 的复合组件模式、MCP 工具用法和 CSS 样式系统。
**覆盖范围:**
* 图表:AreaChart、BarChart、LineChart、PieChart、RadarChart、ComposedChart
* 数据展示:KPI、KPIGroup、TrendChip、NumberValue、Rating、EmptyState
* 表单:CellSelect、CellSwitch、CellSlider、InlineSelect、NativeSelect、NumberStepper
* 导航:Sidebar、FloatingToc、Stepper、Segment
* 浮层:Command、ContextMenu、HoverCard、Sheet
* 反馈:PressableFeedback、DropZone、EmojiPicker
* 布局:FileTree、Kanban、ItemCard
### heroui-native-pro [#heroui-native-pro]
`heroui-native-pro` 的复合组件模式、Uniwind 样式和 Reanimated 约定。
**覆盖范围:**
* 日期时间:DatePicker、DateRangePicker、RangeCalendar、Calendar
* 表单:NumberField、NumberStepper、RadioButtonGroup
* 按钮:ProgressButton、SlideButton、ToggleButton、SocialAuthButton、ToggleButtonGroup
* 导航:Stepper、Segment、SplitView
* 数据展示:NumberValue、Rating、ProgressBar、ProgressCircle、EmptyState、Badge
* 图表:AreaChart、BarChart、LineChart
### heroui-pro-design-taste [#heroui-pro-design-taste]
78 条设计原则,覆盖 10 个分类,适用于所有 HeroUI 包。
**分类:** 间距、排版、颜色、卡片、表单、按钮、图标、导航、布局、无障碍。
***
## 卸载 [#卸载]
删除对应目录即可:
```bash
rm -rf ~/.claude/skills/heroui-react-pro
rm -rf ~/.claude/skills/heroui-native-pro
rm -rf ~/.claude/skills/heroui-pro-design-taste
```
# 工作原理 (/docs/hpsetup/architecture)
> 本文由 GLM-5-turbo 驱动的 CC 根据项目源码生成
## 一句话总结 [#一句话总结]
hpsetup 通过 API Key 认证从 CDN 下载 HeroUI Pro 的闭源组件 tarball,解压到本地 `node_modules` 中已有的 stub 包内,再自动补齐 peer 依赖和包管理器信任配置。
## 安装全流程 [#安装全流程]
```
npx -y hpsetup@latest hp_xxxx
│
▼
┌─────────────┐
│ 1. 环境检测 │ 包管理器 · monorepo · 平台类型
└──────┬──────┘
▼
┌─────────────┐
│ 2. 产品发现 │ 扫描 node_modules · 识别已装版本
└──────┬──────┘
▼
┌─────────────┐
│ 3. 版本校验 │ npm registry 查最新 · 过期则升级
└──────┬──────┘
▼
┌─────────────┐
│ 4. 下载产物 │ CDN → 本地缓存 fallback
└──────┬──────┘
▼
┌─────────────┐
│ 5. 信任配置 │ pnpm allowBuilds · bun trustedDeps
└──────┬──────┘
▼
┌─────────────┐
│ 6. Peer 依赖 │ 扫描缺失 · 交互确认 · 分 workspace 安装
└──────┬──────┘
▼
┌─────────────┐
│ 7. 收尾 │ patch package.json · Vercel 配置
└─────────────┘
```
## 模块职责 [#模块职责]
解析 CLI 参数和环境变量,决定交互模式还是自动模式。
唯一的流程控制中心,串联以下所有模块。
扫描 node\_modules、识别 workspace 结构、检测平台类型(Web / Native)。
统一 npm / yarn / pnpm / bun 的 install 命令和 flag 差异。
查询 npm registry 最新版本,带递增超时重试(3s → 6s → 10s)。
从 CDN 拉取 tarball 并解压。失败时回退到本地缓存。
缓存目录 `~/.heroui/cache///`,同版本跳过下载。
扫描缺失的 peer 依赖,处理 Expo SDK 版本兼容映射。
pnpm `allowBuilds` / `onlyBuiltDependencies`,bun `trustedDependencies`。
修改 node\_modules 中 Pro 包的 package.json 导出路径。
自动在 vercel.json 中写入 installCommand。
产品定义、peer 依赖列表、Expo SDK 兼容表、CDN 地址。
## 关键机制详解 [#关键机制详解]
### Stub 包与真实产物 [#stub-包与真实产物]
npm 上的 HeroUI Pro 包是 **stub 包**——只包含一个 `postinstall` 脚本,不含真实组件代码。hpsetup 的工作就是:
. 用 `--ignore-scripts` 安装 stub 包(使 `node_modules/@heroui-pro/react` 目录存在)
. 从 CDN 下载包含真实组件代码的 tarball
. 解压到 stub 包目录中,覆盖空壳内容
hpsetup 通过检查产物目录中是否存在 `index.js` 或 `index.mjs` 来判断"是否已安装真实代码",而非仅看包是否存在。
### Monorepo 支持 [#monorepo-支持]
hpsetup 自动检测 workspace 结构(`package.json` 的 `workspaces` 字段、`pnpm-workspace.yaml`),并智能定位安装目标:
* **自动识别平台**:通过依赖和配置文件判断每个 workspace 是 Web 还是 Native 项目
* **精确安装**:React Pro 只装到 Web workspace,Native Pro 只装到 Native workspace
* **跳过共享库**:`packages/*` 路径下的纯库包不会被作为安装目标
* **分 workspace 安装 peer 依赖**:每个 workspace 独立扫描、独立安装
### 下载容错 [#下载容错]
```
CDN 下载 → 当前版本缓存 → 上一版本缓存 → 退出报错
```
三层 fallback 确保在网络波动或 CDN 不可用时仍能完成安装。
### 包管理器信任 [#包管理器信任]
HeroUI Pro 包含 postinstall 脚本,需要包管理器信任才能执行。hpsetup 自动处理:
| 包管理器 | 信任方式 |
| ----------------- | ------------------------------------------------ |
| pnpm(有 workspace) | `pnpm-workspace.yaml` 的 `allowBuilds` 字段 |
| pnpm(无 workspace) | `package.json` 的 `pnpm.onlyBuiltDependencies` 字段 |
| bun | `package.json` 的 `trustedDependencies` 字段 |
| npm / yarn | 无需额外配置 |
### Vercel 集成 [#vercel-集成]
当检测到 Next.js 项目时(存在 `next.config.*` 或 `vercel.json`),hpsetup 会提示在 `vercel.json` 中写入 `installCommand`,使 Vercel 构建时自动运行 hpsetup。同时将 `vercel.json` 加入 `.gitignore`,避免泄露 API Key。
### Expo SDK 兼容 [#expo-sdk-兼容]
安装 Native Pro 时,hpsetup 读取项目中的 Expo SDK 主版本号,自动将 peer 依赖版本映射到 Expo 兼容的固定版本:
| Expo SDK | `@shopify/react-native-skia` |
| -------- | ---------------------------- |
| 52 | 1.5.0 |
| 53 | 2.0.0-next.4 |
| 54 | 2.2.12 |
| 55 | 2.4.18 |
这些版本通过 `npx expo install` 逐个 SDK 测试确认兼容。
## 交互模式 vs 自动模式 [#交互模式-vs-自动模式]
| | 交互模式 | 自动模式(`--auto` 或 CI) |
| ------------ | ----------- | -------------------- |
| 触发条件 | TTY 终端 | `CI=true` 或 `--auto` |
| 产品选择 | 多选菜单 | 从 package.json 自动推断 |
| Workspace 选择 | 多选菜单 | 全部匹配的 workspace |
| Peer 依赖确认 | 多选菜单(可取消勾选) | 全部安装,无确认 |
| Vercel 配置 | 询问确认 | 直接写入 |
## 已知限制 [#已知限制]
* **不支持 Yarn Berry PnP**:需在 `.yarnrc.yml` 中添加 `nodeLinker: node-modules`,或使用其他包管理器
* **pnpm + Vite**:可能出现 `does not provide an export named 'jsx'` 错误,需在 `vite.config` 中添加 `optimizeDeps.include`
* **`--no-cache` 频率限制**:每日最多 1 次,超限返回 429
# 用法 (/docs/hpsetup/usage)
> 本文由 GLM-5-turbo 驱动的 CC 根据项目源码生成
## 前置条件 [#前置条件]
* **Node.js 18+**
* 任一包管理器:npm / pnpm / yarn / bun
* Yarn Berry PnP **不支持**,需切换为 `node-modules` linker
* 有效的 API Key(以 `hp_` 开头)
## 基本用法 [#基本用法]
首次运行进入交互模式,hpsetup 会引导你完成所有步骤——你只需要按提示操作。
### 一个完整示例 [#一个完整示例]
假设你的项目是一个使用 pnpm 的 Next.js 项目:
```bash
# 1. 运行 hpsetup
npx -y hpsetup@latest
# 2. 选择产品(多选菜单)
# ◉ HeroUI React Pro
# ○ HeroUI Native Pro
# 3. 检测已装包 → 查询最新版本 → 下载组件代码
# 4. 选择要安装的 peer 依赖(已全选,回车确认)
# ◉ @heroui/react
# ◉ @heroui/styles
# ◉ tailwindcss
# ...
# 5. 完成
# ✓ HeroUI React Pro v1.2.3 installed successfully.
```
之后每次运行,如果已是最新版本,hpsetup 会提示:
```
✓ HeroUI React Pro v1.2.3 — already on the latest version.
Nothing to do.
```
## 指定产品 [#指定产品]
只安装 Native Pro:
| 参数 | 产品 | 包名 |
| -------- | ----------------- | ------------------- |
| `react` | HeroUI React Pro | `@heroui-pro/react` |
| `native` | HeroUI Native Pro | `heroui-native-pro` |
不指定时进入交互式选择。
## 自动模式(CI / 脚本) [#自动模式ci--脚本]
在 CI 环境或脚本中运行时,不需要任何交互:
设置 `HEROUI_KEY` 环境变量后,hpsetup 自动跳过所有交互提示,从 `package.json` 推断要安装的产品。
### 也可用 `--auto` 手动触发 [#也可用---auto-手动触发]
CI 环境自带 `CI=true` 变量,hpsetup 会自动检测,无需额外传参。
## 常用选项 [#常用选项]
| 选项 | 作用 |
| ------------ | --------------------- |
| `--auto` | 跳过交互提示,自动检测并安装 |
| `--dry-run` | 只显示将执行的操作,不做任何更改 |
| `--no-cache` | 绕过缓存,强制从源站拉取(每日限 1 次) |
| `-h, --help` | 显示帮助信息 |
### 预览变更(dry-run) [#预览变更dry-run]
不确定 hpsetup 会做什么?先 dry-run:
输出类似:
```
[dry-run] Would install: @heroui-pro/react
[dry-run] Would download HeroUI React Pro v1.2.3 from CDN
[dry-run] Would install peers: @heroui/react@"^2.7.0", tailwindcss@"latest"
```
### 强制刷新缓存 [#强制刷新缓存]
绕过本地缓存和 CDN 缓存,直接从源站拉取最新包。
`--no-cache` 每天最多使用 1 次,超出会返回 429 错误。
## GitHub Actions [#github-actions]
将 API Key 存入仓库 Secrets,在 workflow 中使用:
```yaml
name: CI
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- run: npx -y hpsetup@latest
env:
HEROUI_KEY: ${{ secrets.HEROUI_KEY }}
```
## Vercel [#vercel]
### 首次运行时自动配置 [#首次运行时自动配置]
hpsetup 检测到 Next.js 项目后,会询问是否写入 `vercel.json`:
```
Write vercel.json with installCommand for Vercel CI? [Y/n]
```
确认后会:
. 在 `vercel.json` 中写入 `installCommand`
. 将 `vercel.json` 加入 `.gitignore`(防止泄露 API Key)
### 手动配置 [#手动配置]
在 Vercel 控制台中:
. **Settings → Build & Development Settings → Install Command** 填入:
```
npx -y hpsetup@latest
```
. **Environment Variables** 添加:
* Name: `HEROUI_KEY`
* Value: 你的 API Key
Vercel Build 环境自带 `CI=true`,hpsetup 会自动进入非交互模式。
## Monorepo [#monorepo]
hpsetup 自动识别 monorepo 结构(`workspaces` 字段或 `pnpm-workspace.yaml`),无需额外配置。
### 自动行为 [#自动行为]
* 扫描所有 workspace,识别每个 workspace 的平台类型(Web / Native)
* React Pro 只安装到 Web workspace,Native Pro 只安装到 Native workspace
* 跳过 `packages/*` 下的共享库
* Peer 依赖按 workspace 独立扫描、独立安装
### 交互模式下选择 workspace [#交互模式下选择-workspace]
当有多个匹配的 workspace 时,会出现多选菜单让你选择安装目标。
### 自动模式下 [#自动模式下]
所有匹配的 workspace 都会被安装,无需手动指定。
## 包管理器 [#包管理器]
hpsetup 自动检测当前项目使用的包管理器:
| 检测方式 | 优先级 |
| ---------------------------------------- | ----- |
| lockfile(`pnpm-lock.yaml`、`yarn.lock` 等) | 最高 |
| `package.json` 的 `packageManager` 字段 | 中 |
| `npm_config_user_agent` 环境变量 | 低 |
| 默认 | `npm` |
### 各包管理器的特殊处理 [#各包管理器的特殊处理]
**pnpm:**
* 自动将 Pro 包加入 `pnpm-workspace.yaml` 的 `allowBuilds`
* 如果有 pending build approvals,会提示运行 `pnpm approve-builds`
**bun:**
* 自动将 Pro 包加入 `package.json` 的 `trustedDependencies`
**npm:**
* 安装时自动附加 `--legacy-peer-deps`
**yarn:**
* 仅支持 Yarn Classic,不支持 PnP
## 本地缓存 [#本地缓存]
下载的组件代码缓存在 `~/.heroui/cache/` 目录下,按产品和版本组织:
```
~/.heroui/cache/
├── react/
│ ├── 1.0.0-beta.3/
│ └── 1.0.0-beta.4/
└── react-native/
└── 1.0.0-beta.4/
```
相同版本不会重复下载,直接从缓存恢复。
## 日常使用流程 [#日常使用流程]
### 安装 [#安装]
### 更新 [#更新]
再次运行同样的命令即可。hpsetup 会自动检测新版本并更新。
### CI / 构建 [#ci--构建]
在 CI 配置中使用 `HEROUI_KEY` 环境变量,每次构建自动拉取最新版本。
### 排查问题 [#排查问题]
使用 `--dry-run` 查看将执行的操作,或 `--no-cache` 强制重新下载。
## 常见问题 [#常见问题]
### pnpm + Vite 的 JSX 报错 [#pnpm--vite-的-jsx-报错]
`does not provide an export named 'jsx'`
这是 pnpm 严格依赖隔离的副作用。pnpm 通过符号链接组织 `node_modules`,Pro 组件的 JSX 转换依赖的 `react/jsx-runtime` 可能被解析到 Pro 包自带的副本,而非项目根目录的 React。Vite 的预构建(pre-bundling)不会自动处理这种路径差异,导致 JSX 导出找不到。
在 `vite.config.ts` 中手动声明依赖预构建,让 Vite 将它们打包到同一个模块中即可解决:
```ts
export default defineConfig({
optimizeDeps: {
include: ["react", "react/jsx-runtime", "@heroui-pro/react"],
},
})
```
# Default Monorepo (/docs/monorepo/default-monorepo)
> 本文由人工撰写(md),AI 优化(mdx)。
用 [Better T Stack](https://www.better-t-stack.dev/) 创建一个默认 monorepo([直达 Builder](https://better-t-stack.dev/stack?name=my-better-t-app\&fe-w=tanstack-router\&fe-n=none\&rt=bun\&be=hono\&api=trpc\&db=sqlite\&orm=drizzle\&dbs=none\&au=better-auth\&pay=none\&pm=bun\&add=turborepo\&ex=none\&git=true\&i=true\&wd=none\&sd=none\&yolo=false))。
技术栈:
上边的 `Bun` 是运行时,下边的 `bun` 是包管理器。(bun 即能做运行时,又能做包管理器)
另外,选择其他的栈也是可以的,只是安装选择和具体路径可能不同,下边以此栈为例。
## 一步到位 [#一步到位]
跳过手动安装的过程,直接使用基于当前示例的模板。
克隆[模板](https://github.com/rhywonfeong/hp-default-monorepo-template)
```bash
npx -y degit rhywonfeong/hp-default-monorepo-template my-better-t-app
cd my-better-t-app
```
`degit` 会克隆仓库,但丢弃远程的 git 历史。
确保已安装 [p cli](https://github.com/ru-yaka/p),然后在任意路径下执行:
```bash
p clone --degit rhywonfeong/hp-default-monorepo-template my-better-t-app
```
它会以 degit 模式克隆远程仓库,放到统一的项目目录下(方便管理),并用 IDE 打开(默认 cursor)。
安装依赖
```bash
bun install
```
运行 hpsetup
启动预览
```bash
bun dev
```
## 手动安装 [#手动安装]
CLI 创建
```bash
bun create better-t-stack@latest my-better-t-app --yes
```
默认配置的命令是最简洁的,稍作修改,就会出现很多 flag 选项。
验证运行(可选)
dev 预览一下,看是否正常。
```bash
bun dev
```
没问题,关掉,然后继续。
暂存提交(可选)
建议提交一次,方便之后查看变更,如果改坏了也可以快速撤回。
有一个初始提交(better-t-stack 自动执行),两个变更(一个自动生成的,一个暂时为空的本地 db)。
全部忽略:
```bash title=".gitignore"
# Custom Ignore
local.db
*.gen.ts
```
暂存提交:
```bash
git add -A && git commit -m "wip: checkpoint before next changes"
```
```bash
git add -A; git commit -m "wip: checkpoint before next changes"
```
### 安装 HeroUI Pro [#安装-heroui-pro]
运行 hpsetup
在 **根目录** 下运行 hpsetup:
hpsetup 支持 monorepo,可以直接在根目录运行,add、安装到子项目,不用 cd 进去,官方 CLI 不支持。
选择安装 HeroUI React Pro,然后安装所有预选的对等依赖。
也可以部分安装,因为不是每个引入的 pro 组件都需要这些对等依赖。但问题是,你不知道引入的 pro 组件需要什么对等依赖,而且这里边有一些是必须的。
这里的版本是从本地缓存中恢复了,与官方 CLI 行为一致。每个版本的 tarball 是固定的。
也可以自动化进行,适合 CI 场景(会自动识别,不用手动加 `--auto` flag)。
引入 Pro 样式
```css title="packages/ui/src/styles/globals.css"
@import "tailwindcss";
/* [!code ++] */
@import "@heroui/styles";
/* [!code ++] */
@import "@heroui-pro/react/css";
```
引入 Pro 组件
```tsx title="apps/web/src/components/area-chart-demo.tsx"
"use client";
import {Card} from "@heroui/react";
import { ChartTooltip } from "@heroui-pro/react/chart-tooltip";
import {AreaChart} from "@heroui-pro/react/area-chart";
const revenueData = [
{month: "Jan", revenue: 4200},
{month: "Feb", revenue: 5800},
{month: "Mar", revenue: 4900},
{month: "Apr", revenue: 7200},
{month: "May", revenue: 6100},
{month: "Jun", revenue: 8400},
{month: "Jul", revenue: 7800},
{month: "Aug", revenue: 9200},
{month: "Sep", revenue: 8600},
{month: "Oct", revenue: 10200},
{month: "Nov", revenue: 9800},
{month: "Dec", revenue: 11500},
];
export default function AreaChartDemo() {
return (
Monthly Revenue
`$${(v / 1000).toFixed(0)}k`} width={40} />
{
if (!active || !payload?.length) return null;
return (
{label}
{payload.map((entry) => (
{entry.name}
${Number(entry.value).toLocaleString()}
))}
);
}}
/>
);
}
```
注意上边的 import 路径用的是子路径(`@heroui-pro/react/area-chart`),而不是主入口(`@heroui-pro/react`)。如果从主入口导入,可能会触发依赖解析错误或打包异常。详见 [使用子路径导入](/docs/other/heroui-pro-subpath-imports)。
在首页预览
```tsx title="apps/web/src/routes/index.tsx"
import { createFileRoute } from "@tanstack/react-router";
import AreaChartDemo from "@/components/area-chart-demo";
export const Route = createFileRoute("/")({
component: HomeComponent,
});
function HomeComponent() {
return (
);
}
```
启动开发服务器:
```bash
bun dev
```
### 移除 shadcn 样式 [#移除-shadcn-样式]
有渲染,无报错,但样式不太对。
老问题,better-t-stack 默认会创建使用 shadcn/ui 的 monorepo。所以我们相当于是在 shadcn/ui 中引入 heroui(v3),两套完全不同的 UI 组件库/框架,导致部分样式异常(heroui 的部分样式被 shadcn 覆盖)。
如此,我们可以彻底移除 shadcn,只用 heroui。
不建议混用,即使当前组件的样式能够修复(移除 shadcn 覆盖 heroui 的那部分样式),以后引入其他组件也可能会出问题。
先移除 `globals.css` 中的其他样式,看是否正常吧。
```css title="packages/ui/src/styles/globals.css"
@import "tailwindcss";
@import "@heroui/styles";
@import "@heroui-pro/react/css";
/* [!code --] */
@import "tw-animate-css";
/* [!code --] */
@import "shadcn/tailwind.css";
/* [!code --] */
@source "../../../apps/**/*.{ts,tsx}";
/* [!code --] */
@source "../**/*.{ts,tsx}";
/* [!code --] */
@custom-variant dark (&:is(.dark *));
/* [!code --] */
:root { ... }
/* [!code --] */
.dark { ... }
/* [!code --] */
@theme inline { ... }
/* [!code --] */
@layer base { ... }
```
正常渲染😎
当然,shadcn 并没有完全清除,具体清理内容,参见 [shadcn 清理记录](/docs/other/shadcn-cleanup-summary)。
如果想跳过清理过程,也可以直接使用现成的模板。由 [p cli](https://github.com/ru-yaka/p) 基于当前示例发布。
快速开始请看 [一步到位](#一步到位)。
# Web + Native Monorepo (/docs/monorepo/web-native-monorepo)
> 本文由人工撰写(md),AI 优化(mdx)。
在 Web + Native 全栈 monorepo 中,hpsetup 可以在根目录运行,它会自动检测所有 workspace 中的 Pro 包并进行安装。
## 创建项目 [#创建项目]
使用 `create better-t-stack` 初始化一个包含 Turborepo 的 monorepo 项目:
```bash
pnpm create better-t-stack@latest my-better-t-app \
--frontend tanstack-router native-uniwind \
--backend none \
--runtime none \
--api none \
--auth none \
--payments none \
--database none \
--orm none \
--db-setup none \
--package-manager pnpm \
--git \
--web-deploy none \
--server-deploy none \
--install \
--addons turborepo \
--examples none
```
## 运行 hpsetup [#运行-hpsetup]
进入项目目录后运行 hpsetup:
## 配置样式 [#配置样式]
安装好 Pro 依赖后,需要在各项目的全局 CSS 中引入样式。
### Web 项目 [#web-项目]
```css title="packages/ui/src/styles/globals.css"
@import "tailwindcss";
@import "@heroui/styles";
@import "@heroui-pro/react/css";
```
### Native 项目 [#native-项目]
```css title="apps/native/global.css"
@import 'tailwindcss';
@import 'uniwind';
@import 'heroui-native/styles';
@import 'heroui-native-pro/styles';
@source './node_modules/heroui-native/lib';
@source './node_modules/heroui-native-pro/lib';
```
## 添加示例组件 [#添加示例组件]
在各自项目的 `components/` 目录中创建 Pro 组件。
### Web:AreaChart [#webareachart]
```tsx title="apps/web/src/components/area-chart-demo.tsx"
"use client";
import {Card} from "@heroui/react";
import { ChartTooltip } from "@heroui-pro/react/chart-tooltip";
import {AreaChart} from "@heroui-pro/react/area-chart";
const revenueData = [
{month: "Jan", revenue: 4200},
{month: "Feb", revenue: 5800},
{month: "Mar", revenue: 4900},
{month: "Apr", revenue: 7200},
{month: "May", revenue: 6100},
{month: "Jun", revenue: 8400},
{month: "Jul", revenue: 7800},
{month: "Aug", revenue: 9200},
{month: "Sep", revenue: 8600},
{month: "Oct", revenue: 10200},
{month: "Nov", revenue: 9800},
{month: "Dec", revenue: 11500},
];
export default function AreaChartDemo() {
return (
Monthly Revenue
`$${(v / 1000).toFixed(0)}k`} width={40} />
{
if (!active || !payload?.length) return null;
return (
{label}
{payload.map((entry) => (
{entry.name}
${Number(entry.value).toLocaleString()}
))}
);
}}
/>
);
}
```
注意上边的 import 路径用的是子路径(`@heroui-pro/react/area-chart`),而不是主入口(`@heroui-pro/react`)。如果从主入口导入,可能会触发依赖解析错误或打包异常。详见 [使用子路径导入](/docs/other/heroui-pro-subpath-imports)。
### Native:Stepper [#nativestepper]
```tsx title="apps/native/components/stepper-demo.tsx"
import { Stepper } from 'heroui-native-pro';
import { View } from 'react-native';
export default function StepperDemo() {
return (
Account
Create your account
Profile
Set up your profile
);
}
```
## 在页面中引入 [#在页面中引入]
### Web [#web]
```tsx title="apps/web/src/routes/index.tsx"
import { createFileRoute } from "@tanstack/react-router";
import AreaChartDemo from "@/components/area-chart-demo";
export const Route = createFileRoute("/")({
component: HomeComponent,
});
function HomeComponent() {
return (
);
}
```
### Native [#native]
```tsx title="apps/native/app/(drawer)/index.tsx"
import { Text, View } from "react-native";
import { Container } from "@/components/container";
import StepperDemo from "@/components/stepper-demo";
export default function Home() {
return (
Better T Stack
Full-stack TypeScript starter
);
}
```
## 预览 [#预览]
运行 `pnpm run dev` 启动项目。
## 常见问题 [#常见问题]
### Web:多 React 实例报错 [#web多-react-实例报错]
这是 Vite 预构建导致的多 React 实例问题。`@heroui-pro/react` 内部调用 `React.useMemo` 时 `React` 为 `null`。
**修复**:在 Vite 配置中添加 `dedupe`:
```ts title="vite.config.ts"
export default defineConfig({
resolve: {
tsconfigPaths: true,
dedupe: ["react", "react-dom", "react/jsx-runtime"],
},
// ...
});
```
修复后正常渲染:
### Web:组件样式异常 [#web组件样式异常]
这与 shadcn 的主题变量冲突有关。移除 `global.css` 中 shadcn 的主题配置后恢复正常:
也可以让 AI 移除 shadcn 中与 HeroUI 冲突的样式来实现混用,但这可能会影响 shadcn 组件的渲染。**建议尽量不混用**。
### Native:Skia 兼容性 [#nativeskia-兼容性]
如果遇到 `@shopify/react-native-skia` 相关的兼容性警告,需要安装与当前 Expo SDK 兼容的版本:
```bash
npx -y expo install @shopify/react-native-skia
```
修复后正常预览:
# HeroUI Native (/docs/native/heroui-native-guide)
> 本文由人工撰写(md),AI 优化(mdx)。
克隆 [heroui-native-example](https://github.com/heroui-inc/heroui-native-example) 到本地,然后安装依赖并启动。
### 克隆项目 [#克隆项目]
```bash
git clone https://github.com/heroui-inc/heroui-native-example
```
确保已安装 [p cli](https://github.com/ru-yaka/p):
```bash
bun install -g ru-yaka/p
```
然后克隆项目,它会自动放到 `~/.p/projects/` 下并用 IDE(默认 cursor,`p config` 可配)打开:
```bash
p clone heroui-inc/heroui-native-example
```
### 安装依赖 [#安装依赖]
```bash
npm install
```
```bash
pnpm install
```
```bash
bun install
```
```bash
yarn install
```
### 允许构建脚本 [#允许构建脚本]
安装完成后运行 start,pnpm 可能会阻止 `unrs-resolver` 的构建脚本:
运行 `pnpm approve-builds` 交互式允许(空格选中后回车),也可以直接编辑 `pnpm-workspace.yaml` 设为 true。
unrs-resolver 是 Rust 编写的高性能模块解析器,需要 postinstall 脚本编译对应平台的二进制文件。
### 启动项目 [#启动项目]
```bash
npm run start
```
```bash
pnpm run start
```
```bash
bun run start
```
```bash
yarn start
```
发现有两个依赖不兼容当前的 expo 版本(测试时为 55)。
### 修复依赖 [#修复依赖]
停止 start,自动安装当前 expo 兼容版本:
```bash
npx -y expo install react-native react-native-worklets
```
```bash
pnpm dlx expo install react-native react-native-worklets
```
```bash
bunx expo install react-native react-native-worklets
```
```bash
yarn dlx expo install react-native react-native-worklets
```
### 验证运行 [#验证运行]
重新 start,然后用 Expo Go 55 扫码测试。
Expo Go 版本必须和当前 expo SDK 版本匹配,否则无法运行。
一切正常:
## 添加为模板 [#添加为模板]
添加当前项目为模板,下次可以从本地快速新建项目(已修复依赖):
```bash
p tp add . heroui-native
```
```bash
p template add . heroui-native
```
```bash
p templates add . heroui-native
```
## 从模板新建项目 [#从模板新建项目]
```bash
p new my-heroui-native-app -t heroui-native
```
```bash
p n my-heroui-native-app -t heroui-native
```
```bash
p create my-heroui-native-app -t heroui-native
```
`p new ` 可以快速创建项目(放在 `~/.p/projects/` 目录下统一管理),并用配置 IDE 打开(默认 cursor,可 `p config` 配置)。忘记模板名可以 `-t` 留空交互式选择,或 `-t ` 模糊搜索。
# HeroUI Native Pro (/docs/native/heroui-native-pro-guide)
> 本文由人工撰写(md),AI 优化(mdx)。
本指南基于已完成的 [HeroUI Native 项目初始化](/docs/native/heroui-native-guide),请先完成基础项目搭建。
## 安装 [#安装]
以交互模式安装 heroui-native-pro(完整版):
在开始之前,可以先初始化 git 并提交,方便查看安装后的具体变更。
安装过程会自动处理 react-native 依赖。如果本地已有缓存(`~/.heroui/cache/react-native/{version}`),会从缓存获取;否则从 CDN 下载后缓存。之后再安装时,同一版本会直接走本地缓存,除非手动清除。
## 配置 [#配置]
安装完成后,需要在全局样式中导入 Pro 的样式和组件源。
### 导入 Pro 样式 [#导入-pro-样式]
在 `global.css` 中添加 heroui-native-pro 的样式导入和组件源扫描:
```css title="global.css"
@import 'tailwindcss';
@import 'uniwind';
@import 'heroui-native/styles';
@import 'heroui-native-pro/styles';
@source './node_modules/heroui-native/lib';
@source './node_modules/heroui-native-pro/lib';
```
`@source` 路径是相对于 `global.css` 文件而言的。如果 `global.css` 不在项目根目录(例如在 `app/` 中),路径应调整为 `../node_modules/heroui-native-pro/lib`。
## 使用 [#使用]
### 创建 Pro 组件 [#创建-pro-组件]
在 `components` 目录下创建一个组件文件来使用 Pro 组件:
```tsx title="src/components/my-component.tsx"
import { Stepper } from 'heroui-native-pro';
import { View } from 'react-native';
export default function MyComponent() {
return (
Account
Create your account
Profile
Set up your profile
);
}
```
### 替换首页内容 [#替换首页内容]
在首页(路径因项目组织方式而异,通常为 `src/app/(home)/index.tsx`)中导入并使用该组件:
```tsx title="src/app/(home)/index.tsx"
import MyComponent from '@/src/components/my-component';
// 在 ScreenScrollView 中替换 View 部分
```
### 预览验证 [#预览验证]
启动项目进行预览:
```bash
npm run start
```
```bash
pnpm run start
```
```bash
bun run start
```
```bash
yarn start
```
## 更新模板 [#更新模板]
安装完成后,可以将当前项目更新为模板(会覆盖原有模板),下次直接使用:
```bash
p tp update .
```
```bash
p template update .
```
```bash
p templates update .
```
## 发布到远程 [#发布到远程]
也可以将模板发布到远程,分享给其他人 clone 使用:
```bash
p tp publish .
```
```bash
p template publish .
```
```bash
p templates publish .
```
# Native EAS 部署 (/docs/native/native-eas-build)
> 本文由人工撰写(md),AI 优化(mdx)。
本指南基于已完成的 [HeroUI Native Pro 安装](/docs/native/heroui-native-pro-guide),请先完成基础安装和配置。
## 配置 preinstall 脚本 [#配置-preinstall-脚本]
切换到 `apps/native/`,在 `package.json` 中新增一个 `preinstall` 脚本:
### 添加 preinstall 脚本 [#添加-preinstall-脚本]
```json title="apps/native/package.json"
{
"scripts": {
"preinstall": "npx -y hpsetup@latest "
}
}
```
这一步会确保在依赖安装前运行 hpsetup,提前完成所有依赖的完整安装,然后移除 pro 包的 postinstall(让后续的 install 正常通过,不报依赖构建错误)。
如果需要体验最新的内测实现,可以把 `latest` 换成 `beta`。
### 配置 EAS [#配置-eas]
新增 `eas.json` 文件:
```json title="apps/native/eas.json"
{
"cli": {
"version": ">= 18.13.0",
"appVersionSource": "remote"
},
"build": {
"development": {
"developmentClient": true,
"distribution": "internal"
},
"preview": {
"distribution": "internal"
},
"production": {
"autoIncrement": true
}
},
"submit": {
"production": {}
}
}
```
新增 `.nvmrc`,指定 Node 版本为 22(pnpm 11 需要此版本,否则会报错):
```bash title="apps/native/.nvmrc"
22
```
### 执行构建 [#执行构建]
```bash
npx -y --package eas-cli eas build -p android -e preview
```
临时装一个 eas-cli 包,然后执行其中的 eas 命令,使用 preview profile 运行 Android 端的构建。
成功构建:
安装 APK 后运行:
## Tips [#tips]
### ERR\_PNPM\_IGNORED\_BUILDS [#err_pnpm_ignored_builds]
如果遇到 `ERR_PNPM_IGNORED_BUILDS` 问题,需要把相应的依赖加入 trust 列表(允许依赖的构建脚本执行):
仅示例,此依赖已纳入 hpsetup trust 列表。
### Expo 官方插件 [#expo-官方插件]
需要辅助 Expo 开发的话,可以安装官方的插件:
# 使用子路径导入 (/docs/other/heroui-pro-subpath-imports)
## 问题 [#问题]
从主入口导入组件时:
```ts
import { AreaChart, ChartTooltip } from "@heroui-pro/react";
```
Vite 会报错,提示找不到 `shiki`、`marked`、`react-markdown` 等依赖:
```
Failed to resolve import "shiki" from "node_modules/.vite/deps/@heroui-pro_react.js"
```
## 原因 [#原因]
`@heroui-pro/react` 的主入口(`dist/index.js`)将所有组件 re-export 到一个文件中。当你从主入口导入时,Vite 必须解析整个 bundle,包括你根本没用到的组件的依赖(`shiki` 属于 `code-block`,`marked` 属于 `markdown`,等等)。
## 解决方案 [#解决方案]
使用子路径导入,只引入你需要的组件:
```ts
// ✅ 正确 — 子路径导入
import { AreaChart } from "@heroui-pro/react/area-chart";
import { ChartTooltip } from "@heroui-pro/react/chart-tooltip";
```
所有可用的子路径在包的 `exports` 字段中定义,格式为 `@heroui-pro/react/<组件名>`,例如:
* `@heroui-pro/react/area-chart`
* `@heroui-pro/react/bar-chart`
* `@heroui-pro/react/chart-tooltip`
* `@heroui-pro/react/code-block`
* `@heroui-pro/react/markdown`
* `@heroui-pro/react/sidebar`
* ……
## 子路径列表 [#子路径列表]
以下是目前所有可用的子路径导入:
| 子路径 | 组件 |
| ----------------------- | ------------------- |
| `action-bar` | ActionBar |
| `agenda` | Agenda |
| `app-layout` | AppLayout |
| `area-chart` | AreaChart |
| `bar-chart` | BarChart |
| `carousel` | Carousel |
| `cell-color-picker` | CellColorPicker |
| `cell-select` | CellSelect |
| `cell-slider` | CellSlider |
| `cell-switch` | CellSwitch |
| `chain-of-thought` | ChainOfThought |
| `chart-tooltip` | ChartTooltip |
| `chat-attachment` | ChatAttachment |
| `chat-conversation` | ChatConversation |
| `chat-list-view` | ChatListView |
| `chat-loader` | ChatLoader |
| `chat-message` | ChatMessage |
| `chat-message-actions` | ChatMessageActions |
| `chat-source` | ChatSource |
| `chat-tool` | ChatTool |
| `checkbox-button-group` | CheckboxButtonGroup |
| `code-block` | CodeBlock |
| `command` | Command |
| `composed-chart` | ComposedChart |
| `context-menu` | ContextMenu |
| `data-grid` | DataGrid |
| `drop-zone` | DropZone |
| `emoji-picker` | EmojiPicker |
| `emoji-reaction-button` | EmojiReactionButton |
| `empty-state` | EmptyState |
| `file-tree` | FileTree |
| `floating-toc` | FloatingToc |
| `hover-card` | HoverCard |
| `inline-select` | InlineSelect |
| `item-card` | ItemCard |
| `item-card-group` | ItemCardGroup |
| `kanban` | Kanban |
| `kpi` | KPI |
| `kpi-group` | KPIGroup |
| `line-chart` | LineChart |
| `list-view` | ListView |
| `markdown` | Markdown |
| `native-select` | NativeSelect |
| `navbar` | Navbar |
| `number-stepper` | NumberStepper |
| `number-value` | NumberValue |
| `pie-chart` | PieChart |
| `pressable-feedback` | PressableFeedback |
| `prompt-input` | PromptInput |
| `prompt-suggestion` | PromptSuggestion |
| `radar-chart` | RadarChart |
| `radial-chart` | RadialChart |
| `radio-button-group` | RadioButtonGroup |
| `rating` | Rating |
| `resizable` | Resizable |
| `segment` | Segment |
| `sheet` | Sheet |
| `sidebar` | Sidebar |
| `stepper` | Stepper |
| `text-shimmer` | TextShimmer |
| `trend-chip` | TrendChip |
| `widget` | Widget |
# Shadcn 清理记录 (/docs/other/shadcn-cleanup-summary)
# Shadcn 清理记录 [#shadcn-清理记录]
项目从 shadcn 迁移至 HeroUI,以下为完整清理内容。
## 一、packages/ui — 移除 shadcn 组件包 [#一packagesui--移除-shadcn-组件包]
### 删除的文件结构 [#删除的文件结构]
### 保留文件 [#保留文件]
| 路径 | 说明 |
| ------------------------ | ---------------------------------------- |
| `src/styles/globals.css` | 仅含 `@import "tailwindcss"` + HeroUI 样式导入 |
| `src/index.ts` | 空文件,供 tsc 通过 |
### 移除的依赖 [#移除的依赖]
从 `packages/ui/package.json` 移除:
```
shadcn, @base-ui/react, class-variance-authority, clsx,
tailwind-merge, lucide-react, sonner, tw-animate-css, next-themes
```
`lucide-react` 从 packages/ui 移除仅因为该包已无组件文件。它仍保留在 `apps/web/package.json` 中(`loader.tsx` 在用),且 HeroUI 生态后续也可能用到,不做删除。
***
## 二、apps/web — 移除使用 shadcn 的页面和组件 [#二appsweb--移除使用-shadcn-的页面和组件]
### 删除的文件结构 [#删除的文件结构-1]
### 保留文件 [#保留文件-1]
| 路径 | 说明 |
| ------------------------------------ | --------------------- |
| `src/components/area-chart-demo.tsx` | 使用 HeroUI Pro,不受影响 |
| `src/components/loader.tsx` | 仅用 lucide-react,不受影响 |
| `src/routes/index.tsx` | 首页,引用 area-chart-demo |
### \_\_root.tsx 变更 [#__roottsx-变更]
| 操作 | 内容 |
| -- | --------------------------------------------------------------------- |
| 移除 | `Toaster` (sonner)、`ThemeProvider` (next-themes)、`Header`、`trpc` 类型引用 |
| 保留 | `HeadContent`、`Outlet`、`TanStackRouterDevtools`、`ReactQueryDevtools` |
### utils/trpc.ts 变更 [#utilstrpcts-变更]
`toast.error(...)` 替换为 `console.error(...)`,sonner 移除后的临时替代。
### 移除的依赖 [#移除的依赖-1]
从 `apps/web/package.json` 移除:
```
sonner, next-themes, embla-carousel, embla-carousel-react, tailwind-merge
```
***
## 三、根目录 — 清理 catalog [#三根目录--清理-catalog]
`package.json` 的 `workspaces.catalog` 移除了 `next-themes: "^0.4.6"`,整个 monorepo 已无引用。
**什么是 catalog?** Bun workspace 的集中版本管理机制。子包用 `"catalog:"` 引用声明好的版本号,避免各写一遍。仅当整个 monorepo 无人使用时才从 catalog 删除。
***
## 四、配置清理 [#四配置清理]
| 文件 | 变更 |
| --------------------------- | ------------------------------------------------ |
| `packages/ui/tsconfig.json` | 移除 `@my-better-t-app/ui/*` path mapping |
| `apps/web/tsconfig.json` | 移除 `@my-better-t-app/ui/*` path mapping,保留 `@/*` |
| `apps/web/components.json` | 删除 |
***
## 五、验证 [#五验证]
安装依赖
```bash
bun install
```
构建验证
```bash
vite build
```
确认无残留
```bash
grep -rn "shadcn\|@my-better-t-app/ui/components\|next-themes\|sonner" \
apps/web/src/ packages/ui/src/
# 返回空
```
# 官方包审计 (/docs/security/audit-report)
> 本文由 GLM-5-turbo 驱动的 CC 生成,内容基于项目源码与运行时记忆。
## 审计范围 [#审计范围]
| 包名 | 版本 | 类型 |
| ------------------- | ------------ | ------------------------------- |
| `heroui-pro` | 1.0.0-beta.9 | CLI 工具 + 认证/CDN/缓存共享库 |
| `@heroui-pro/react` | 1.0.0-beta.3 | React Pro 组件(空壳,postinstall 下载) |
| `heroui-native-pro` | 1.0.0-beta.3 | React Native Pro 组件(同上) |
## 核心结论 [#核心结论]
**未发现第三方遥测 SDK,未发现主动数据窃取行为。** 这是一个付费组件库的商业授权与分发系统。
## 混淆与反混淆 [#混淆与反混淆]
5 个文件使用 RC4 + base64 混淆,共 327 个加密字符串全部自动化解密成功。
已反混淆的文件:
| 文件 | 说明 |
| ------------------------------ | -------- |
| `consts.deobfuscated.js` | 常量定义 |
| `auth/keyring.deobfuscated.js` | 密钥环操作 |
| `auth/session.deobfuscated.js` | 会话管理 |
| `auth/ci.deobfuscated.js` | CI 认证流程 |
| `cdn/download.deobfuscated.js` | CDN 下载逻辑 |
反混淆结果保存在 `heroui-pro-analysis/` 目录中。
## 隐式追踪机制 [#隐式追踪机制]
虽然没有第三方遥测 SDK,但存在以下隐式追踪能力:
### 1. 项目指纹 [#1-项目指纹]
每次请求头发送 `X-HeroUI-Project: sha256(projectName).slice(0, 16)`,服务端可据此统计唯一项目数。
### 2. 客户端标识 [#2-客户端标识]
* `User-Agent: heroui-pro-cli/1.0.0-beta.4`
* `X-HeroUI-Client-Version` header
### 3. 认证身份 [#3-认证身份]
GitHub handle + JWT token 关联每次下载请求,可追踪单个用户的使用模式。
### 4. 动态代码投递 [#4-动态代码投递]
npm 包本身是空壳,实际组件代码通过 postinstall 从远端服务器拉取。这意味着:
* 无法通过 npm 版本锁定来固定代码
* 每次安装的实际代码可能不同
* 上游可以随时更改分发的代码内容
## 外部通信 [#外部通信]
| 目标 | 用途 | 认证信息 |
| -------------------- | --------- | ----------------------- |
| `api.heroui.pro` | 认证、CDN 下载 | GitHub token / CI token |
| `registry.npmjs.org` | 版本检查 | 无(3 秒超时) |
| GitHub OAuth | SSE 回调 | GitHub OAuth token |
## 本地存储 [#本地存储]
| 路径 | 内容 | 权限 |
| --------------------------------------- | ------------------- | ---- |
| `~/.config/heroui-pro/credentials.json` | GitHub handle + JWT | 0600 |
| 系统密钥环 (libsecret) | 同上(如可用则优先) | — |
| `~/.heroui/cache///` | 组件缓存 | — |
凭据文件使用 0600 权限(仅所有者可读写)。
## 风险评估 [#风险评估]
| 风险 | 级别 | 说明 |
| ------ | -- | ------------------------ |
| 动态代码投递 | 中 | npm 包为空壳,实际代码由上游控制 |
| 项目指纹追踪 | 低 | 仅发送项目名哈希,非用户身份信息 |
| 认证关联 | 低 | 使用 GitHub 身份,对付费产品属于正常行为 |
| 本地凭据存储 | 低 | 使用标准 0600 权限 + 系统密钥环 |
# 隐私与数据收集 (/docs/security/privacy)
> 本文由 GLM-5-turbo 驱动的 CC 生成,内容基于项目源码与运行时记忆。
## hpsetup 本身 [#hpsetup-本身]
hpsetup CLI 工具**不主动收集任何用户数据**。它是一个纯粹的安装工具,职责是下载和安装 HeroUI Pro 组件。
hpsetup 的所有外部通信:
| 目标 | 请求 | 发送的数据 |
| ------------------------ | ----------------------- | ------- |
| `hpsetup-cdn.932324.xyz` | GET `/api/tarball/...` | API Key |
| `registry.npmjs.org` | GET `/{package}/latest` | 无认证信息 |
### API Key 用途 [#api-key-用途]
API Key 仅用于 CF Worker 的认证,以验证用户是否有权下载 tarball。Key 的格式为 `hp_` + 48 位十六进制字符,由管理员通过 Admin API 创建。
## 上游依赖(heroui-pro) [#上游依赖heroui-pro]
hpsetup 安装的 `heroui-pro` 包(npm 空壳)在 postinstall 阶段会与上游 `api.heroui.pro` 通信。以下数据收集行为来自上游,不属于 hpsetup 本身:
### 收集的数据 [#收集的数据]
| 数据 | 来源 | 用途 |
| ------------- | -------------------------- | --------- |
| GitHub handle | OAuth 认证 | 用户身份识别与授权 |
| JWT token | 认证响应 | 会话管理 |
| 项目名哈希 | `package.json` 的 `name` 字段 | 唯一项目统计 |
| CLI 版本 | User-Agent header | 版本分布统计 |
### 不收集的数据 [#不收集的数据]
* 源代码内容
* 文件系统结构(除 `package.json` 的 `name`)
* 环境变量
* 系统信息
## 缓存与本地存储 [#缓存与本地存储]
| 存储 | 内容 | 位置 |
| ---------- | ------------------- | --------------------------------------- |
| tarball 缓存 | 组件压缩包 | `~/.heroui/cache/` |
| 凭据 | GitHub handle + JWT | `~/.config/heroui-pro/credentials.json` |
| 凭据(备选) | 同上 | 系统密钥环 (libsecret) |
所有凭据文件使用 0600 权限。清除缓存和凭据:
```bash
rm -rf ~/.heroui/cache
rm -rf ~/.config/heroui-pro
```
## 网络请求汇总 [#网络请求汇总]
一次完整的 hpsetup 安装流程涉及的网络请求:
```
1. CLI → registry.npmjs.org 版本检查(无认证)
2. CLI → hpsetup-cdn.932324.xyz 下载 tarball(API Key 认证)
3. [可选] heroui-pro → api.heroui.pro postinstall 认证(上游行为)
```
步骤 3 仅在 `heroui-pro` 包的 postinstall 脚本执行时发生,属于上游包的独立行为。
# 快速开始 (/docs/web/quick-start)
> 本文由人工撰写(md),AI 优化(mdx)。
优先推荐使用 pnpm,因为它最早进行测试,覆盖的场景更多一些。
其他的包管理器也在路上,测试完成后会更新、完善文档。
## 一步到位 [#一步到位]
跳过手动安装的项目准备、安装 HeroUI Pro、引入 demo 组件等过程,一步到位。
克隆[模板](https://github.com/rhywonfeong/hp-nextjs-app-template)
```bash
npx -y degit rhywonfeong/hp-nextjs-app-template my-hp-nextjs-app
cd my-hp-nextjs-app
```
`degit` 会克隆仓库,但丢弃远程的 git 历史。
确保已安装 [p cli](https://github.com/ru-yaka/p),然后在任意路径下执行:
```bash
p clone --degit rhywonfeong/hp-nextjs-app-template my-hp-nextjs-app
```
它会以 degit 模式克隆远程仓库,放到统一的项目目录下(方便管理),并用 IDE 打开(默认 cursor)。
安装依赖
```bash
npm install
```
```bash
pnpm install
```
```bash
bun install
```
```bash
yarn install
```
运行 hpsetup
我这里是开发测试,所以用的是 beta 版本,大家不要用 beta 版本哈(可能有更多的 bug),一般用 latest 版本就好。
另外,这里是从本地缓存中恢复了(同一版本的依赖包固定,官方也会缓存)。如果本地缓存中没有的话,会从 CDN 拉取。
启动预览
```bash
npm run dev
```
```bash
pnpm dev
```
```bash
bun dev
```
```bash
yarn dev
```
## 手动安装 [#手动安装]
### 项目准备 [#项目准备]
创建项目
首先,得有一个 HeroUI 项目。
如果是从零开始的新项目,可以用 [heroui-cli](https://www.npmjs.com/package/heroui-cli) 进行初始化:
```bash
npx -y heroui-cli@latest init my-heroui-app
```
上边这个命令在哪个目录下运行,项目就会放在哪个目录下。如果希望在任意目录下运行,还能实现统一管理,可以试试 [p cli](https://github.com/ru-yaka/p)(请确保提前安装):
```bash
p new -- npx -y heroui-cli@latest init my-heroui-app
```
它会把项目放到统一的项目目录(`~/.p/projects/`),然后用 IDE(可配,默认 cursor)打开。
另外,还可以直接克隆现有的模板(无需交互):
```bash
npx -y degit rhywonfeong/heroui-nextjs-app-template my-heroui-nextjs-app
```
安装依赖
```bash
npm install
```
```bash
pnpm install
```
```bash
bun install
```
```bash
yarn install
```
验证运行
启动开发服务器,确认项目可以正常运行:
```bash
npm run dev
```
```bash
pnpm run dev
```
```bash
bun run dev
```
```bash
yarn dev
```
确认页面正常显示后,按 `Ctrl+C` 停止开发服务器。
初始化 Git(可选)
建议在安装 HeroUI Pro 之前先提交一次,方便查看之后做了哪些变更:
```bash
git init && git add . && git commit -m "init: heroui project"
```
```bash
git init; git add .; git commit -m "init: heroui project"
```
### 安装 HeroUI Pro [#安装-heroui-pro]
运行 hpsetup
引入样式
在你的全局 CSS 文件末尾新增一行:
```css title="styles/globals.css"
@import "tailwindcss";
/* [!code ++] */
@import "@heroui/styles";
/* [!code ++] */
@import "@heroui-pro/react/css";
```
```css title="src/styles/globals.css"
@import "tailwindcss";
/* [!code ++] */
@import "@heroui/styles";
/* [!code ++] */
@import "@heroui-pro/react/css";
```
```css title="styles/globals.css"
@import "tailwindcss";
/* [!code ++] */
@import "@heroui/styles";
/* [!code ++] */
@import "@heroui-pro/react/css";
```
### 引入 demo 组件 [#引入-demo-组件]
创建组件
```tsx title="components/area-chart-demo.tsx"
"use client";
import {Card} from "@heroui/react";
import { ChartTooltip } from "@heroui-pro/react/chart-tooltip";
import {AreaChart} from "@heroui-pro/react/area-chart";
const revenueData = [
{month: "Jan", revenue: 4200},
{month: "Feb", revenue: 5800},
{month: "Mar", revenue: 4900},
{month: "Apr", revenue: 7200},
{month: "May", revenue: 6100},
{month: "Jun", revenue: 8400},
{month: "Jul", revenue: 7800},
{month: "Aug", revenue: 9200},
{month: "Sep", revenue: 8600},
{month: "Oct", revenue: 10200},
{month: "Nov", revenue: 9800},
{month: "Dec", revenue: 11500},
];
export default function AreaChartDemo() {
return (
Monthly Revenue
`$${(v / 1000).toFixed(0)}k`} width={40} />
{
if (!active || !payload?.length) return null;
return (
{label}
{payload.map((entry) => (
{entry.name}
${Number(entry.value).toLocaleString()}
))}
);
}}
/>
);
}
```
```tsx title="src/components/area-chart-demo.tsx"
"use client";
import {Card} from "@heroui/react";
import { ChartTooltip } from "@heroui-pro/react/chart-tooltip";
import {AreaChart} from "@heroui-pro/react/area-chart";
const revenueData = [
{month: "Jan", revenue: 4200},
{month: "Feb", revenue: 5800},
{month: "Mar", revenue: 4900},
{month: "Apr", revenue: 7200},
{month: "May", revenue: 6100},
{month: "Jun", revenue: 8400},
{month: "Jul", revenue: 7800},
{month: "Aug", revenue: 9200},
{month: "Sep", revenue: 8600},
{month: "Oct", revenue: 10200},
{month: "Nov", revenue: 9800},
{month: "Dec", revenue: 11500},
];
export default function AreaChartDemo() {
return (
Monthly Revenue
`$${(v / 1000).toFixed(0)}k`} width={40} />
{
if (!active || !payload?.length) return null;
return (
{label}
{payload.map((entry) => (
{entry.name}
${Number(entry.value).toLocaleString()}
))}
);
}}
/>
);
}
```
```tsx title="components/area-chart-demo.tsx"
"use client";
import {Card} from "@heroui/react";
import { ChartTooltip } from "@heroui-pro/react/chart-tooltip";
import {AreaChart} from "@heroui-pro/react/area-chart";
const revenueData = [
{month: "Jan", revenue: 4200},
{month: "Feb", revenue: 5800},
{month: "Mar", revenue: 4900},
{month: "Apr", revenue: 7200},
{month: "May", revenue: 6100},
{month: "Jun", revenue: 8400},
{month: "Jul", revenue: 7800},
{month: "Aug", revenue: 9200},
{month: "Sep", revenue: 8600},
{month: "Oct", revenue: 10200},
{month: "Nov", revenue: 9800},
{month: "Dec", revenue: 11500},
];
export default function AreaChartDemo() {
return (
Monthly Revenue
`$${(v / 1000).toFixed(0)}k`} width={40} />
{
if (!active || !payload?.length) return null;
return (
{label}
{payload.map((entry) => (
{entry.name}
${Number(entry.value).toLocaleString()}
))}
);
}}
/>
);
}
```
引入页面
```tsx title="app/page.tsx"
import AreaChartDemo from "@/components/area-chart-demo";
export default function Page() {
return ;
}
```
```tsx title="src/App.tsx"
import AreaChartDemo from "./components/area-chart-demo";
export default function Page() {
return ;
}
```
```tsx title="pages/index.tsx"
import AreaChartDemo from "../components/area-chart-demo";
export default function Page() {
return ;
}
```
启动预览
```bash
npm run dev
```
```bash
pnpm dev
```
```bash
bun dev
```
```bash
yarn dev
```
## 常见问题 [#常见问题]
### HeroUI CLI 选项说明 [#heroui-cli-选项说明]
注意哈,HeroUI CLI 新建项目的时候会有三个选项:
* 第 1、2 个选项都是 Next.js,第 3 个选项是 React + Vite
* 其中第 2 个选项是 Next.js Pages Router,这个是为了兼容老项目的,现在已经不推荐使用了,新项目都推荐用 App Router(第一个选项)
### 安装报错 [#安装报错]
如果在 install 安装的时候报 `[ERR_PNPM_IGNORED_BUILDS]` 这个错误,我们需要同意构建,也就是允许这些依赖的构建脚本运行,然后才能继续。
运行:
```bash
pnpm approve-builds
```