Raypx

内部包

11 个 Monorepo 包的职责概览。

Raypx 的 Monorepo 包含 11 个内部包,每个包负责独立的业务领域。所有包由 Turborepo 统一编排构建。

包分类

基础设施包

包名路径说明
@raypx/envpackages/env/环境变量定义和类型校验
@raypx/databasepackages/database/数据库客户端和 Drizzle Schema
@raypx/authpackages/auth/Better Auth 服务端配置和插件

功能包

包名路径说明
@raypx/emailpackages/email/邮件发送服务(Resend + React Email)
@raypx/otppackages/otp/一次性密码生成和验证
@raypx/storagepackages/storage/文件存储抽象层
@raypx/i18npackages/i18n/国际化配置和翻译工具

应用层

包名路径说明
@raypx/apipackages/api/oRPC 路由和 API 定义
@raypx/uipackages/ui/共享 UI 组件库
@raypx/configpackages/config/共享配置(TypeScript、Biome 等)
@raypx/typespackages/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 build

Turborepo 会自动分析依赖关系,并行构建互不依赖的包。

开发单个包

# 使用 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:*"
  }
}

相关文档

On this page