11 KiB
Strapi 替代方案 — 差距分析与路线图
目标:高性能、高安全性、高扩展性的 Strapi 替代品
当前完成度:约 55%
| 类别 | 完成度 | 说明 |
|---|---|---|
| 核心架构 | 95% | Handler→Service→Model、插件系统、CMS 引擎 |
| 认证/权限 | 80% | JWT + RBAC,缺密码重置 |
| Content Type | 90% | Builder UI + 动态 CRUD,缺组件/动态区块 |
| Admin UI | 70% | 20 个模块,缺 Relation Picker、批量编辑 |
| 媒体 | 50% | 上传/缩略图,缺裁剪/焦点/多格式 |
| 基础设施 | 75% | Worker/Cron/Webhook/搜索,缺 SMTP/重试日志 |
| Strapi 标配功能 | 20% | 缺 GraphQL/内容 i18n/导入导出/主题 |
逐项差距分析
1. GraphQL API — 缺失 (0%)
现状:项目仅支持 REST API,所有路由注册在 /api/v1/。Cargo.toml 中无任何 GraphQL crate。
Strapi:提供完全自动生成的 GraphQL API(queries、mutations、subscriptions),支持过滤、分页、排序、关联自动解析。
差距:
- 无 GraphQL schema 生成
- 无 GraphQL 查询引擎
- 无 subscription(实时数据推送)
- 无 GraphQL playground
2. Content-Type Builder UI — 完成 (~90%)
现状:
- 完整的 Content-Type Builder 页面(1013 行),支持创建/编辑 content type
- 字段类型:text, richtext, email, password, uid, integer, bigint, decimal, float, date, datetime, time, boolean, enum, json, media, relation
- 字段配置:required, unique, private, immutable, label, description, default, max_length, min/max, enum_values, relation config, media config
- 字段上下移动排序、删除字段
- draft/publish, timestamps, soft_delete, slug_field 开关
Strapi 额外能力:
- 拖拽排序(本项目用上下箭头)
- 组件/可组合类型(Component,可复用字段组)
- 动态区块(Dynamic Zone,运行时选择组件类型)
- Schema 实时预览
3. 媒体库 — 部分 (~50%)
现状:
- 上传/下载/删除,MIME 校验 + magic-byte 验证
- 网格/列表视图、搜索、按类型过滤、排序
- 详情面板(类型、大小、尺寸、URL、日期)
- 自动缩略图生成(WebP,后台 Worker)
- 存储抽象(Local + S3)
- 统计端点
Strapi 额外能力:
- 裁剪/焦点编辑 UI
- 多格式/响应式图片变体(srcset)
- 焦点选择(smart cropping)
- 文件夹/相册组织
- 多文件上传进度条
4. 内容 i18n(每条记录多语言)— 缺失 (0%)
现状:仅有 UI 层面 的 i18n(rust_i18n + next-intl,支持 en/zh-CN)。posts 表无 locale 列,无 translation_of 外键,无记录级翻译管理。
Strapi:每条内容可有 en/zh/fr 等多语言版本,管理员在编辑界面切换语言,支持回退 locale。
差距:
- 无 per-record 多语言模型
- 无语言切换 UI
- 无 fallback locale 逻辑
- 无翻译同步机制
5. Admin 关联管理 — 部分 (~30%)
现状:Content-Type Builder 支持定义 relation 字段,后端有完整的 relation 解析(批量 ManyToOne/OneToOne/OneToMany/ManyToMany)。但 前端 relation 字段渲染为普通文本 Input,用户必须手动输入关联记录 ID。
Strapi:完整的 Relation Picker,支持搜索、分页、多选(ManyToMany)、从 Picker 内直接创建关联记录。
差距:
- 无下拉/combobox 浏览选择关联记录
- 无搜索联想
- 无分页浏览
- 无内联创建关联记录
- 不显示关联记录的 title/name(仅显示原始 ID)
6. 用户/角色管理 UI — 完成 (~80%)
现状:
- 用户管理页(列表、创建、改角色、分页)
- RBAC 页(角色 CRUD、权限管理、系统角色保护)
- 后端完整的 role/permission 数据库操作
Strapi 额外能力:
- 管理员编辑其他用户的资料(email/username/bio)
- 用户封禁/停用/暂停
- 用户头像管理
- 更细粒度的字段级权限控制
- 可视化权限矩阵编辑器
7. Webhook 投递重试 — 部分 (~60%)
现状:
- Worker 框架级指数退避重试(base × 2^attempt + jitter)
- 最大重试次数(默认 3),死信队列
- 死信任务可手动重试
- HMAC-SHA256 签名
- Webhook handler 非 2xx 返回 error 触发重试
Strapi 额外能力:
- 每个订阅独立配置重试策略
- 投递日志/历史(每次尝试的响应码、响应体)
- Webhook 调试 UI
- 自动熔断/禁用失败 webhook
8. 邮件发送 (SMTP) — 缺失 (0%,仅有 stub)
现状:SendWelcomeEmailHandler 仅 log 到控制台,有注释掉的 SMTP 代码。AppConfig 无 SMTP 字段,Cargo.toml 无 lettre 依赖。
Strapi:完整的邮件 Provider 系统,支持 SendGrid、Mailgun、Amazon SES、自定义 SMTP。
9. 密码重置流程 — 缺失 (0%)
现状:Auth handler 支持 register/login/refresh/logout/change_password。无 forgot-password/reset-password endpoint,无 reset token,无相关 UI。
Strapi:完整的 forgot-password → 邮件 token → reset-password 流程。
10. API 版本管理 — 部分 (~20%)
现状:所有 API 路由挂在 /api/v1/,仅为 URL 前缀。
Strapi:支持多版本并行、版本协商、废弃通知。
11. 插件市场 — 部分 (~50%)
现状:
- 插件管理 UI(列表、启用/禁用/重载/删除)
- 完整插件系统(WASM/JS/Lua 三引擎)
- 插件热重载、健康监控、VFS、权限、存储
- 扩展安装/启用/禁用/卸载
Strapi 额外能力:在线 Marketplace,浏览/搜索/一键安装社区插件。
12. 主题系统 — 极少 (~10%)
现状:仅有 dark/light CSS 切换(next-themes + Tailwind dark mode)。
Strapi:管理面板主题引擎(自定义颜色/logo/字体)+ 公开主题市场 + 模板引擎。
13. 导入/导出 — 缺失 (0%)
现状:无任何导入导出功能。
Strapi:WordPress 导入器、CSV/JSON 导入、全库导出/导入、实例间迁移。
14. 内容审核 — 部分 (~60%)
现状:
- 评论审核队列 UI(状态过滤、审批/拒绝/删除、批量操作)
- 评论创建默认 pending,仅 approved 公开显示
- 插件 hook
on_comment_creating - 嵌套评论深度验证(最多 3 层)
Strapi 额外能力:垃圾评论检测/过滤、自动审批规则、AI 内容审核。
15. 定时发布 — 部分 (~40%)
现状:
ScheduledPublishHandler完整实现并通过测试- 已注册到 handler registry
- 但没有任何代码触发它:
JobEnqueuer不处理ScheduledPublish,DTO 无publish_at字段,无 UI 设置发布时间
Strapi:编辑器设置发布日期,系统自动在指定时间发布。
路线图
Phase 1 — 补齐基础体验(2-3 周)
目标:用户能完整使用,不卡在基本流程上
| # | 任务 | 优先级 | 工作量 |
|---|---|---|---|
| 1.1 | SMTP 邮件发送(lettre + 配置) | P0 | 2天 |
| 1.2 | 密码重置流程(forgot/reset endpoint + 邮件) | P0 | 1天 |
| 1.3 | 定时发布对接(handler 已有,加 glue code) | P0 | 0.5天 |
| 1.4 | Relation Picker UI(下拉搜索选择关联记录) | P0 | 2天 |
| 1.5 | Webhook 投递日志(delivery history + 重试 UI) | P1 | 1天 |
Phase 2 — Admin UI 打磨(2-3 周)
目标:Admin 体验不输 Strapi
| # | 任务 | 工作量 |
|---|---|---|
| 2.1 | Content-Type Builder 拖拽排序(dnd-kit 替代箭头) | 1天 |
| 2.2 | 批量操作(列表页多选 + 批量删除/发布/移动) | 2天 |
| 2.3 | 媒体库增强(文件夹组织 + 多文件上传进度条) | 2天 |
| 2.4 | 内联编辑器(列表页直接编辑字段,不用进详情) | 2天 |
| 2.5 | Admin 全局搜索(Cmd+K 弹窗,搜索所有资源) | 1天 |
Phase 3 — 核心差异化功能(3-4 周)
目标:补齐 Strapi 标配 + 发挥 Rust 优势
| # | 任务 | 工作量 |
|---|---|---|
| 3.1 | GraphQL API(async-graphql + 自动 schema 生成) | 5天 |
| 3.2 | 内容 i18n(locale 列 + translation_of FK + Admin 切换) | 3天 |
| 3.3 | 导入导出(JSON/CSV + WordPress 导入器) | 3天 |
| 3.4 | 实时 API(SSE → WebSocket 升级 + 订阅过滤) | 2天 |
| 3.5 | Dashboard 仪表盘(统计图表 + 最近活动 + 快捷操作) | 2天 |
Phase 4 — 开发者体验(2-3 周)
目标:让其他开发者愿意用
| # | 任务 | 工作量 |
|---|---|---|
| 4.1 | 文档站(Getting Started + API Reference + Plugin 开发指南) | 5天 |
| 4.2 | Demo 站点(在线体验,预装示例数据) | 2天 |
| 4.3 | 一键部署(docker compose up 3 分钟跑起来) |
2天 |
| 4.4 | Plugin CLI(rblog plugin new/create/publish) |
3天 |
| 4.5 | TypeScript SDK 生成(从 OpenAPI spec 自动生成) | 2天 |
Phase 5 — 插件生态(3-4 周)
目标:有可用的官方插件
| # | 任务 | 工作量 |
|---|---|---|
| 5.1 | 插件市场 UI(浏览/搜索/一键安装) | 3天 |
| 5.2 | 插件注册中心(简单的 registry API + 存储) | 3天 |
| 5.3 | 官方插件:Stripe 支付 | 3天 |
| 5.4 | 官方插件:Algolia/Meilisearch 搜索 | 2天 |
| 5.5 | 官方插件:邮件营销 | 3天 |
| 5.6 | 官方插件:AI 内容生成 | 3天 |
Phase 6 — 企业级功能(4-6 周)
目标:能卖给企业
| # | 任务 | 工作量 |
|---|---|---|
| 6.1 | SSO/SAML | 5天 |
| 6.2 | 审计日志增强(导出 CSV、合规报告) | 2天 |
| 6.3 | 内容审批工作流(多级审批、评论批注) | 5天 |
| 6.4 | 主题引擎(模板系统 + 主题市场) | 5天 |
| 6.5 | PostgreSQL 生产支持 | 5天 |
| 6.6 | 多数据库连接(读写分离) | 3天 |
总时间估算
| 阶段 | 时间 | 里程碑 |
|---|---|---|
| Phase 1 | 2-3 周 | 可自用的完整 CMS |
| Phase 2 | 2-3 周 | Admin 体验达标 |
| Phase 3 | 3-4 周 | 功能对齐 Strapi |
| Phase 4 | 2-3 周 | 开源发布就绪 |
| Phase 5 | 3-4 周 | 有插件生态 |
| Phase 6 | 4-6 周 | 企业可用 |
| 总计 | 16-23 周 | Strapi 替代 |
核心竞争优势
vs Strapi
| 维度 | raisfast | Strapi |
|---|---|---|
| 性能 | 单实例 10x QPS,内存 1/10 | Node.js 需要集群才能到千级 QPS |
| 部署 | 单二进制 30MB,零依赖 | Node.js 18+ + npm + PostgreSQL,200MB+ |
| 插件安全 | WASM 沙箱隔离,插件崩溃不影响主进程 | JS 插件直接 require(),一个 crash 全挂 |
| 冷启动 | <100ms | 3-5 秒 |
| 二进制安全 | 编译型,源码不可逆 | JavaScript 源码可直接阅读 |
| GC | 无 GC 暂停 | V8 GC 导致 P99 延迟毛刺 |
| 单机密度 | 一台 1C1G VPS 跑几十个站点(SQLite) | 每个站点需要独立进程 + 数据库连接 |
独特卖点
- WASM 插件沙箱 — Strapi 完全没有的安全隔离机制,是构建可信插件市场的前提
- 极致轻量部署 — 30MB 单文件替代 Node.js 全家桶,适合嵌入式、边缘、IoT 场景
- SQLite 原生架构 — 多租户托管成本极低(每站点一个 .db 文件),不依赖外部数据库
- 三引擎插件 — WASM + JS + Lua,开发者可按需选择性能/生态平衡点