项目概览与约定

1. 项目概述

ubean 是一个基于 Vite、Hono 与 Vue 3 的全栈元框架,融合了 void 的 Inertia 式 SSR 页面路由和 nitro 的跨平台部署能力,以 24 个单用途包(ubean 聚合器 + 23 个 @ubean/* 子包)的 monorepo 形式组织。

1.1 核心定位

  • Vue 专属: 仅支持 Vue 3,深度集成 Vue 生态
  • 构建工具链: 基于 Vite(vite-plus 工作流),Hono 作为 HTTP 框架
  • 跨平台部署: 借鉴 nitro 的 preset 系统,支持 Node.js、Bun、Deno、Cloudflare、Vercel、Netlify 等多平台
  • 函数式编程: 严格遵循 TypeScript 函数式编程范式
  • 完整测试: 基于 vitest 实现全量测试覆盖(全仓库 1000+ 测试)

1.2 本地参考项目

项目本地路径参考内容
void[/Users/soybean/Web/Projects/OpenSource/void](file:///Users/soybean/Web/Projects/OpenSource/void)主要参考对象:文件式路由、defineHandler 中间件链模式、Islands 架构、Markdown 页面、Better Auth 集成、Queues Proxy 动态绑定、Cron Jobs、Skills/Agent 系统、DevTools 风格、Vite-Plus 构建、Inertia 式 SSR 页面渲染(请求验证改用 hono-openapi 的 validator/describeRoute)
@void/vue[/Users/soybean/Web/Projects/OpenSource/void](file:///Users/soybean/Web/Projects/OpenSource/void-vue)void针专属vue插件
nitro[/Users/soybean/Web/Projects/OpenSource/nitro](file:///Users/soybean/Web/Projects/OpenSource/nitro)多平台 preset 系统(30+ 部署平台)、routeRules(缓存/headers/重定向/代理)、OpenAPI 自动生成(Scalar UI)、Storage 层(unstorage)、Database 层(db0)、预渲染/SSG、运行时插件生命周期
hono-ssr[/Users/soybean/Web/Projects/SoybeanJS/hono-ssr](file:///Users/soybean/Web/Projects/SoybeanJS/hono-ssr)createDefineRoute 多重重载类型推导模式,中间件链 Input 类型通过 IntersectNonAnyTypes 从左到右累积,确保 validator 定义的 params/query/json 类型流向后续 handler
elegant-router[/Users/soybean/Web/Projects/SoybeanJS/elegant-router](file:///Users/soybean/Web/Projects/SoybeanJS/elegant-router)类型化路由名称(RouteName 联合类型)、reuse 路由(xxx.reuse.ts 复用页面组件)、CLI 路由增删改(交互式命令)、虚拟模块暴露全量路由数据、路由组命名转换
@soybeanjs/request[/Users/soybean/Web/Projects/SoybeanJS/request](file:///Users/soybean/Web/Projects/SoybeanJS/request)基于 axios 的类型安全 fetch client 设计,标准模式(throw on error)与 flat 模式({ data, error })双模式,基于 openapi-typescript 生成的 paths 类型推导请求/响应类型

1.3 参考项目融合策略

特性voidnitroubean 取舍
HTTP 框架Honoh3✅ Hono(轻量、现代、类型友好)
构建工具Vite-PlusVite/Rollup/Rolldown✅ Vite-Plus
页面路由Inertia 式 SSR + 框架适配器renderer 抽象✅ Inertia 式,仅 Vue 适配器
API 路由文件式路由 (routes/)文件式路由 (server/api/)✅ 文件式路由 (routes/)
平台适配Cloudflare 为主30+ 平台 preset✅ nitro 风格 preset 系统
部署平台Void Cloud (自有平台)各平台独立部署❌ 移除,改为通用部署
登录认证Better Auth 内置无内置✅ 独立扩展包 @ubean/auth(Better Auth集成+内置fallback)
状态管理无内置无内置✅ 扩展子路径 @ubean/integrations/pinia(Pinia 集成 + SSR 状态水合)
数据库Drizzle ORM + D1/PGdb0 抽象层✅ Drizzle ORM + 多数据库驱动
环境变量defineEnv + Schema 验证runtimeConfig✅ defineEnv + 类型安全验证
缓存/ISRKV + Edge CacherouteRules 缓存✅ 融合两者
Skills 系统✅ Agent 路由❌✅ 保留并增强
插件系统Vite 插件运行时插件 + 模块系统✅ Vite 插件 + 运行时插件
Hooks 系统Wrangler hooksHookable 生命周期✅ Hookable 完整生命周期
类型安全客户端typed fetch无内置✅ 自动生成类型安全客户端
OpenAPI 文档❌✅ Scalar/Swagger UI✅ nitro 风格 OpenAPI 自动生成
App 实例定制❌ 硬编码入口❌✅ defineApp 暴露 Vue 实例

2. 技术栈

2.1 工作区计划依赖

下列为工作区聚合清单,实际归属必须遵循 §2.4;它不是 packages/ubean 的单包依赖清单。

{
  "hono": "^4.x",
  "vite": "catalog:",
  "vite-plus": "catalog:",
  "defu": "^6.x",
  "pathe": "^2.x",
  "hookable": "^6.x",
  "citty": "^0.2.x",
  "c12": "^4.x",
  "tslog": "^5.x",
  "tinyglobby": "^0.2.x",
  "magic-string": "^0.30.x",
  "estree-walker": "^3.x",
  "ofetch": "^2.x",
  "ohash": "^2.x",
  "ufo": "^1.x",
  "unstorage": "^2.x",
  "db0": "^0.3.x",
  "drizzle-orm": "^0.45.x",
  "crossws": "^0.4.x",
  "unimport": "^6.x",
  "unenv": "^2.x",
  "std-env": "^4.x",
  "knitwork": "^1.x",
  "mlly": "^1.x",
  "scule": "^1.x",
  "confbox": "^0.2.x",
  "@scalar/openapi-types": "^0.2.x",
  "@standard-schema/spec": "^1.x",
  "enquirer": "^2.x",
  "ts-morph": "^24.x",
  "birpc": "^0.2.x",
  "fuse.js": "^7.x",
  "@vean/ui": "^0.x",
  "@vean/aria": "^0.x",
  "@codemirror/state": "^6.x",
  "@codemirror/view": "^6.x",
  "@codemirror/commands": "^6.x",
  "@codemirror/language": "^6.x",
  "@codemirror/lang-json": "^6.x",
  "@codemirror/lang-javascript": "^6.x",
  "@codemirror/lang-vue": "^0.x",
  "@codemirror/theme-one-dark": "^6.x",
  "unplugin-vue-components": "^28.x",
  "@iconify/vue": "^5.x",
  "@iconify/utils": "^3.x",
  "markdown-exit": "^1.x",
  "@shikijs/markdown-exit": "^4.x",
  "front-matter": "^4.x"
}

2.2 开发依赖

{
  "@vitejs/plugin-vue": "^6.x",
  "vitest": "catalog:",
  "@vitest/coverage-v8": "^4.x",
  "@playwright/test": "^1.x",
  "typescript": "^7.x",
  "vue": "^3.x",
  "vue-tsc": "^3.x",
  "@types/enquirer": "^2.x"
}

2.3 包管理器

2.4 依赖与包边界

依赖按运行时边界拆分,核心包不得因为可选功能或单个平台实现而携带额外运行时代码:

范围依赖策略示例
packages/ubean 核心仅保留 Node 与 edge 共用的依赖Hono、Hookable、rou3、Standard Schema 类型
Vue 集成Vue 及 Vue Router 使用 peerDependencies;SSR renderer 按 server entry 引入vue、vue-router、@vue/server-renderer
preset 包@ubean/preset 内置全部平台预设;不被核心包静态导入standard/node/cloudflare/cloudflare-dev/vercel/vercel-edge/netlify/bun/deno/aws/azure
浏览器传输适配器仅在浏览器 client entry 打包;不进入 Node、edge 或 SSR bundle数据库驱动、上传进度适配器
DevTools 与 Auth/PWA独立包,默认不进入生产 bundle@ubean/devtools、@ubean/auth、@ubean/integrations/pwa
资源与内容扩展独立包;依赖及平台实现按功能拆分,核心不静态引入@ubean/icon、@ubean/image、@ubean/content、@ubean/integrations/fonts
状态管理与 UI 集成集成包子路径;底层库作为 peerDependency 由用户控制版本@ubean/integrations/pinia、@ubean/integrations/ui
  • 文档示例若使用 zod,必须标记为用户项目依赖;框架核心仅依赖 Standard Schema 规范,不绑定某个验证库。
  • @ubean/icon 将 @iconify/vue 作为 Vue peer dependency,@iconify-json/<collection> 由用户按需安装为开发依赖;禁止将全量 @iconify/json 加入框架或应用默认依赖。
  • rou3、env-runner、@vue/server-renderer、vue-router、Scalar UI 以及端到端测试工具必须在实现对应功能前写入实际 package manifest,并确定 dependencies、peerDependencies 或 devDependencies 归属。
  • 每个新增依赖需说明目标包、运行时、许可、bundle 影响和替代方案;禁止使用 latest 作为发布依赖版本。

3. 目录结构

以下是仓库当前的实际目录结构(截至 2026-08)。早期规划曾列出更细的单体子目录(core/app/、build/rollup/、按域拆分的 types/runtime/ 等),当前实现已拆分为独立子包,请以本文为准。

ubean/
├── packages/                     # 24 个单用途包(ubean 聚合器 + 23 个 @ubean/* 子包)
│   ├── ubean/                    # 主包 (npm name: "ubean") — 聚合器
│   │   ├── bin/ubean.mjs         # CLI 二进制入口
│   │   ├── src/                  # 子路径导出(isomorphic 主入口 + server/build/client/i18n/ssr/vite/scaffold)
│   │   ├── test/                 # 单元 + 集成测试
│   │   └── package.json
│   ├── shared/                   # @ubean/shared — 共享类型 / 工具函数 / 错误 / 环境变量
│   ├── vue/ markdown/ seo/ pages/ i18n/           # 基础/共享:Vue 页面路由内核、Markdown、SEO、页面协议、i18n
│   ├── routes/ server/ app/                       # 服务端运行时:API 路由 + Server Actions、Hono 服务、应用工厂
│   ├── builder/ config/ preset/                   # 构建时:@ubean/build(Vite + prerender + codegen)、配置、预设
│   ├── scan/                    # @ubean/scan — 项目扫描 (scanProject + 路由元数据)
│   ├── client/                  # @ubean/client — Vue 客户端运行时(含 ./ssr 渲染器)
│   ├── islands/ cli/ devtools/  # 服务/工具:Islands、CLI(含 dev server)、DevTools
│   └── ai/ auth/ icon/ image/ content/ integrations/   # 扩展(integrations 含 pwa/fonts/electron/ui/pinia 子路径)
├── apps/
│   └── docs/                     # 官方文档站(指南 / 集成 / API / 架构正文,dogfooding)
├── examples/
│   ├── ubean-test/               # 完整全栈示例 + 测试(virtual 路由模式)
│   ├── client-only-spa/          # 纯客户端 SPA 示例(复用 @ubean/vue 内核)
│   ├── frontend-only/            # 纯前端示例(无 API/SSR)
│   └── routing-file-mode/        # 路由文件生成模式示例
├── skills/ubean/                 # AI Skill(CLI 命令文档与 agent 提示词)
├── docs/                         # 仓库级工程文档(ADR、领域词汇表、产品方案)
├── scripts/                      # CI 校验脚本(verify-packages.mjs 等)
├── .github/workflows/ci.yml
├── README.md, README.zh_CN.md
├── package.json, pnpm-workspace.yaml, pnpm-lock.yaml
└── tsconfig.json

包架构详情(聚合器模式、子路径导出、扩展包机制)见 架构 §1。

用户应用目录结构

ubean 应用的 srcDir(默认 <rootDir>/src)约定:

my-app/
├── src/                        # 可配置的 srcDir
│   ├── pages/                  # 文件式页面路由 (*.vue / *.md)
│   │   ├── (group)/            # 路由组:不影响 URL
│   │   ├── dashboard/
│   │   │   ├── index.vue
│   │   │   ├── profile.vue
│   │   │   └── settings.vue
│   │   ├── user/[id].vue       # 动态参数
│   │   ├── about.vue
│   │   └── index.vue
│   ├── routes/                 # API 路由 (void-style 命名导出)
│   │   ├── api/
│   │   │   ├── users/
│   │   │   │   ├── [id].ts     # export const GET / PATCH / DELETE
│   │   │   │   └── index.ts    # export const GET / POST
│   │   │   └── hello.ts
│   │   ├── sitemap.xml.ts
│   │   └── robots.txt.ts
│   ├── layouts/                # 布局 (default.vue 或 default/index.vue)
│   ├── middleware/             # 中间件 (global.* / <prefix>/*.ts)
│   ├── crons/                  # 定时任务 (defineScheduled)
│   ├── locales/                # i18n 消息 (en.json, zh-CN.json)
│   ├── components/             # 业务组件
│   ├── composables/            # 组合式函数
│   └── app.ts                  # 可选:defineApp(options)
├── public/                     # 静态资源
├── ubean.config.ts             # defineConfig(...)
├── env.d.ts
├── package.json
└── tsconfig.json

下一步

  • 架构 — 框架架构、数据流与配置系统。
  • 路由 — 文件式路由扫描与路由约定。
  • 快速开始 — 创建你的第一个 ubean 项目。