MDeX-1.4.0
v1.4.0
本版为"硬化 + 架构升级"大版本:集中修复代码审查报告中的数据完整性 / 并发 / 安全 / 性能缺陷
,
首次引入自动化测试(CI + 前后端单测),并将前端模块化、加 TypeScript 类型护栏、会话持久化迁移到 IndexedDB 混合。
修复 / Fixes(数据完整性)
- 保存写入改为原子写(崩溃/断电/磁盘满不再留半截文件丢原内容)。Save writes atomically (crash-safe).
- 跨盘另存为不再丢图片:草稿首存到 U 盘/网络盘,复制失败中止并保留源(此前静默跳过后删源
致两处皆失)。 - 两窗口草稿图片不再互相覆盖:草稿目录按窗口隔离。
- 同一文件不再能在两窗口同时打开:已被别的窗口持有时置顶该窗口,杜绝并发存盘互相覆盖。
- 重启后双击同一文件不再开重复窗口:会话恢复后重新登记已打开文件。
- GBK / Latin-1 / UTF-16 等非 UTF-8 文件可正常打开(兜底解码 + 剥 BOM)。
- "已保存"不再掩盖图片断链:图片迁移/引用回写失败时保持未保存并提示。
- 外部修改检测:保存时若文件已被别的程序改过,弹"覆盖/从磁盘重载/取消",不再静默覆盖。
修复 / Fixes(安全 / 并发 / 性能)
- 构造
<img src=敏感文件>不再泄露本地文件:后端按 magic bytes + 扩展名白名单仅放行真实图片(含 AVIF/HEIF)。 - mermaid SVG 输出加纵深消毒(DOMPurify SVG profile,失败安全回退);KaTeX 显式
trust:false。 - 关标签用对象引用重定位(不再 splice 错标签);确认弹窗加重入锁;切换/关闭取消待渲染。
- 撤销栈 / 图片缓存 / 导航历史内存封顶(撤销 48MB 字节预算、imgCache LRU 200、navStack 500)。
- 关闭窗口前确认未保存标签(onCloseRequested 拦截;viewer 窗口排除)。
- 关闭前同步刷盘(pagehide/visibilitychange)挽回 ≤500ms 编辑。
- 会话过大/损坏不再静默失败:IDB 主存突破 5MB 配额 + localStorage 回退 + 一次性提示。
- 另存为找不到源图时不再改写引用为断链路径(保留原引用 + 提示"保存失败 images")。
- 修复 mermaid Viewer 窗口无法关闭(关窗拦截误注册到 viewer 窗口);进一步改为结构性门
控:viewer 窗口根本不注册关窗拦截。 - 修复 mermaid 图节点标签消失(过度消毒剥掉了
foreignObject标签)——回退冗余的 SVG 消毒,安全门回到 mermaidstrict/ KaTeXtrust:false。 - 修复蒙古语"MDeX简介"末尾混入乌尔都语(既有翻译错)。
新增 / Added
- 自动化测试:20 个前端纯函数测试(
npm test)+ 15 个 Rust 单测(cargo test)+ GitHub Actions CI(push/PR 自动跑)。 - 前端模块化:应用逻辑抽到
src/app.js,构建期内联(不引入打包器,保持单文件离线产物)。 - TypeScript 类型护栏:
tsconfig.json+// @ts-check+ JSDoc(@typedef Tab等),tsc --noEmit零错误。
修复 / Fixes(公式渲染,1.4.0 后续 hotfix)
- 超长 LaTeX 公式超宽时按运算符折行,不再出现横向滚动条:单行公式按
=/+/-折行;align/gather等多行环境逐行折行(align保留=对齐、续行\notag不重复编号);cases/matrix等无可折点的回退等比缩小。折行位置随预览栏宽度实时重排(ResizeObserver监听、debounce 重算)。 - 编号不被折行公式覆盖:迭代实测第一行内容右边界 vs 编号左边界(绕过 KaTeX 离屏量宽与实际渲染的偏差);
\begin{env}...\end{env} \tag{x}中环境外的\tag不再被丢弃。