架构概览
系统架构概览和设计决策。
Raypx 的架构设计遵循分层解耦的原则,每一层都有明确的职责边界。
系统分层
展示层
React 19 + TanStack Router + Tailwind CSS 4
API 层
oRPC + Zod Schema 校验
业务逻辑层
Better Auth + 自定义 Server Functions
数据访问层
Drizzle ORM + PostgreSQL
基础设施层
Nitro + Vite 8 + Docker
展示层
展示层负责 UI 渲染和用户交互,基于以下技术构建:
- TanStack Router — 类型安全的文件路由,支持 SSR、SSG 和客户端渲染
- React 19 — 配合 React Compiler 实现自动性能优化
- Tailwind CSS 4 — 原子化 CSS 框架
- shadcn/ui — 基于 Radix UI 的无障碍组件库
- Fumadocs — 文档站 UI 和搜索功能
API 层
API 层提供类型安全的接口,确保前后端数据契约一致:
- oRPC — 类型安全的 RPC 框架,与 TanStack Start 深度集成
- Zod — Schema 定义和运行时校验,提供端到端的类型推导
- Better Auth API — 认证相关的 RESTful 接口
业务逻辑层
业务逻辑层处理核心业务规则和认证流程:
- Better Auth — 用户注册、登录、OAuth、会话管理等
- Server Functions — TanStack Start 的服务端函数,直接在路由中调用
数据访问层
数据访问层负责数据库交互:
- Drizzle ORM — 类型安全的 SQL 查询构建器
- PostgreSQL — 关系型数据库,提供事务支持和复杂查询能力
基础设施层
基础设施层提供运行环境和部署能力:
- Nitro — 服务端运行时,处理 SSR 和 API 路由
- Vite 8 — 构建工具和开发服务器
- Docker — 容器化部署
设计原则
Raypx 遵循以下核心设计原则:
类型安全优先
从数据库 Schema 到 API 接口再到 UI 组件,全链路保持类型安全:
Drizzle Schema → oRPC Contract → React 组件 PropsZod Schema 作为唯一的数据源,自动推导 TypeScript 类型,确保各层数据结构一致。
关注点分离
每一层只负责自己的职责:
- 展示层不直接访问数据库
- API 层不包含业务逻辑
- 数据访问层不关心 HTTP 请求细节
约定优于配置
遵循框架的约定来减少配置:
- 文件路由——按目录结构自动生成路由
- 环境变量——统一的
.env文件管理配置 - 代码规范——Biome 统一格式化和检查规则
可扩展性
通过 Monorepo 和模块化设计支持扩展:
- 新增业务包只需在
packages/下创建新目录 - 新增 API 端点只需在路由文件中导出函数
- 新增数据库表只需在 Drizzle Schema 中定义
数据流
一个典型的请求处理流程如下:
浏览器请求
↓
中间件链(i18n → auth)
↓
路由匹配
↓
Server Function / oRPC Handler
↓
Drizzle ORM 查询
↓
PostgreSQL
↓
响应返回详细的生命周期说明请参考请求生命周期。
Monorepo 架构
项目使用 pnpm workspaces 管理内部包,通过 Turborepo 优化构建性能:
- 11 个内部包——按业务领域划分,职责单一
- Turborepo 管道——并行构建,增量缓存
- 严格依赖关系——包之间通过显式依赖引用,禁止循环依赖