logo
mdocs
首页
特性
开始
文档
GitHub
首页
特性
开始
文档
GitHub
logo
mdocs

快速开始

安装
第一个知识库

AI 与 Agent

智能助手(AI)
Agent 开发闭环
CLI Token

核心概念

所见皆文件
工作空间
文档级邀请
无账户身份识别

使用指南

设置页面概览
Markdown 编辑
HTML 文档
流程图生成
知识图谱
草稿与同步
我的文章与邀请
文档收藏
文档评论
受限工作空间成员与模板
恢复码(兼容)

部署与配置

环境要求
配置文件
反向代理示例
客户端壳(Android / 桌面)
FAQ
更新日志
Previous Page知识图谱
Next Page我的文章与邀请
mdocs

Write freely. Never lose a word.

MIT License
产品
功能特性Agent 开发闭环竞品对比更新日志
资源
文档安装指南
社区
GitHub问题反馈
© 2026 mdocs · Made with ♥ by xuhuafeifei

#草稿与同步

#设计意图

编辑环境中存在一个天然矛盾:用户希望内容「随时保存,永不丢失」,但网络可能不稳定,服务器可能暂时不可用。mdocs 用本地优先 + 按需发布的草稿机制来解决这个问题。

#架构

用户编辑
    │
    ▼
Lexical 编辑器(富文本)
    │
    ├── 自动保存(1000ms 防抖)──────────────────┐
    │       │                                    │
    │       ▼                                    │
    │   IndexedDB(浏览器本地数据库)               │
    │   存储:正文 + 开编 commit(localBaseCommitId)│
    │                                              │
    ├── 自动发布(空闲 30 秒后)───────────────────┤
    │       │  (每 10 秒扫描一次)                  │
    │       ▼                                    │
    │   后端 API(更新正文 + 提交图)              │
    │                                              │
    ├── 手动「发布」──────────────────────────────┤
    │                                              │
    └── 失焦 / 切换标签页 ────────────────────────┘
             立即保存当前内容

#本地数据分工(v0.7.9+)

数据作用
IndexedDB 草稿未发布正文、标题、开编时的 localBaseCommitId
activeDocMeta(内存)当前打开这篇的服务端元信息(权限、路径、owner、当前 head 等),供界面共用;不含正文
编辑器显示与编辑正文;有草稿时以草稿为准,无草稿时以服务器 GET 为准

打开文档时:一定会请求服务器更新 meta;正文则 有草稿读草稿、无草稿读服务器,二者互斥,不会把两套正文混在一个对象里。

#三层保存策略

触发时机保存目标说明
编辑后 1 秒无操作IndexedDB防抖,避免频繁写入
编辑器失焦(blur)IndexedDB切换到其他元素时立即保存
标签页隐藏(visibilitychange)IndexedDB用户切走或关闭标签时保底

补充说明:

  • 首次编辑时才创建草稿(不是打开文档就创建)。
  • 首次落盘会记录 localBaseCommitId(开编时服务端 head)。
  • 后续自动保存只更新正文和标题,不重置开编基准。

#发布流程

#设置里的开关

打开 设置 → 保存与发布:

设置 → 保存与发布

项说明
自动保存(本地快照)内容持续写入浏览器本地快照,避免编辑丢失(界面展示为始终可用)
自动同步至云端空闲后把草稿推到服务器;网络不稳或多端冲突时可能暂停同步以保护数据
查看未发布草稿列出尚未成功发布到服务端的本地草稿,可点进对应文档继续编辑或手动发布

#自动发布(可选)

在设置中开启「自动同步至云端」后:

  • 每 10 秒扫描 IndexedDB;
  • 某篇草稿 超过 30 秒 没有新的自动保存 → 尝试发布。

#手动发布

  1. 点击「发布」
  2. 编辑器内容序列化后 PUT 到服务器(带开编 commit 做版本校验)
  3. 成功后:删除本地草稿 → 再 GET 拉取最新 meta;正文与刚发布内容一致时不重载编辑器 DOM(避免视口跳动),仅在服务端正文不一致时才整棵刷新编辑器

#无草稿也能发布

若打开后尚未触发自动保存(尚无 IndexedDB 草稿),仍可直接发布:内容以编辑器为准,版本号以当前 meta 中的 head 为准。

#发布失败

无论自动还是手动,失败时草稿一般仍保留在本地。

情况行为
任意自动发布失败(v0.8.5+)草稿标记 publishError,停止自动重试;设置页「未发布草稿」显示失败原因;手动点「发布」会先清除标记再重试
缺少版本基准多见于旧版创建的目录描述(___desc___.md);升级到 0.8.5+ 并重启服务后重新打开该目录可恢复;或删除本地草稿
自动发布 404服务端文档已删、本地仍有草稿;可 另存为新文档
409 版本冲突进入 版本冲突与合并 流程

重新打开文档且服务端已有 headCommitId 时,会自动补写草稿的 localBaseCommitId 并清除「缺版本基准」类失败标记。

#断网场景

  • 断网时:继续编辑,草稿在 IndexedDB
  • 重新打开:有草稿则恢复草稿正文;meta 仍会从服务器 GET(需联网)

#拉取更新(Pull)

  • 无未发布草稿:可拉取远端最新正文与 meta。
  • 有未发布草稿:不覆盖式 pull,避免误盖本地副本。

#设计取舍

  • 本地优先:编辑不依赖网络;恢复后自动或手动发布
  • 发布后强制对齐:删草稿 + GET,减少「单用户自动发布后又冲突」的困惑
  • IndexedDB:容量大、异步,不阻塞 UI