feat: 发布 v0.4.0 桌面端
This commit is contained in:
+111
-10
@@ -33,8 +33,9 @@ ec48bce chore: 初始化项目骨架
|
||||
|
||||
最新阶段已完成 Markdown ECharts YAML 围栏、统一 SVG 渲染与分页,
|
||||
并完善默认示例、源文本收起、顶栏文档状态和快速页码跳转。
|
||||
当前正在推进 `v0.3.1` ECharts 第二阶段,扩展层级图、关系图和更多
|
||||
业务图表类型。
|
||||
`v0.4.0` 桌面端阶段已经完成:共享应用服务、无 Server 的 Electron
|
||||
运行时、三套内置主题、统一品牌资源、Windows 安装包以及 Docker Compose
|
||||
发布候选均已通过验证。
|
||||
|
||||
## 2. 已完成
|
||||
|
||||
@@ -80,7 +81,10 @@ ec48bce chore: 初始化项目骨架
|
||||
- 主题 CSS 相对资源重写与受限资源接口;
|
||||
- 目录匹配、真实路径包含关系和外部 URL 安全检查。
|
||||
|
||||
内置主题为项目自有实现,没有复制 Typora 官方默认主题。用户可以通过导入工具将本机已安装的 Typora 基础 CSS以及 GitHub、Pixyll 和 Whitey 三套适合打印的白色默认主题复制到 Git 忽略的 `.local/themes`。这些副本仅供本机使用,不进入仓库、容器或发布包。
|
||||
内置主题包含项目自有的 Typora 风格主题,以及按公司内部私有项目决策
|
||||
复制的 GitHub、Pixyll 和 Whitey 三套 Typora 默认主题。三套复制主题的
|
||||
来源和内部使用边界记录在 `themes/INTERNAL_THEME_NOTICE.md`;如未来公开、
|
||||
商用或向公司外部分发,必须重新完成许可证审查。
|
||||
|
||||
### 2.4 Markdown 渲染核心
|
||||
|
||||
@@ -319,6 +323,57 @@ ec48bce chore: 初始化项目骨架
|
||||
强制关闭 ECharts 动画、动画延迟和持续时间,不允许 YAML 动画参数使
|
||||
预览或 PDF 停留在动画中间帧。
|
||||
|
||||
### 3.12 v0.4.0 Electron 桌面端
|
||||
|
||||
- 新增 `apps/desktop` Electron 43.2.0 工作区,使用 Electron Forge
|
||||
7.11.2 打包。
|
||||
- 根项目版本升级为 `0.4.0`,Vite 从根 `package.json` 注入统一版本,
|
||||
工具标题右侧显示 `v0.4.0` 徽标。
|
||||
- 应用窗口和 PDF 窗口均关闭 Node Integration,启用 Context Isolation
|
||||
和 Chromium Sandbox,并使用不同 preload 暴露窄 IPC 接口。
|
||||
- 桌面端 PDF 直接接收 Web 端已经构造的共享分页载荷,复用现有
|
||||
`PagedDocumentRuntime`、主题 CSS、Mermaid 和 ECharts 运行时。
|
||||
- 隐藏 PDF 窗口使用 Electron 自带 Chromium 的
|
||||
`webContents.printToPDF()`,桌面发行包不携带 Playwright Chromium。
|
||||
- Paged.js 的帧队列在纯隐藏窗口中不会推进;桌面 PDF 任务期间使用
|
||||
计时器调度分页队列,分页完成后恢复原生 `requestAnimationFrame`。
|
||||
- Chromium 打印前将透明、不可聚焦、不进入任务栏的 PDF 窗口短暂放到
|
||||
屏幕外,使复杂分页页面拥有可打印的窗口表面,用户不会看到该窗口。
|
||||
- PDF Buffer 通过受控 IPC 返回 Web 界面,桌面端使用系统“另存为”对话框
|
||||
写入文件;Web 版继续使用浏览器下载行为。
|
||||
- 生产页面通过 `mdpdf://bundle/` 自定义安全协议加载,不使用权限过宽的
|
||||
`file://`;PDF Session 只允许同源、`data:`、`blob:` 和 `about:`
|
||||
资源。
|
||||
- Windows x64 未签名目录包、Squirrel `Setup.exe` 和 ZIP 已由 Forge
|
||||
成功生成;`app.asar` 只包含
|
||||
编译后的主进程、preload 和清单,Web 静态资源作为只读资源单独打包。
|
||||
- 新增 `packages/application`,统一封装 Markdown 渲染、主题清单、主题
|
||||
CSS 和主题资源读取;Fastify 仅作为 HTTP 适配器。
|
||||
- Web 端通过应用后端抽象选择 HTTP 或 Electron IPC;桌面端通过受限 IPC
|
||||
直接调用共享服务,不启动 Fastify,不占用本地 HTTP 端口。
|
||||
- 主题资源通过 `mdpdf://theme/` 安全协议提供,应用窗口与独立 PDF
|
||||
Session 均完成协议注册和来源限制。
|
||||
- 修复 Electron 主进程 ESM Bundle 中 YAML 依赖动态加载 `process`
|
||||
失败的问题,构建时注入 Node `createRequire`。
|
||||
- `logos/` 作为统一品牌源:Web 使用 favicon、Apple Touch Icon 和
|
||||
Web Manifest,Electron 使用 ICO、ICNS、窗口图标和安装器图标。
|
||||
- Forge 输出目录包含版本号,正式内部交付使用 Squirrel `Setup.exe`,
|
||||
ZIP 作为免安装辅助包;当前未签名。
|
||||
|
||||
### 3.13 v0.4.0 内置主题与发布产物
|
||||
|
||||
- `.local/themes` 中 GitHub、Pixyll 和 Whitey 三套主题已复制到
|
||||
`themes/`,从 v0.4.0 起随 Web 容器和桌面安装包内置。
|
||||
- 内置主题注册优先于相同 ID 的本地主题,避免 Compose 默认挂载旧副本
|
||||
覆盖发布版本,并记录可诊断警告。
|
||||
- Windows 正式安装包为
|
||||
`Markdown PDF 导出器-0.4.0 Setup.exe`,约 137.48 MiB;SHA-256 为
|
||||
`79CB3ADC0C9DCB1AA2B9EFC792734FF792D410BDFC125B9BA78603EE4D98A894`。
|
||||
- 本地镜像为 `yixiong/md-to-pdf:v0.4.0`;Compose 容器保持健康运行并
|
||||
监听 `http://localhost:8080`。
|
||||
- Dockerfile 默认保留完整 Playwright Chromium 安装路径,同时支持通过
|
||||
构建参数复用本机已验证的旧版本运行层,适合内网软件源较慢的环境。
|
||||
|
||||
## 4. 已执行验证
|
||||
|
||||
2026-07-27 在当前完整工作区成功执行:
|
||||
@@ -335,13 +390,32 @@ git diff --check
|
||||
- ECharts 围栏测试:36 项通过;
|
||||
- 共享配置测试:9 项通过;
|
||||
- 渲染器测试:10 项通过;
|
||||
- 前端测试:63 项通过;
|
||||
- 应用服务测试:5 项通过;
|
||||
- 前端测试:67 项通过;
|
||||
- 后端测试:29 项通过;
|
||||
- 全项目共 147 项测试通过;
|
||||
- 桌面端测试:7 项通过;
|
||||
- 全项目共 163 项测试通过;
|
||||
- 全项目类型检查通过;
|
||||
- 生产构建通过;
|
||||
- `git diff --check` 通过。
|
||||
|
||||
Electron 桌面端第一阶段验证结果:
|
||||
|
||||
- Electron 43.2.0 应用窗口成功加载现有 React/Vite 界面,标题旁正确显示
|
||||
`v0.4.0`。
|
||||
- 最小 Markdown 通过隐藏 Electron Chromium 生成 1 页、52,308 字节
|
||||
PDF,文字可搜索,并通过桌面原生保存通道落盘。
|
||||
- 默认示例通过桌面端生成 4 页、439,501 字节 A4 PDF,Mermaid 和
|
||||
10 个 ECharts 图表错误数均为 0。
|
||||
- 将默认示例全部 4 页渲染为 PNG 后逐页检查,Tree、Treemap、Sunburst、
|
||||
Graph、Sankey、Chord、Funnel、Gauge 和 PictorialBar 均完整显示,
|
||||
未发现空白页、黑块、跨页切割或明显裁切。
|
||||
- PDF.js 可以从 4 页中提取 670 个非空白字符,各页均包含可搜索文字。
|
||||
- Forge 成功生成 Windows x64 未签名目录包,生产窗口通过
|
||||
`mdpdf://bundle/index.html` 加载,版本徽标和界面静态资源正常。
|
||||
- 精简后的 `app.asar` 约 554 KiB,Web 静态资源共 134 个文件、约
|
||||
9.0 MiB;运行目录只包含 Electron 自带的一套 Chromium。
|
||||
|
||||
已使用浏览器插件完成视觉验证:
|
||||
|
||||
- 默认示例中的 ECharts 柱状图生成 1 个内联 SVG,无错误占位;
|
||||
@@ -455,6 +529,21 @@ ECharts 第二阶段浏览器与 PDF 验证结果:
|
||||
独立的 `echarts` Node.js 包;
|
||||
- 当前容器保留运行,等待 `v0.3.1` 发布前手动验收。
|
||||
|
||||
2026-07-27 已完成 `v0.4.0` 最终发布候选验证:
|
||||
|
||||
- 生成本地镜像 `yixiong/md-to-pdf:v0.4.0`,镜像内容 ID 为
|
||||
`sha256:1bf4a136e9b822fa0925070cd522ea2adbad8b388d8e039d6509024d466666b3`;
|
||||
- Compose 强制替换为 v0.4.0 后健康检查通过,首页返回 200,健康接口
|
||||
返回 `ok`,主题接口返回 4 个 `bundled` 主题;
|
||||
- 容器 Chromium 生成中文、表格、KaTeX、代码和 Mermaid 验收 PDF,
|
||||
HTTP 200、1 页、147,374 字节,Mermaid/ECharts 错误数均为 0;
|
||||
- PDF 渲染为 PNG 后检查通过,中文、公式、表格、代码、图表、页边距和
|
||||
页码均正常,无裁切、重叠、黑块或空白;
|
||||
- Compose 网页真实加载后标题旁显示 `v0.4.0`,主题选择器包含 4 个内置
|
||||
主题,多页预览和图表正常,浏览器控制台无错误;
|
||||
- Forge Squirrel 安装包、NUPKG 和 ZIP 均已生成,安装包约 137.48 MiB,
|
||||
当前 Authenticode 状态为未签名。
|
||||
|
||||
## 5. 当前注意事项
|
||||
|
||||
- `output/` 可能包含本地 PDF 验证产物,已被 Git 忽略,不得提交。
|
||||
@@ -481,18 +570,30 @@ ECharts 第二阶段浏览器与 PDF 验证结果:
|
||||
- `packages/core/src/document.ts` 是渲染文档、分页载荷、运行结果和耗时的
|
||||
共享模型。
|
||||
- `apps/server/src/app.ts` 是新增的可测试 Fastify 应用。
|
||||
- `apps/server/src/theme-registry.ts` 负责内置和本地主题发现、CSS 处理及资源安全。
|
||||
- `.local/themes/typora-*` 是用户本机副本,已被 Git 忽略,不得提交。
|
||||
- `packages/application` 负责共享 Markdown 渲染和主题应用服务;
|
||||
`apps/server` 与 `apps/desktop` 分别提供 HTTP 和 IPC 适配。
|
||||
- `apps/desktop/src/main.ts` 负责 Electron 生命周期、自定义应用协议、
|
||||
应用窗口、IPC 校验和原生 PDF 保存。
|
||||
- `apps/desktop/src/electron-pdf-generator.ts` 负责隐藏 PDF 窗口、分页
|
||||
调度、网络限制、打印和窗口复用。
|
||||
- `apps/desktop/src/app-preload.ts` 与 `pdf-preload.ts` 分别定义应用
|
||||
窗口和 PDF 运行窗口的最小 IPC 能力。
|
||||
- `.local/themes/typora-*` 仍可作为用户本机副本;v0.4.0 的三套发布版本
|
||||
已复制到 `themes/` 并标记为内置主题。
|
||||
- `.local/theme-backups` 中保留 GitHub、Pixyll 和 Whitey 的可恢复备份;Newsprint 和 Night 的当前副本及备份已按用户要求删除。
|
||||
- Typora 官方资源是 All Rights Reserved,仅限当前用户本机使用,不进入 Git、容器或发布包。
|
||||
- Typora 复制主题按公司内部私有项目决策内置,不面向外部公开或商用;
|
||||
未来改变分发范围前必须重新完成许可证审查。
|
||||
- 快速预览会受到客户端 Windows 显示缩放、浏览器缩放和设备像素比影响;
|
||||
对页数和分页边界有严格要求时,以精确预览和最终 PDF 为准。
|
||||
- 资源目录上传、本地相对图片、临时目录和路径安全尚未实现。
|
||||
- AIO 容器已经通过 Docker Desktop 构建、端到端和浏览器验证。
|
||||
- 桌面端已通过进程内共享服务实现离线 Markdown 渲染、主题读取和 PDF
|
||||
导出,不依赖 Fastify 或本地 HTTP Server。
|
||||
- v0.4.0 AIO 容器已经通过 Docker Desktop 构建、端到端和浏览器验证,
|
||||
当前 Compose 容器保持运行。
|
||||
|
||||
## 6. 推荐接手顺序
|
||||
|
||||
### 阶段一:资源与安全
|
||||
### 阶段一:桌面文档工作区与资源安全
|
||||
|
||||
- Markdown 文件夹或 ZIP;
|
||||
- 相对图片解析;
|
||||
|
||||
+7
-3
@@ -13,7 +13,7 @@ themes/<theme-id>/ 随项目分发的内置主题
|
||||
.local/themes/<theme-id>/ 仅供当前设备使用的本地主题
|
||||
```
|
||||
|
||||
- 内置主题的 `bundled` 必须为 `true`,并具有允许项目分发的明确许可证。
|
||||
- 内置主题的 `bundled` 必须为 `true`,并记录来源、许可证或内部使用边界。
|
||||
- 本地主题的 `bundled` 必须为 `false`,整个 `.local/` 目录已被 Git 忽略。
|
||||
- 主题目录名必须与清单中的 `id` 完全一致。
|
||||
|
||||
@@ -262,11 +262,15 @@ npm run theme:import-typora -- --replace
|
||||
.local/theme-backups/
|
||||
```
|
||||
|
||||
Typora 当前没有为这些文件提供允许项目再分发的明确许可证,因此导入结果只能保存在 `.local`,不得提交到 Git、打包进容器或随项目发布。
|
||||
Typora 当前没有为这些文件提供允许公开再分发的明确许可证。普通导入结果
|
||||
仍默认保存在 `.local`。本项目从 v0.4.0 起按公司内部私有项目决策,将
|
||||
GitHub、Pixyll 和 Whitey 三套主题复制为内置资源,并在
|
||||
`themes/INTERNAL_THEME_NOTICE.md` 记录来源和内部使用边界;如未来公开、
|
||||
商用或向公司外部分发,必须重新完成许可证审查并替换或取得授权。
|
||||
|
||||
## 10. 提交内置主题前检查
|
||||
|
||||
- 许可证明确允许再分发,并在清单和说明中记录。
|
||||
- 许可证明确允许目标范围内使用,或已在清单和内部说明中记录限制。
|
||||
- 主题目录不包含用户文档、临时文件或无关资源。
|
||||
- `npm test` 通过。
|
||||
- `npm run typecheck` 通过。
|
||||
|
||||
Reference in New Issue
Block a user