技术深度剖析
Memos 表面看似简单,实则体现了深思熟虑的工程权衡。其核心是一个单一的 Go 二进制文件,同时提供 API 和前端服务,编译后的 Docker 镜像不到 20MB。这种单体架构虽然不符合微服务潮流,却是针对目标用户(希望零运维成本的个人和小团队)的刻意选择。
架构:
- 后端: 使用 Go 编写,默认采用 SQLite 数据库(最新版本支持 PostgreSQL)。选择 SQLite 至关重要——它消除了对独立数据库服务器的需求,使部署变成一条命令即可完成(`docker run -d -p 5230:5230 ghcr.io/usememos/memos`)。API 采用 RESTful 风格,提供简单的 JSON-over-HTTP 接口。
- 前端: 使用 React 和 TypeScript 构建,编译为静态资源,由 Go 二进制文件提供。UI 设计刻意保持简洁:单列时间线、用于新建笔记的浮动操作按钮、以及一个搜索栏。没有文件夹、没有标签(虽然通过内容中的 #hashtag 支持标签),没有复杂的层级结构。
- 存储: 笔记以行形式存储在 SQLite 中,但每条笔记的内容都是纯 Markdown。数据库 schema 极其精简:`memo` 表包含 id、content、creator_id、visibility 和 timestamps 列。这种简洁性意味着备份非常简单——只需复制 SQLite 文件即可。
关键工程决策:
1. 无富文本编辑器: Memos 使用纯文本输入框配合 Markdown 预览。这避免了 WYSIWYG 编辑器的复杂性(需要 contenteditable 技巧、撤销栈和复杂的状态管理),并将客户端包大小控制在约 200KB(gzip 压缩后)。
2. 可见性控制: 每条笔记可设置为公开、受保护(需登录)或私有。这种粒度支持多种使用场景,例如公开笔记(如个人博客),同时保护敏感笔记。
3. REST API 作为功能: API 设计为可供第三方客户端使用。社区已构建了移动应用(如 iOS 端的 MoeMemos、第三方 Android 客户端)和 CLI 工具来与 API 交互。这种可扩展性是强大的杠杆。
性能基准测试:
| 指标 | Memos(SQLite,单用户) | Notion(云端) | Obsidian(本地) |
|---|---|---|---|
| 冷启动(首次加载) | ~150ms | ~2s | ~500ms |
| 笔记创建延迟 | ~5ms | ~200ms | ~10ms |
| 搜索 1 万条笔记 | ~15ms | ~800ms | ~50ms |
| 空闲内存占用 | ~25MB | ~150MB(浏览器标签页) | ~80MB(应用) |
| 每 1K 笔记存储 | ~500KB | ~5MB(估算) | ~2MB |
数据洞察: Memos 在延迟和资源使用方面比云端 Notion 快一个数量级,同时达到或超过本地优先的 Obsidian。其代价是 Memos 没有离线支持(需要运行中的服务器),但低资源占用缓解了这一问题——它可以在每月 5 美元、512MB 内存的 VPS 上运行。
该项目的 GitHub 仓库(usememos/memos)是开源治理的典范:超过 200 名贡献者、清晰的 CONTRIBUTING.md 文件、以及活跃的 issue 分类。代码结构良好,包含 `api`、`store`、`server` 和 `web` 等独立包。最近的提交集中在添加 PostgreSQL 支持(面向需要复制的用户)和用于自定义存储后端(如 S3、WebDAV)的插件系统。
关键参与者与案例研究
Memos 生态系统不仅限于核心项目——它是由第三方工具和集成组成的星座,扩展了其影响力。
核心团队:
- boojack(Steven) 是主要维护者,一位中国开发者,于 2022 年将 Memos 作为个人项目启动。他的理念明确反对功能膨胀:“Memos 不是 Notion 的替代品。它是你显示器上便利贴的替代品。”该项目没有风险投资,没有公司背景——纯粹是社区努力。
值得注意的集成与分支:
- MoeMemos(iOS): 社区构建的 iOS 客户端,将 Memos API 封装为原生 SwiftUI 应用。它支持小组件、快捷指令和 Apple Watch 输入,实际上将 Memos 变成了系统级的捕获工具。
- Memos Raycast 扩展: 面向 macOS 用户,Raycast 扩展允许通过热键创建 memo,弥合了 Web 应用与桌面之间的差距。
- Telegram 机器人: 多个社区机器人(如 `memos-bot`)允许将 Telegram 消息转发到 Memos 实例,使其成为个人知识收件箱。
- 自托管替代方案对比:
| 功能 | Memos | Outline Wiki | Standard Notes | Joplin |
|---|---|---|---|---|
| 部署方式 | 单个 Docker 容器 | Docker + PostgreSQL | Docker + PostgreSQL | 桌面应用 + 同步 |
| 设置难度 | 1 条命令 | 5 条命令 | 3 条命令 | 原生安装 |
| Markdown 支持 | 原生 | WYSIWYG + Markdown | Markdown | Markdown |
| 移动应用 | 仅第三方 | 无 | 官方 | 官方 |
| 加密 | 静态加密(SQLite) | 静态加密 | 端到端加密 | 静态加密 |
| 协作 | 只读分享 | 完整团队协作 | 无 | 无 |
| GitHub