新增共享 Preview Engine,统一 Web 连续预览、快速分页、Playwright PDF 与 Electron PDF;实现稳定前缀复用和修改位置后的增量分页,保留媒体块按文档顺序串行回填与单次重排。 完善跨端链接与桌面文档工作流:Web 受控处理锚点和 HTTP/HTTPS 外链;Desktop 支持本地路径、file URI、系统协议、多窗口、同文件单例、Markdown 当前或新窗口打开,以及聚焦时外部文件变化提示。 统一四套内置主题名称并默认使用 Typora Github;修复连续预览双滚动条、ECharts 尺寸、PDF 本地链接、围栏代码块 Typora DOM 与重复行内样式;桌面发行链强制完整重建内嵌 Web,避免安装包携带陈旧资源。 发布 Web/Compose 与 Windows NSIS/ZIP:镜像 yixiong/md-to-pdf:v0.5.0 已健康部署;NSIS SHA-256 为 60992D1FDCA513F46346C78478537EB4159D8C0E76B41ECF3CDC25BE77707D92,ZIP SHA-256 为 D74F82293FB67126E583546CBA894569EFC9A0B1B6343FAC648CCC95F1D188D8,本机安装版已升级至 v0.5.0。 验证:全项目 238 项测试通过,类型检查、生产构建和 git diff --check 通过;Web 快速/连续/精确预览、Compose、Desktop 多窗口、窗口状态、文件关联、链接与代码块均完成真实环境验收。
Desktop 桌面端
apps/desktop 是 Electron 桌面应用。当前已经完成 Electron 壳、受限
preload、进程内应用服务、原生 Markdown 打开与保存、同目录图片解析、
本地主题目录、隐藏分页窗口、Electron Chromium PDF 输出和 Windows
安装包。
桌面端会记住上次窗口的位置、尺寸和最大化状态;窗口变化后延迟写入,
异常退出后也能恢复。恢复时会按当前显示器工作区修正位置与尺寸,避免窗口
落在屏幕外。Windows 安装包会注册 .md 和 .markdown 文件关联,
双击文件或使用“打开方式”会在对应文档窗口中加载文件;同一文件只保留
一个窗口,其他文件可以同时使用多个窗口。
窗口每次获得焦点时会检查源文件是否被其他程序修改。检测到变化后提示 重新加载,避免阅读或导出磁盘旧版本。
“打开 Markdown”是顶部独立主操作;新建文档、保存 Markdown 和打开 自定义主题目录收纳在“更多”菜单中。新建文档未保存时显示“未命名文档”, 首次保存默认使用一级标题作为文件名;没有一级标题时使用首行文本,并会 自动清理 Windows 非法文件名字符。新文档无需先保存即可直接导出 PDF。
开发
从仓库根目录运行:
npm run desktop:dev
桌面端不启动 Fastify,也不占用本地 HTTP 端口。React 界面通过受限 IPC
调用 packages/application 中的 Markdown 渲染和主题服务,PDF 由
Electron 自带 Chromium 生成。Web 与 Docker 继续通过 Fastify HTTP
适配器使用同一套应用服务。
构建与打包
npm run build -w @md-to-pdf/desktop
npm run desktop:package
npm run make -w @md-to-pdf/desktop
package 和 make 会先调用根级 build:web-runtime,完整重建
Markdown ECharts、Core、Renderer、Application、Preview Engine 和 Web,
然后才复制 apps/web/dist。不得绕过该链路直接调用 electron-builder。
版本化目录包、NSIS Setup.exe 和 ZIP 输出到
apps/desktop/out/v0.5.0/。该目录被 Git 忽略。公司内部分发以
md-to-pdf-0.5.0-x86_64-Setup.exe 为正式安装包,ZIP 作为免安装
辅助包;当前未配置代码签名,Windows 首次运行可能显示“未知发布者”
提示。
NSIS 使用标准辅助安装模式,支持选择当前用户/所有用户安装和自定义安装 目录,并创建桌面及开始菜单快捷方式。正式安装包作为 Gitea Release 附件 发布,不提交进 Git 历史。
桌面和开始菜单快捷方式由 build/installer.nsh 显式创建,安装完成后的
“运行”操作直接启动 md-to-pdf.exe,不依赖快捷方式文件。
产品名称、窗口标题、安装包名称和开始菜单名称保持为
“Markdown PDF 导出器”,实际 Windows 主程序与进程文件固定为
md-to-pdf.exe。
当前目录包只包含一套 Electron Chromium,不携带 Playwright Chromium。
Web 静态资源作为只读资源放在 Electron resources/dist 下,生产环境通过
mdpdf://bundle/ 自定义协议加载。
链接与窗口行为
- 当前文档
#anchor在当前预览中定位; - HTTP/HTTPS 链接交给系统默认浏览器;
mailto:等系统协议交给操作系统处理;- 上级相对路径、本地绝对路径和
file:URI 均可尝试通过系统打开; - Markdown 文件会提示在当前窗口或新窗口打开;
- 同一规范化文件路径只允许一个窗口,重复打开时聚焦已有窗口;
- 本地目标不存在时显示明确错误,不允许链接替换预览 iframe。
发行包只保留 Electron 的简体中文和英文语言包,其他 Chromium 运行时 组件保持完整,以兼顾安装体积和不同 Windows 图形环境下的运行可靠性。
安全边界
- 应用窗口和 PDF 窗口均关闭 Node Integration;
- 启用 Context Isolation 和 Chromium Sandbox;
- preload 只暴露打开 Markdown、渲染、主题、生成 PDF 和保存 PDF 所需 的窄接口;
- 本地图片只能从当前 Markdown 所在目录内读取,并拒绝路径穿越和符号 链接越界;
- 主进程校验 IPC 发送者和分页载荷;
- PDF 窗口使用独立内存 Session,并阻止外部网络资源;
- 应用页面使用自定义协议,不使用
file://。