Markdown Editor 技术架构与实施计划
1. 规划结论
-
本项目已经基于 Electron、原生 HTML/CSS/JavaScript 实现了可运行的桌面端 Markdown 编辑器。
-
后续应以现有代码为基础渐进演进,不再将 Flutter 重写作为默认路线。
-
Windows/macOS 本地笔记库、可靠性基线、同步协议 v1 和托管同步 Beta 已经落地。
-
近期工作转向编辑与导出增强、同步 Beta 生产化、正式发布链路和真实负载验证;移动端与团队协作仍根据用户需求和运行数据单独决策。
整个产品遵循以下原则:
- 本地优先:无账号、无网络时仍可完整编辑和管理普通
.md文件。 - 开放格式:正文、附件和目录结构可被其他工具直接访问,不把用户数据锁进私有数据库。
- 可靠性优先:保存、恢复、外部文件变更和冲突处理先于高级语法与云功能。
- 渐进式改造:保留已实现行为,按模块提取现有代码,不进行无收益的全量重写。
- 协议先行:桌面端和未来移动端共享文件约定、同步协议和测试用例,而不是强求共享 UI 技术栈。
2. 当前架构基线
2.1 已有技术栈
- Electron 43.4.0,使用
electron-builder26.15.3 打包。 - 主进程:Node.js CommonJS,负责窗口、文件读写、图片落盘、Markdown 渲染、工作区和同步调度;托管同步请求通过 Electron
net.fetch发出。 - 预加载脚本:通过
contextBridge暴露受限 IPC 接口。 - 渲染进程:原生 HTML、CSS 和 JavaScript,无前端框架。
- Markdown:
markdown-it15.0.1,开启原始 HTML 解析和自动链接,普通源码换行遵循 CommonMark 的软换行行为;mermaid11.17.2 负责受控图表预览。 - HTML 安全:
sanitize-html2.17.7,配合页面 CSP。
2.2 已有产品能力
- 普通文件夹笔记库、目录树、搜索、批量失效链接检查、快速打开、最近文件、收藏和可恢复的文件管理操作。
- 多标签编辑、原子保存、按笔记库恢复未保存内容、外部文件监听和双版本冲突处理。
- 渲染端通过
renderer/editor/pages.mjs按文档 ID 保留独立的原生textarea、行号和查找高亮 DOM。 - 标签切换只切换叠放页面的可见性,不重写编辑器值,从而保留每个打开标签的滚动和选区。
- 由于 Chromium 的命令式编辑历史可能跨同一页面中的多个文本框,模块另以最多 200 个文本补丁为每个标签隔离撤销/重做记录,并把连续输入与输入法组合文本分别合并为自然的撤销单元。
- 文档模型独立保留最近一次成功保存的正文基线;输入、撤销或重做后的正文与该基线一致时清除未保存标记,越过保存点后再次出现差异时恢复标记,不以撤销栈是否为空作为判断依据。
- 可编辑正文中按
Tab插入两个空格;有选区时对选中的完整逻辑行统一缩进两个空格,按Shift+Tab则从每行移除最多两个前导空格。转换后继续选中处理过的行,支持一次撤销和重做,并同步更新文档和预览。 - 命令
editor.selectionToList有选区时切换选中的完整逻辑行,无选区时只切换光标当前行并保持逻辑光标位置;目标行全部带有-时统一移除,否则为未带标记的行补上-,包括选区中的空行。该命令在可编辑 Markdown 文档的命令面板中不依赖选区始终展示,默认快捷键为Alt+Shift+L,原生 Edit 菜单同步显示该 accelerator 但不重复注册按键,也可在快捷键设置中修改;菜单入口通过只读 IPC 通知复用同一渲染端命令。 - 可编辑正文中按
Ctrl+X(macOS 为Command+X),有选区时剪切选区,无选区时剪切光标所在的完整逻辑行(含换行符);末行没有后续换行符时删除前一个换行符,剪贴板保留末行正文,末尾空行剪切为换行符。 - 整行剪切支持未保存文档、空行以及撤销和重做;空文档不修改剪贴板,已保存文档继续保留跨文档粘贴时的相对图片路径调整。
Ctrl+C(macOS 为Command+C)无选区时按相同的逻辑行规则复制当前行,有选区时仅复制选区;复制不修改正文、光标位置或选区,支持未保存文档,空文档保持剪贴板不变。Ctrl+Tab等组合键保留原有快捷键行为;只读编辑器和输入法组合输入期间不处理缩进。
- 渲染端通过
- GFM 与 Mermaid 实时预览、标题大纲、双向滚动同步、编辑/预览页内查找(全部结果与当前结果分层高亮)、源码位置高亮和完整键盘导航。
- 页面内查找的状态、事件与定位集中在
renderer/find/controller.mjs,样式集中在renderer/find/styles.css。 - 编辑器查找打开期间持续使用与命中标记共享文本流的完整源码背板,同步原生
textarea的横纵滚动位置;焦点返回正文后仍保留高亮,并由原生textarea继续提供光标、选区和输入语义。 - 结果导航及页面缩放重排后,编辑器查找直接根据命中标记的实际矩形补偿横纵视口,避免中英文混排或无换行长行因估算坐标产生偏移、结果落在视口之外。
- 搜索框保持打开但焦点返回编辑器时,
Escape仍会关闭搜索框。 - 预览搜索框保持打开时,焦点位于预览正文、正文链接或搜索栏按钮上,
Escape也会关闭搜索框并清除搜索高亮,焦点返回预览正文。 - 预览内容因编辑而重渲染时,仅针对新 DOM 重建查找范围,不把普通内容刷新解释为结果导航,从而避免第一个结果的定位滚动反向重置编辑区。
- 应用快捷键通过
renderer/keyboard/shortcuts.mjs精确匹配声明的修饰键,未声明的Shift、Alt或同时按下 Command 与 Control 都不会触发命令。
- 页面内查找的状态、事件与定位集中在
- 本地图片与剪贴板图片落盘、
assets/相对路径管理,以及移动/复制/跨文档粘贴时的图片路径调整。 - 托管同步 Beta:账号、自动同步、仓库发现与克隆、revision/cursor、Markdown 保守三方合并与冲突版本、设备、配额、版本历史和原始库导出。
- ESLint、Node 单元测试、Electron 冒烟测试、Windows/macOS CI 和未签名目录打包。
2.3 当前限制
- 编辑器仍基于原生
textarea;预览已有去抖和过期结果丢弃,但超大文档编辑体验仍需真实设备数据验证。 - Mermaid 已实现;代码高亮、脚注、数学公式以及 PDF/HTML 等正式导出能力尚未完成。
- Windows/macOS 可以生成测试制品,但正式签名、公证、自动更新和升级回滚链路尚未交付。
- 托管同步仍为单节点 Beta,不包含非图片通用附件、密码重置、团队共享、端到端加密、对象垃圾回收或产品化的版本保留策略。
- iOS、Android 和 Web 客户端尚未立项实现。
3. 原规划需要调整的内容
| 原规划 | 调整 | 原因 |
|---|---|---|
| Flutter 四端统一为推荐方案 | Electron 继续承担 Windows/macOS;移动端单独立项 | 当前已有 Electron 产品,重写会丢失已有投入;Electron 不能直接覆盖 iOS/Android |
| 一开始覆盖四端 | 先桌面双端,再决定移动端 | 文件系统、后台同步和编辑交互的平台差异很大,应先验证核心体验 |
| 同时建设自研云和四家云盘接入 | 第一阶段支持普通本地目录;系统云盘目录天然可用,自研同步后置 | 多套同步引擎会成倍扩大冲突、权限和测试矩阵 |
| Markdown 文件采用二进制差分上传 | 首版按完整文件上传,附件按内容哈希去重 | Markdown 通常较小,差分算法的复杂度和故障面收益有限 |
| 以时间戳决定冲突胜者 | 使用服务端版本号/基线版本检测;冲突时两份都保留 | 设备时钟不可靠,自动覆盖可能造成不可恢复的数据丢失 |
| 对所有冲突进行“智能合并” | 仅对存在共同祖先且修改区间不重叠的 Markdown 执行保守三方合并;其余情况保留 Base/Local/Remote | Markdown 结构合并容易破坏列表、代码块和引用,无法证明安全时必须交给用户处理 |
.lock 防止多设备同时打开 |
本机进程锁只处理本机并发;跨设备依赖版本协议 | 云盘无法可靠同步锁的生命周期,陈旧锁会阻塞正常使用 |
| SQLite 文件放在笔记库内 | 不在仓库内放 SQLite;同步基线、队列和 cursor 使用 .mynote 下的轻量 JSON |
保持仓库状态可定位、可随仓库移动,同时避免数据库锁定与恢复复杂度 |
客户端库级 AES 加密与纯 .md 同时成立 |
先使用操作系统磁盘保护、HTTPS 和服务端存储加密;端到端加密单独设计 | 加密后的文件不再是可被其他工具直接读取的纯 Markdown,两者需作为不同模式明确取舍 |
| Go + MySQL + Redis + 对象存储一次到位 | 同步服务从单体 API、关系数据库和对象存储起步,达到规模指标后再引入 Redis | 早期没有需要独立缓存和消息基础设施的负载证据 |
| 2 核 4G 支撑万级用户 | 通过压测和同步负载模型确定容量 | 用户数不能代表在线连接数、附件流量和版本存储量 |
| 4 个月完成完整清单 | 以里程碑和验收门槛推进,不承诺未经估算验证的总工期 | 原清单同时包含编辑器、四端、云服务、加密和企业能力,范围远超单一版本 |
4. 当前客户端架构
4.1 进程职责
┌──────────────── Renderer ────────────────┐
│ UI / 编辑器 / 标签 / 目录树 / 预览 / 搜索 │
└───────────────────┬──────────────────────┘
│ 类型化、白名单 IPC
┌──────────────── Preload ─────────────────┐
│ 参数收敛 / 通道封装 / 不暴露 Node 能力 │
└───────────────────┬──────────────────────┘
│
┌────────────── Electron Main ─────────────┐
│ 窗口生命周期 / 文件服务 / 监听 / 系统集成 │
│ 工作区服务 / 恢复服务 / 同步调度 / 安全边界 │
└───────────────┬───────────────┬──────────┘
│ │
普通文件、assets、.mynote 应用数据目录
同步状态 JSON 偏好 / 恢复稿 / 凭据
4.2 模块边界
当前代码已经形成以下边界:
-
window/menu:窗口创建、安全配置、菜单、退出和外链处理;原生窗口菜单使用所有平台一致的Ctrl+Shift+Alt+S在已打开窗口间循环聚焦。window-hotkey:注册Alt+Shift+S系统级热键;主窗口已显示且激活时最小化,已显示但未激活时置于前台并激活,隐藏或最小化时恢复显示并激活。
-
workspace-manager/workspace-state-store:笔记库选择、目录扫描、搜索、最近记录、收藏和路径约束。主进程为每个BrowserWindow创建独立WorkspaceManager,IPC 按请求所属窗口解析当前库;WorkspaceStateStore仍共享最近列表、偏好和后台同步配置。 -
outline-index-store/quick-open-search/shared/markdown-outline:原子持久化大纲缓存、后台增量校验、拼音检索,以及大纲面板和索引共用的标题解析规则。 -
broken-links/renderer/search/editor:解析仓库内 Markdown 与 HTML 链接,校验本地路径和标题锚点,并生成可跳回源码位置的只读诊断报告;协议链接不发起网络请求。 -
file-service/file-access/document-watcher:授权文件读取、原子写入和外部变化监听。 -
recovery-store:按笔记库隔离恢复会话并隔离损坏状态。 -
markdown-service/markdown-images:Markdown 解析清洗、源码范围和图片路径处理。 -
渲染端
document/store/preview/outline/preview/mermaid:标签状态、标题大纲和受控 Mermaid 渲染。 -
渲染端启动入口
renderer.js:加载按document、editor、find、keyboard、preview、sync和workspace归类的 ESM 工具,再按顺序装载renderer/runtime下的核心、编辑器、同步中心、工作区和事件模块;这些片段共享原有页面状态机,避免拆分时改变交互行为,并由专用脚本合并后执行 ESLint。 -
渲染端样式:基础工作区、对话框与响应式样式分别位于
renderer/styles/base.css、renderer/styles/dialogs.css和renderer/styles/responsive.css,页面查找样式独立位于renderer/find/styles.css。 -
sync-handlers/sync/*:按需加载的同步入口、账号编排、仓库状态机、协议校验、持久化队列、自动调度和远端适配器。 -
同步客户端:
sync/client/local负责初始化、扫描和队列协调,sync/client/files负责文件写入、合并和冲突副本,sync/client/transfer负责上传、拉取、恢复及运行状态,sync/client/helpers保存共享安全辅助逻辑,目录入口sync/client/index组合公开类。 -
server/hosted-sync:独立托管 HTTP 服务、SQLite 元数据、加密对象存储、备份和运维脚本。 -
托管存储:
store/index保留账号、设备、仓库和操作事务,store/versions负责历史、快照、恢复、导出与指标,store/validation负责账号和设备输入约束。 -
暂不为了“架构统一”引入大型 UI 框架。
-
只有当目录树、设置、版本历史和冲突界面的状态复杂度成为明确瓶颈时,才通过小型原型决定是否迁移到 React/Vue 等方案。
正文搜索目前保留在工作区服务的内存缓存中;大纲索引使用仓库 .mynote 下的版本化 JSON。达到性能阈值后再评估 SQLite FTS。
4.3 数据约定
笔记库保持用户可读:
笔记库/
├── 任意目录/
│ └── note.md
├── assets/
│ └── image.png
└── .mynote/
├── library.json # 库 ID 和格式版本,不存账号密钥
├── outline-index-v1.json # 可重建的大纲、文件修改时间和源码位置缓存
└── sync-hosted-v1/
└── <账号命名空间>/
└── state.json # 基线、队列、cursor 和诊断日志
仓库级同步元数据和可重建的大纲索引放在 .mynote,路径不使用仓库绝对路径哈希;大纲索引不参与应用同步。以下设备或应用级数据仍放在操作系统应用数据目录,不进入笔记库:
- 最近打开的库、窗口状态和用户偏好。
- 正文搜索内存缓存、标签和星标。
- 自动恢复稿。
- 登录令牌;令牌应使用系统安全凭据存储。
标签和星标若需要跨工具可移植,后续可选择 YAML front matter;若只服务本应用,则保存在元数据中。该选择应先通过产品需求确认,避免悄悄修改用户正文。
5. 当前同步架构与演进边界
5.1 首版协议
每个库、文件和设备使用稳定 ID。路径是可变属性,不能兼任文件身份。每次变更记录:
libraryId、fileId、规范化相对路径和内容哈希。baseRevision、操作类型、设备 ID 和客户端操作 ID。- 服务端生成的单调递增 revision 和时间;客户端时间只用于展示。
同步过程:
- 本地操作先原子写盘,再写入持久化变更队列。
- 客户端按操作 ID 幂等上传完整 Markdown 文件或附件对象。
- 服务端仅在
baseRevision等于当前 revision 时接受覆盖。 - revision 不一致时下载双方版本,保留原文件并创建冲突副本。
- 客户端拉取游标后的远端变更,应用成功后再推进本地游标。
- WebSocket 只用于“有新版本”的提示,正确性仍依赖可重试的拉取接口。
删除采用墓碑记录,不能立即物理删除;当前不预设固定保留期。附件按 SHA-256 内容寻址和账号内去重,v1 不实现块级差分。当前字段、压缩快照、崩溃恢复和冲突矩阵见阶段 5 账号与托管同步 Beta,端到端源码位置见同步流程与代码位置。
5.2 当前服务端组成
- 单体 HTTP API:账号鉴权、仓库、操作提交、变更拉取、设备、配额、版本、导出、指标和客户端报告。
- SQLite 元数据:账号、设备、会话哈希、仓库、文件、版本、幂等结果、对象计量和审计事件。
- AES-256-GCM 加密对象目录:保存 Markdown 与图片历史正文;对象键不直接使用用户输入路径或明文内容哈希。
- 运维工具:在线 SQLite 备份、加密对象复制、校验清单、恢复演练和负载基准。
当前没有产品化的历史清理、孤立对象回收或主密钥轮换任务。只有目标环境压测和运行指标证明单节点 SQLite 架构达到瓶颈时,才迁移受支持的数据库驱动、拆分服务或引入缓存/消息基础设施。
5.3 云盘兼容边界
OneDrive、iCloud Drive 等在桌面端首先按“用户选择的普通文件夹”处理,不承诺应用理解其云端同步状态。应用负责检测文件变化并避免静默覆盖,但不再额外实现每家云盘 API。
6. 安全与可靠性基线
- 保持
contextIsolation: true、nodeIntegration: false和严格 CSP。 - IPC 通道使用白名单,并在主进程校验参数、文件扩展名和规范化后的路径边界。
- 链接导航先按外部 URL、当前文档标题、库内 Markdown 文档和独立文档旁的相对 Markdown 文件分流;库内路径继续经过工作区边界校验,独立文档链接由主进程基于已授权源文件解析和读取。
- 外部链接只允许 HTTP、HTTPS 和邮件协议,并由主进程调用系统应用打开;其他协议不会执行。
- 库内 Markdown 链接读取失败时使用非模态应用内提示,避免原生错误对话框导致编辑器失焦;保留来源文档的光标位置,允许直接继续输入。
- 原有原生 alert 提示统一使用
renderer/dialogs/alert.mjs提供的自定义模态框,沿用新建文件对话框样式,仅显示一个“确定”按钮;Enter 确认、Escape 关闭。 - 提示内容按纯文本展示并保留换行,长消息可以滚动;连续消息按队列逐条确认,不覆盖尚未读完的消息。
- 关闭提示后恢复原控件焦点、文字选区方向及滚动位置;也支持从设置等已有模态框中弹出错误提示后返回原输入框。
- 异步操作等待确认后继续后续流程;同步未保存检查仍立即阻止操作,文件删除事件保留恢复稿后显示提示。初始化错误也使用同一提示组件。
- 关闭未保存标签、移入回收站、删除远端仓库、设备退出、版本恢复及退出时恢复稿保存失败的确认均使用应用内“确定 / 取消”模态框;Escape 等同取消,取消后恢复原输入焦点及选区。
- 未保存标签在确认前保持打开;重复确认请求按取消处理,避免将另一个操作的确认结果用于当前操作。源码不再调用原生 alert、confirm 或 prompt。
- Markdown HTML 必须经过清洗;Mermaid、数学公式等扩展逐项评估 CSP 和脚本执行风险。
- 保存采用“同目录临时文件 → 刷盘 → 原子替换”,并处理 Windows 文件占用失败。
- 文件监听事件需要去抖,并区分应用自身保存与外部修改。
- 自动恢复稿不能替代用户文件;正常保存后清理,异常退出后明确提示恢复。
- 自动更新必须校验签名;Windows 和 macOS 发布包分别执行签名、公证和升级回滚验证。
- 端到端加密作为独立设计,不在未定义密钥恢复、设备加入和搜索能力前进入实现阶段。
7. 分阶段实施计划
每个阶段必须通过验收门槛后再扩大范围。优先级按 P0、P1、P2 表示。
阶段 0:工程与安全基线(P0,已完成)
目标
让现有功能可持续修改和发布。
- 升级到受支持的 Electron、Markdown 和清洗依赖版本,逐项回归现有功能。
- 增加 lint、格式检查、单元测试和最小端到端测试。
- 为打开、保存、图片插入、Markdown 清洗、未保存关闭建立回归用例。
- 收紧 IPC 参数校验、外链处理和错误返回;渲染层不直接获取系统能力。
- 建立 Windows/macOS CI 构建;先生成测试制品,再配置正式签名。
- 按模块提取现有代码,保持界面和功能不变。
验收
自动化检查在两端通过;核心操作有回归覆盖;安全检查无已知高危问题;现有功能无回退。
完成状态
- 2026-08-14 已升级运行时依赖,建立 lint、单元测试、Electron 冒烟测试、性能基准、Windows/macOS CI 和未签名测试制品构建。
- 主进程已拆分文件、Markdown、IPC、校验和窗口模块,并增加文件授权与外链安全边界。
- 验证范围见阶段 0 工程基线。
阶段 1:可靠的本地编辑(P0,已完成)
目标
即使崩溃、断电或文件被其他程序修改,也不静默丢失内容。
- 原子保存、另存为、编码/换行策略和明确错误提示。
- 定时恢复稿、异常退出恢复和工作区/标签会话恢复。
- 外部文件变更监听;无本地修改时重载,有本地修改时进入冲突对比。
- 大文档渲染去抖、取消过期任务,并建立性能基准。
- 完整键盘操作、焦点管理和基础无障碍检查。
验收
通过崩溃恢复、磁盘写入失败、外部并发修改和大文档测试;任何失败都不覆盖唯一副本。
完成状态
- 2026-08-14 已实现原子保存、另存为、严格 UTF-8 与换行保留、会话和未保存内容恢复、关闭前刷新、外部文件监听、双版本冲突处理、文件删除保护、预览去抖与过期结果丢弃,并补齐标签键盘语义和焦点样式。
- 设计与验证范围见阶段 1 可靠性设计。
阶段 2:桌面笔记库 MVP(P0,已完成)
目标
从“文件编辑器”升级为可日常使用的本地笔记应用。
- 打开/切换笔记库、最近笔记库和目录树。
- 新建文件夹、重命名、移动、复制、移入系统回收站。
- 文件名和正文搜索;先采用简单索引,达到性能阈值后再引入 SQLite FTS。
- 最近文件、星标和基础设置。
- 统一附件策略,并处理文件移动后的相对图片引用。
验收
在约定规模的测试库中,扫描、搜索和文件操作达到性能目标;所有破坏性操作可恢复或二次确认。
完成状态
- 2026-08-14 已实现笔记库恢复与切换、目录树、新建/重命名、移动、复制、系统回收站、文件名与正文搜索、最近文件、收藏和基础设置。
- 工作区真实路径边界与符号链接逃逸会被拒绝,移动文档时同步迁移打开状态并调整常见 Markdown 图片相对路径。
- 设计、限制与 1000 文件基准见阶段 2 桌面笔记库。
阶段 3:编辑与导出增强(P1)
目标
补齐高频 Markdown 工作流,不扩大同步复杂度。
- 根据用户反馈选择代码高亮、任务列表、脚注、目录和数学公式。
- Mermaid 采用隔离渲染或严格安全模式,不能放宽整个页面 CSP。
- PDF/HTML 导出优先;Word 和长图在需求验证后再做。
- 编辑器能力不足成为明确瓶颈时,再评估 CodeMirror 6 或 Monaco 的原型迁移。
验收
扩展语法有快照测试和恶意输入测试;导出结果在 Windows/macOS 进行视觉回归。
当前状态
- Mermaid 围栏预览、错误降级和回归测试已经交付。
- 代码高亮、脚注、数学公式及 PDF/HTML 导出仍需按用户反馈确定优先级后实施。
阶段 4:同步协议原型(P1,已完成)
目标
先证明不丢数据的同步模型,再建设正式云产品。
- 在独立测试环境实现版本号、游标、幂等操作、墓碑和冲突副本。
- 构建设备离线、乱序、重复请求、重命名/删除冲突和网络中断测试矩阵。
- 客户端同步模块按需加载,不阻塞编辑和启动。
- 提供可理解的同步状态、失败重试和诊断日志。
验收
双设备随机操作和故障注入测试无数据丢失;协议文档和回归测试固定当前 v1 契约。
完成状态
- 2026-08-23 通过独立文件式模拟服务端验证了
fileId、revision、cursor、幂等操作、墓碑及冲突副本协议 v1。 - 2026-08-25 产品运行时已移除本地模拟模式,仅保留托管同步;协议测试继续使用测试目录内的内存远端替身。
- 2026-08-27 按产品决定在不升版本号、也不兼容旧客户端的前提下,把 v1 拉取改为每个
fileId只返回最终状态的单次压缩快照,并补充重复修改一次合并、批次中断恢复和重命名路径循环测试。 - 当前契约与恢复规则统一记录在阶段 5 账号与托管同步 Beta。
阶段 5:账号与托管同步 Beta(P1,已完成)
目标
把已验证协议产品化。
- 账号、设备、配额、对象存储、版本历史和远程登出。
- 默认强制 HTTPS、系统凭据存储、服务端静态加密、审计和备份恢复演练;受控开发网络可通过
MYNOTE_SYNC_FORCE_HTTPS=false显式关闭双端 HTTPS 限制。 - 分批发布、指标监控、崩溃报告和协议成套升级策略。
- 版本历史保留时间与配额由产品和成本模型决定,不预设固定 30 天。
验收
完成安全评审、容量压测、备份恢复和灰度升级;Beta 用户可以导出完整原始库。
完成状态
- 2026-08-23 已交付可独立部署的单体托管服务、SQLite 关系元数据、AES-256-GCM 加密对象存储、账号、设备、配额、版本历史、远程登出,以及使用系统安全凭据的桌面 Beta 客户端。
- 已加入审计、Prometheus 指标、客户端错误报告、在线备份验证和空目录恢复演练。
- 2026-08-27 的 v1 压缩快照需要客户端与服务端同步升级,不兼容旧分页实现;客户端仍可导出服务端持有的完整原始 Markdown 库。
- 部署、安全评审、容量基线和剩余 Beta 风险见阶段 5 账号与托管同步 Beta。
阶段 6:移动端可行性与产品决策(P2)
目标
根据桌面端和同步 Beta 的数据决定是否投入 iOS/Android。
- 明确移动端是轻量阅读/快速记录,还是完整编辑器。
- 对 Flutter、React Native 和原生方案做文件访问、后台同步、编辑器性能原型。
- 复用同步协议、Markdown 兼容测试和设计规范,不默认复用桌面 UI 代码。
- iOS/Android 分别验证 Files/SAF、离线队列和系统后台任务限制。
验收
原型达到启动、编辑、文件访问和同步可靠性目标后再进入正式开发。
阶段 7:高级能力(P2)
以下能力分别立项,不纳入基础版本承诺:
- 端到端加密及密钥恢复。
- 团队共享、权限、评论和实时协作。
- Web 编辑器。
- 插件系统、AI 辅助和思维导图。
- 企业 SSO、私有化部署和管理审计。
8. 测试与质量策略
- 单元测试:路径处理、文档状态、Markdown 清洗、同步状态机和冲突规则。
- 集成测试:IPC 契约、原子保存、文件监听、附件移动和本地元数据恢复。
- 端到端测试:新建到保存、异常退出恢复、目录操作、搜索和冲突界面。
- 兼容测试:Windows/macOS 的路径、权限、中文文件名、长路径和换行符。
- 安全测试:恶意 Markdown、危险链接、目录穿越、超大文件和畸形图片。
- 同步测试:模型测试与故障注入,覆盖重复、丢包、乱序、离线和版本升级。
- 性能指标:启动时间、输入延迟、预览耗时、目录扫描、搜索和托管同步延迟;已有基准用于比较相对回退,发布前仍需在目标设备、磁盘和网络环境复测。
- 文件规模:人工维护的 JavaScript、CSS、HTML、JSON 和 Markdown 文件通过
npm run check:file-length检查,单文件上限为 600 行;自动生成的package-lock.json不参与该检查。
9. 近期执行清单
阶段 0、1、2、4、5 已完成。后续工作按风险和用户价值排序:
- 根据用户反馈确定阶段 3 剩余编辑语法和 PDF/HTML 导出的最小范围,不扩大同步协议复杂度。
- 完善托管同步 Beta 的生产化边界:固定受支持运行时、评估数据库驱动迁移、主密钥轮换、版本保留和对象垃圾回收。
- 在目标磁盘、正文尺寸和并发度下复测同步容量,并补齐 HTTP 延迟、状态码、进程资源和备份时长监控。
- 建立 Windows/macOS 正式签名、公证、自动更新和升级回滚验证链路。
- 根据桌面端与同步 Beta 的使用数据决定是否启动移动端文件访问、后台同步和编辑性能原型。
每项继续拆分为独立、可回归的小提交;同步协议破坏性变化必须明确选择版本升级/双栈迁移,或像当前 v1 压缩快照一样安排停止流量后的成套升级。
10. 已确定与待决事项
已确定的架构选择包括:
- Electron 继续承担桌面端。
- 客户端正文保持普通文件。
- 应用级状态使用 JSON;托管服务元数据使用 SQLite,正文使用加密对象目录。
- 产品同步入口只连接托管服务。
- 同步协议继续使用 v1,拉取采用不兼容旧实现的单次压缩快照,上传身份、幂等、revision 和墓碑字段保持现状。
以下问题仍需在对应阶段用原型、目标环境数据或用户反馈决策:
- 是否引入前端框架,以及选择哪一个框架。
- 是否用 CodeMirror 6/Monaco 替换
textarea。 - 阶段 3 各项扩展语法和导出格式的优先级。
- 托管服务何时从单节点
node:sqlite迁移到受支持的数据库驱动或多节点架构。 - 版本保留期、对象垃圾回收和配额成本模型。
- 移动端的产品范围和技术栈。
- 是否提供端到端加密,以及它与全文搜索、版本历史和开放文件格式的取舍。
