版本: v1.0 最后更新: 2026-04-03 受众: 开发者、架构师 阅读时间: 15 分钟
PostWaver 是一个本地优先的内容管理系统,采用模块化 Monorepo 架构,支持将 Markdown 内容发布到多个平台。
各包专注于单一职责:
高层模块不依赖低层模块,都依赖抽象:
┌─────────────────────────────────────────────────────────┐
│ 应用层 (Application) │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ Web UI │ │ Converter Web │ │
│ │ (React) │ │ (React) │ │
│ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────┐
│ 引擎层 (Engine) │
│ ┌────────────────────────────────────────────────┐ │
│ │ Engine (Hono.js) │ │
│ │ - API 服务器 │ │
│ │ - 工作流编排 │ │
│ │ - 预览系统 │ │
│ └────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────┐
│ 业务层 (Business) │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Core │ │ Linker │ │Transform │ │
│ │ 解析/扫描 │ │ 关系生成 │ │ 平台转换 │ │
│ └──────────┘ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────┐
│ 数据层 (Data) │
│ ┌──────────┐ ┌──────────┐ │
│ │ Database │ │ Config │ │
│ │(Prisma) │ │ Manager │ │
│ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────┐
│ 存储层 (Storage) │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ SQLite │ │ Markdown │ │ Hexo │ │
│ │ (元数据) │ │ (内容) │ │ (博客) │ │
│ └──────────┘ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────┘
职责: 用户界面和交互
组件:
技术:
职责: 工作流编排和 API 服务
组件:
技术:
职责: 核心业务逻辑
组件:
职责: 数据持久化和配置管理
组件:
职责: 底层存储
组件:
| 技术 | 版本 | 用途 |
|---|---|---|
| React | 18.2.0 | UI 框架 |
| React Router | 6.21.0 | 路由管理 |
| Vite | 5.0.11 | 构建工具 |
| TypeScript | 5.3.3 | 类型系统 |
| 技术 | 版本 | 用途 |
|---|---|---|
| Node.js | 18+ | 运行时 |
| Hono.js | Latest | Web 框架 |
| Prisma | 5.22.0 | ORM |
| SQLite | 3.x | 数据库 |
| 技术 | 版本 | 用途 |
|---|---|---|
| unified | 11.0.5 | 统一处理接口 |
| remark | 15.0.1 | Markdown 解析 |
| gray-matter | 4.0.3 | Frontmatter 解析 |
| juice | - | CSS 内联化(WeChat) |
| 工具 | 版本 | 用途 |
|---|---|---|
| pnpm | 8+ | 包管理器 |
| ESLint | Latest | 代码检查 |
| Prettier | Latest | 代码格式化 |
| Vitest | Latest | 测试框架 |
| TypeScript | 5.3.3 | 类型检查 |
| 工具 | 用途 |
|---|---|
| GitHub Actions | CI/CD |
| GitHub Pages | Web UI 部署 |
| Git | 版本控制 |
┌─────────────┐
│ 用户写作 │
│ Markdown │
└──────┬──────┘
↓
┌─────────────┐
│ 扫描内容 │ ← core/scanner
│ 生成 frontmatter │
└──────┬──────┘
↓
┌─────────────┐
│ 解析内容 │ ← core/parser
│ 提取图片 │
└──────┬──────┘
↓
┌─────────────┐
│ 生成关系 │ ← linker
│ 相关文章 │
│ 前后篇 │
└──────┬──────┘
↓
┌─────────────┐
│ 存储元数据 │ ← database
│ SQLite DB │
└──────┬──────┘
↓
┌─────────────┐
│ 平台转换 │ ← transformer
│ 格式适配 │
└──────┬──────┘
↓
┌─────────────┐
│ 上传图片 │ ← adapter
│ (如果需要) │
└──────┬──────┘
↓
┌─────────────┐
│ 发布到平台 │ ← adapter/engine
│ 或同步博客 │
└─────────────┘
Markdown 文件 → Scanner → Frontmatter 生成 → 数据库存储
Markdown → Parser → AST → 提取内容/图片
数据库查询 → Linker → 关系计算 → 相关文章列表
通用内容 → Transformer → 平台特定格式
转换后内容 → 模板注入 → Hexo 博客 → Git 提交
┌─────────────┐
│ web-ui │
│ converter-web│
└──────┬──────┘
│
┌──────▼──────┐
│ engine │
└──────┬──────┘
│
┌──────────────────┼──────────────────┐
│ │ │
┌───────▼────────┐ ┌───────▼────────┐ ┌──────▼─────┐
│ core │ │ linker │ │transformer │
└───────┬────────┘ └───────┬────────┘ └──────┬─────┘
│ │ │
└──────────────────┼──────────────────┘
│
┌──────▼──────┐
│ config │
└──────┬──────┘
│
┌──────▼──────┐
│ database │
└─────────────┘
| 包 | 职责 | 主要依赖 |
|---|---|---|
| core | 内容解析、扫描、注入 | database, linker |
| linker | 内容关系生成 | database |
| transformer | 平台格式转换 | 无 |
| adapter | 平台 API 适配 | 无 |
| database | 数据持久化 | 无 |
| config | 配置管理 | 无 |
| engine | 工作流编排、API | core, transformer, adapter, database, config |
| web-ui | React 界面 | engine |
| converter-web | 独立转换工具 | transformer |
步骤:
transformer/src/ 中创建新转换器Transformer 接口adapter/src/ 中实现平台 API(如需要)示例:
// transformer/src/to-newplatform.ts
export function transformToNewPlatform(content: string): string {
// 实现转换逻辑
}
步骤:
core/src/ 中创建新的注入器Injector 接口示例:
// core/src/custom-injector.ts
export function injectCustom(content: string, data: any): string {
// 实现注入逻辑
}
步骤:
database/prisma/schema.prisma 中定义模型prisma migratedatabase/src/dal/ 中创建 DAL 方法步骤:
engine/src/ 中添加路由想要贡献代码?请阅读 贡献指南。
最后更新: 2026-04-03 维护者: PostWaver Team 反馈: GitHub Issues