编辑环境中存在一个天然矛盾:用户希望内容「随时保存,永不丢失」,但网络可能不稳定,服务器可能暂时不可用。mdocs 用本地优先 + 按需发布的草稿机制来解决这个问题。
| 数据 | 作用 |
|---|---|
| IndexedDB 草稿 | 未发布正文、标题、开编时的 localBaseCommitId |
| activeDocMeta(内存) | 当前打开这篇的服务端元信息(权限、路径、owner、当前 head 等),供界面共用;不含正文 |
| 编辑器 | 显示与编辑正文;有草稿时以草稿为准,无草稿时以服务器 GET 为准 |
打开文档时:一定会请求服务器更新 meta;正文则 有草稿读草稿、无草稿读服务器,二者互斥,不会把两套正文混在一个对象里。
| 触发时机 | 保存目标 | 说明 |
|---|---|---|
| 编辑后 1 秒无操作 | IndexedDB | 防抖,避免频繁写入 |
| 编辑器失焦(blur) | IndexedDB | 切换到其他元素时立即保存 |
| 标签页隐藏(visibilitychange) | IndexedDB | 用户切走或关闭标签时保底 |
补充说明:
localBaseCommitId(开编时服务端 head)。在 设置 中开启「自动同步至云端」后:
PUT 到服务器(带开编 commit 做版本校验)若打开后尚未触发自动保存(尚无 IndexedDB 草稿),仍可直接发布:内容以编辑器为准,版本号以当前 meta 中的 head 为准。
无论自动还是手动,失败时草稿一般仍保留在本地。
| 情况 | 行为 |
|---|---|
| 任意自动发布失败(v0.8.5+) | 草稿标记 publishError,停止自动重试;设置页「未发布草稿」显示失败原因;手动点「发布」会先清除标记再重试 |
| 缺少版本基准 | 多见于旧版创建的目录描述(___desc___.md);升级到 0.8.5+ 并重启服务后重新打开该目录可恢复;或删除本地草稿 |
| 自动发布 404 | 服务端文档已删、本地仍有草稿;可 另存为新文档 |
| 409 版本冲突 | 进入 版本冲突与合并 流程 |
重新打开文档且服务端已有 headCommitId 时,会自动补写草稿的 localBaseCommitId 并清除「缺版本基准」类失败标记。