Files
new-markdown/docs/05-stage1-report.md

6.1 KiB
Raw Permalink Blame History

阶段 1 · 基础桌面应用报告(实测记录)

日期:2026-11-13 · 范围:Tauri 工程、主窗口、标题栏、菜单栏、标签页、侧边栏、编辑器容器、状态栏、基础主题 + 打开/编辑/保存全链路。

1. 本阶段实现内容

  • 正式工程:仓库根目录建工程(src/ + src-tauri/,结构按架构 §6);阶段 0 的 prototype/ 保留为验证资产,其测试被根工程继续引用执行。
  • Tauri 2 壳:decorations: false 自定义标题栏窗口(1280×820,最小 920×600,居中);identifier app.newmarkdown.desktop;打包目标 nsis/msi;图标全套新生成(石板底文档 + M/↓ 字形,未用任何现成品牌图)。
  • Rust 命令层(src-tauri/src/commands.rs):read_text_file(UTF-8/BOM/UTF-16/GBK 探测、换行符识别)、write_text_file(同目录临时文件 + sync + 原子替换,可保留 BOM)、list_dir(文件夹优先排序、只收 md/markdown/txt、跳隐藏项)。前端一切磁盘访问只走 services/platform.ts。
  • 标题栏:图标 + 文档名 + 未保存圆点 + 窗口控制(最小化/最大化还原/关闭,走 Tauri window API,能力已在 capabilities 授权)。
  • 菜单栏:文件/编辑/段落/格式/视图/帮助六组,全部条目为真实动作。段落与格式直接走 Milkdown 命令(一命令一步撤销);文件组含最近文件(localStorage,阶段 4 迁 SQLite);编辑组粘贴用 execCommand(WebView2 支持,阶段 2 评估换 Clipboard API 时复核)。
  • 标签页:新建/打开/激活/关闭、拖拽排序、右键菜单(关闭/关闭其他/关闭右侧)、未保存圆点、关脏标签弹三选确认(保存/不保存/取消,批量关闭同理)。会话模型为纯 reducer(stores/tabs.ts),同路径重复打开只激活不重复建签,dirty 由正文与已保存正文比较得出。
  • 侧边栏:文件/大纲双页签。大纲实时提取(跳过代码块内 #)、点击定位(渲染模式滚动到标题、源码模式移动光标);文件树懒加载逐层展开、刷新、当前文件高亮。侧边栏开关与宽度、主题偏好持久化(localStorage)。
  • 状态栏:字数(中文按字/英文按词)/字符/光标行列(由 ProseMirror 选区推导)/总行数/编码/换行符/保存状态/编辑模式/缩放/运行模式。
  • 编辑器容器:阶段 0 工厂产品化(src/editor/),切标签卸载前回写序列化文本不丢内容;源码模式整区切换、切回重建模型;缩放 70%–140%。
  • 基础主题:浅色/深色双主题(CSS 变量,深色为深灰非纯黑),视图菜单切换。
  • Web 降级模式:浏览器打开时打开文件走 file input、保存走下载,状态栏明示「Web 降级模式(调试)」,窗口控制与打开文件夹自动隐藏/禁用,不冒充桌面能力。

2. 构建与测试结果(实跑)

项 结果
npm install(根工程) ✅
类型检查 tsc -b ✅ 0 错误(过程修 1 处:commandsCtx.call 的 CmdKey 泛型擦除)
自动化测试 vitest run ✅ 18/18(新增 tabs 4 + text 6 + 编辑器回归 2,阶段 0 原型套件 6 一并重跑全绿)
生产构建 npm run build ✅(JS 大包警告仍在,阶段 6 分包)
Vite dev 冒烟 ✅ HTTP 200,页面与模块正常下发
Rust 逻辑实测 ✅ 把正式 commands.rs(仅剥 tauri 宏行)编入独立校验 crate 实跑断言:BOM/CRLF 识别、GBK 解码、原子写覆盖 + BOM 保留、临时文件不残留、list_dir 过滤与排序——全部通过
tauri info ✅ 配置解析通过,crate 解析到 tauri 2.12.5;仅报 Linux webkit 系统库缺失(见已知问题)
Tauri 完整构建 ⚠️ 未在本沙箱完成:沙箱镜像把 libzstd1 钉在定制版上,apt 装不了 GTK/WebKit 开发包(链断在系统层,非工程问题)。Windows 上按官方前置(Rust + VS Build Tools + WebView2)执行 npm run tauri dev 即首次真机构建,已列入验收清单。

3. 已知问题与取舍

  1. Ctrl+0 双义:需求表把 Ctrl+0 同时给「段落」与「恢复默认缩放」。本实现取「段落」(与 Typora 一致),恢复缩放走视图菜单,快捷键弹窗内有说明。阶段 6 自定义快捷键时可再改派。
  2. 最近文件/界面偏好暂存 localStorage:SQLite 按架构排在阶段 4(文件管理阶段)统一落库,本阶段不提前引入数据库。
  3. 粘贴走 execCommand('paste'):在部分 WebView2 权限策略下可能被拒;若 Windows 实测粘贴菜单不可用,阶段 2 改走 Milkdown clipboard 插件 + Tauri clipboard 权限处理(编辑器内 Ctrl+V 粘贴不受此影响,走浏览器原生粘贴事件)。
  4. 阶段 0 人工清单(IME 手感等)仍未销账,与本阶段 Windows 清单合并验证最省事。

4. Windows 验收清单(大王)

前置:装 Rust stable(rustup)、Visual Studio Build Tools(C++ 桌面开发)、WebView2(Win11 自带)。

cd new-markdown
npm install
npm run tauri dev
  • 窗口启动,自定义标题栏可拖动、双击最大化、三个窗口按钮可用
  • 打开一个真实 .md(含 GBK 编码的老文件各一),内容正确、状态栏编码/换行符正确
  • 改两笔 → 标题栏与标签出现未保存圆点 → Ctrl+S 保存 → 圆点消失,用外部编辑器确认落盘内容
  • 打开文件夹 → 文件树展开、点开第二个文件成新标签;拖拽标签排序;右键关闭其他
  • 关一个未保存标签 → 弹保存确认,三选都试一遍
  • 视图:深色主题、源码模式切回不丢内容、Ctrl+= 放大
  • 顺带把阶段 0 的 IME 清单一并验了(微软拼音 + 搜狗各一段长句)

5. 下一阶段(阶段 2)预告

Markdown 编辑器核心深化:标记显隐装饰(当前节点显示语法标记)、源码模式换 CodeMirror 6 并做双向选区同步、列表/引用/代码块的完整键盘行为、IME 守卫与专项测试、把阶段 0/1 人工清单中发现的问题清零。