内部包
11 个 Monorepo 包的职责概览。
Raypx 的 Monorepo 包含 11 个内部包,每个包负责独立的业务领域。所有包由 Turborepo 统一编排构建。
包分类
基础设施包
| 包名 | 路径 | 说明 |
|---|---|---|
@raypx/env | packages/env/ | 环境变量定义和类型校验 |
@raypx/database | packages/database/ | 数据库客户端和 Drizzle Schema |
@raypx/auth | packages/auth/ | Better Auth 服务端配置和插件 |
功能包
| 包名 | 路径 | 说明 |
|---|---|---|
@raypx/email | packages/email/ | 邮件发送服务(Resend + React Email) |
@raypx/otp | packages/otp/ | 一次性密码生成和验证 |
@raypx/storage | packages/storage/ | 文件存储抽象层 |
@raypx/i18n | packages/i18n/ | 国际化配置和翻译工具 |
应用层
| 包名 | 路径 | 说明 |
|---|---|---|
@raypx/api | packages/api/ | oRPC 路由和 API 定义 |
@raypx/ui | packages/ui/ | 共享 UI 组件库 |
@raypx/config | packages/config/ | 共享配置(TypeScript、Biome 等) |
@raypx/types | packages/types/ | 共享 TypeScript 类型定义 |
核心包详解
@raypx/env
环境变量的集中定义,使用 Zod 进行类型校验:
- 定义所有环境变量的 Schema
- 在应用启动时校验环境变量是否完整
- 导出类型化的
env对象,供其他包引用
所有包的环境变量都应通过 @raypx/env 统一管理,避免分散定义。
@raypx/database
数据库客户端和 Schema 定义:
- Drizzle ORM 客户端实例
- 数据库表 Schema 定义(用户、会话、账户等)
- 数据库迁移文件
// 其他包引用数据库客户端
import { db } from "@raypx/database/client";
import { users } from "@raypx/database/schema";@raypx/auth
Better Auth 的服务端配置:
- 认证策略配置(邮箱密码、OAuth)
- 插件注册(双因素认证、组织管理等)
- 会话管理配置
@raypx/email
邮件发送服务:
- Resend 客户端配置
- React Email 邮件模板
- 邮件发送工具函数
支持发送验证邮件、密码重置邮件、OTP 邮件等。
@raypx/i18n
国际化基础设施:
- 翻译文件管理
- 语言检测逻辑
- 翻译工具函数
@raypx/otp
一次性密码服务:
- OTP 生成和验证
- 支持邮箱和短信通道
- 过期时间管理
@raypx/storage
文件存储抽象层:
- 统一的文件上传/下载接口
- 支持本地存储和 S3 兼容存储
- 文件类型校验和大小限制
依赖关系
包之间的依赖关系遵循单向依赖原则:
主应用 (src/)
├── @raypx/api
│ ├── @raypx/auth
│ ├── @raypx/email
│ └── @raypx/database
├── @raypx/ui
└── @raypx/i18n
@raypx/auth
├── @raypx/database
├── @raypx/otp
└── @raypx/email
@raypx/database
└── @raypx/env
@raypx/email
└── @raypx/env包之间禁止循环依赖。如果两个包需要互相引用,应将共享的类型或逻辑提取到 @raypx/types 或新建一个共享包中。
构建与开发
构建所有包
pnpm buildTurborepo 会自动分析依赖关系,并行构建互不依赖的包。
开发单个包
# 使用 turbo filter 只构建特定包及其依赖
pnpm turbo build --filter=@raypx/database添加新包
在 packages/ 目录下创建新目录,并在 package.json 中添加包名:
{
"name": "@raypx/my-package",
"version": "0.0.0",
"private": true,
"type": "module",
"exports": {
".": "./src/index.ts"
}
}然后在其他包的 package.json 中引用:
{
"dependencies": {
"@raypx/my-package": "workspace:*"
}
}