3 Commits
Author SHA1 Message Date
SkyJourney ac54ce46be chore: 精简桌面端语言包 2026-07-27 23:16:47 +08:00
SkyJourney 06407650e0 feat: 发布标准 Windows 安装向导 2026-07-27 23:01:22 +08:00
SkyJourney 8d91d08809 fix: 移除桌面端原生菜单栏 2026-07-27 22:23:39 +08:00
10 changed files with 1534 additions and 4092 deletions
+15 -4
View File
@@ -26,10 +26,18 @@ npm run desktop:package
npm run make -w @md-to-pdf/desktop npm run make -w @md-to-pdf/desktop
``` ```
版本化目录包、Squirrel `Setup.exe` 和 ZIP 输出到 版本化目录包、NSIS `Setup.exe` 和 ZIP 输出到
`apps/desktop/out/v0.4.1/`。该目录被 Git 忽略。公司内部分发以 `apps/desktop/out/v0.4.4/`。该目录被 Git 忽略。公司内部分发以
`Setup.exe` 为正式安装包,ZIP 作为免安装辅助包;当前未配置代码签名, `md-to-pdf-0.4.4-x86_64-Setup.exe` 为正式安装包,ZIP 作为免安装
Windows 首次运行可能显示“未知发布者”提示。 辅助包;当前未配置代码签名,Windows 首次运行可能显示“未知发布者”
提示。
NSIS 使用标准辅助安装模式,支持选择当前用户/所有用户安装和自定义安装
目录,并创建桌面及开始菜单快捷方式。正式安装包作为 Gitea Release 附件
发布,不提交进 Git 历史。
桌面和开始菜单快捷方式由 `build/installer.nsh` 显式创建,安装完成后的
“运行”操作直接启动 `md-to-pdf.exe`,不依赖快捷方式文件。
产品名称、窗口标题、安装包名称和开始菜单名称保持为 产品名称、窗口标题、安装包名称和开始菜单名称保持为
“Markdown PDF 导出器”,实际 Windows 主程序与进程文件固定为 “Markdown PDF 导出器”,实际 Windows 主程序与进程文件固定为
@@ -39,6 +47,9 @@ Windows 首次运行可能显示“未知发布者”提示。
Web 静态资源作为只读资源放在 Electron `resources/dist` 下,生产环境通过 Web 静态资源作为只读资源放在 Electron `resources/dist` 下,生产环境通过
`mdpdf://bundle/` 自定义协议加载。 `mdpdf://bundle/` 自定义协议加载。
发行包只保留 Electron 的简体中文和英文语言包,其他 Chromium 运行时
组件保持完整,以兼顾安装体积和不同 Windows 图形环境下的运行可靠性。
## 安全边界 ## 安全边界
- 应用窗口和 PDF 窗口均关闭 Node Integration - 应用窗口和 PDF 窗口均关闭 Node Integration
+20
View File
@@ -0,0 +1,20 @@
!macro customInstall
CreateDirectory "$SMPROGRAMS\Markdown PDF 导出器"
CreateShortCut \
"$SMPROGRAMS\Markdown PDF 导出器\Markdown PDF 导出器.lnk" \
"$INSTDIR\md-to-pdf.exe" \
"" \
"$INSTDIR\md-to-pdf.exe"
CreateShortCut \
"$DESKTOP\Markdown PDF 导出器.lnk" \
"$INSTDIR\md-to-pdf.exe" \
"" \
"$INSTDIR\md-to-pdf.exe"
StrCpy $launchLink "$INSTDIR\md-to-pdf.exe"
!macroend
!macro customUnInstall
Delete "$SMPROGRAMS\Markdown PDF 导出器\Markdown PDF 导出器.lnk"
RMDir "$SMPROGRAMS\Markdown PDF 导出器"
Delete "$DESKTOP\Markdown PDF 导出器.lnk"
!macroend
+72
View File
@@ -0,0 +1,72 @@
const path = require("node:path");
const { version } = require("./package.json");
const windowsIcon = path.resolve(
__dirname,
"../../logos/desktop/windows/app.ico"
);
module.exports = {
appId: "com.md-to-pdf.desktop",
productName: "Markdown PDF 导出器",
copyright: "Copyright © YIXIONG Tech.ltd",
asar: true,
electronLanguages: ["zh-CN", "en-US"],
directories: {
output: `out/v${version}`
},
files: [
"dist/**/*",
"package.json"
],
extraResources: [
{
from: "../web/dist",
to: "dist",
filter: ["**/*"]
},
{
from: "../../themes",
to: "themes",
filter: ["**/*"]
},
{
from: windowsIcon,
to: "app.ico"
},
{
from: "../../logos/desktop/macos/app.icns",
to: "app.icns"
}
],
win: {
target: [
{
target: "nsis",
arch: ["x64"]
},
{
target: "zip",
arch: ["x64"]
}
],
icon: windowsIcon,
executableName: "md-to-pdf",
artifactName: `md-to-pdf-${version}-x86_64.\${ext}`
},
nsis: {
oneClick: false,
allowToChangeInstallationDirectory: true,
perMachine: false,
allowElevation: true,
createDesktopShortcut: false,
createStartMenuShortcut: false,
shortcutName: "Markdown PDF 导出器",
uninstallDisplayName: "Markdown PDF 导出器",
installerIcon: windowsIcon,
uninstallerIcon: windowsIcon,
installerLanguages: ["zh_CN"],
include: "build/installer.nsh",
artifactName: `md-to-pdf-${version}-x86_64-Setup.\${ext}`
}
};
-47
View File
@@ -1,47 +0,0 @@
const path = require("node:path");
const windowsIcon = path.resolve(
__dirname,
"../../logos/desktop/windows/app.ico"
);
const macosIcon = path.resolve(
__dirname,
"../../logos/desktop/macos/app.icns"
);
const { version } = require("../../package.json");
module.exports = {
buildIdentifier: `v${version}`,
packagerConfig: {
asar: true,
prune: false,
executableName: "md-to-pdf",
icon: process.platform === "darwin" ? macosIcon : windowsIcon,
ignore: [
/^\/node_modules(?:\/|$)/,
/^\/out(?:\/|$)/,
/^\/src(?:\/|$)/,
/^\/tests(?:\/|$)/,
/^\/tsconfig\.json$/
],
extraResource: [
path.resolve(__dirname, "../web/dist"),
path.resolve(__dirname, "../../themes"),
windowsIcon,
macosIcon
]
},
makers: [
{
name: "@electron-forge/maker-squirrel",
config: {
name: "markdown_pdf_exporter",
exe: "md-to-pdf.exe",
setupIcon: windowsIcon
}
},
{
name: "@electron-forge/maker-zip",
platforms: ["win32", "darwin"]
}
]
};
+6 -10
View File
@@ -1,32 +1,28 @@
{ {
"name": "@md-to-pdf/desktop", "name": "@md-to-pdf/desktop",
"version": "0.4.1", "version": "0.4.4",
"private": true, "private": true,
"productName": "Markdown PDF 导出器", "productName": "Markdown PDF 导出器",
"description": "Markdown PDF 导出器桌面端", "description": "Markdown PDF 导出器桌面端",
"author": "md-to-pdf contributors", "author": "YIXIONG Tech.ltd",
"type": "module", "type": "module",
"main": "dist/main.js", "main": "dist/main.js",
"dependencies": {
"@md-to-pdf/application": "0.4.1"
},
"scripts": { "scripts": {
"build": "npm run clean && npm run build:main && npm run build:preload", "build": "npm run clean && npm run build:main && npm run build:preload",
"build:main": "node scripts/build-main.mjs", "build:main": "node scripts/build-main.mjs",
"build:preload": "esbuild src/app-preload.ts src/pdf-preload.ts --bundle --platform=node --format=cjs --external:electron --outdir=dist --out-extension:.js=.cjs", "build:preload": "esbuild src/app-preload.ts src/pdf-preload.ts --bundle --platform=node --format=cjs --external:electron --outdir=dist --out-extension:.js=.cjs",
"clean": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"", "clean": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"",
"dev": "npm run build && wait-on http://localhost:5173 && electron dist/main.js --web-url=http://localhost:5173", "dev": "npm run build && wait-on http://localhost:5173 && electron dist/main.js --web-url=http://localhost:5173",
"package": "npm run build && electron-forge package", "package": "npm run build && electron-builder --dir --config electron-builder.config.cjs --x64",
"make": "npm run build && electron-forge make", "make": "npm run build && electron-builder --win nsis zip --config electron-builder.config.cjs --x64",
"test": "vitest run", "test": "vitest run",
"typecheck": "tsc -p tsconfig.json --noEmit --pretty false" "typecheck": "tsc -p tsconfig.json --noEmit --pretty false"
}, },
"devDependencies": { "devDependencies": {
"@electron-forge/cli": "7.11.2", "@md-to-pdf/application": "0.4.1",
"@electron-forge/maker-squirrel": "7.11.2",
"@electron-forge/maker-zip": "7.11.2",
"@types/node": "^24.10.1", "@types/node": "^24.10.1",
"electron": "43.2.0", "electron": "43.2.0",
"electron-builder": "26.15.3",
"esbuild": "^0.25.0", "esbuild": "^0.25.0",
"typescript": "^5.9.3", "typescript": "^5.9.3",
"vitest": "^4.1.10", "vitest": "^4.1.10",
+3
View File
@@ -3,6 +3,7 @@ import {
BrowserWindow, BrowserWindow,
dialog, dialog,
ipcMain, ipcMain,
Menu,
net, net,
protocol, protocol,
session, session,
@@ -211,6 +212,7 @@ async function createApplication(
height: 960, height: 960,
minWidth: 1024, minWidth: 1024,
minHeight: 720, minHeight: 720,
autoHideMenuBar: true,
show: false, show: false,
webPreferences: { webPreferences: {
contextIsolation: true, contextIsolation: true,
@@ -357,6 +359,7 @@ async function createApplication(
app app
.whenReady() .whenReady()
.then(async () => { .then(async () => {
Menu.setApplicationMenu(null);
if (process.platform === "win32") { if (process.platform === "win32") {
app.setAppUserModelId("com.md-to-pdf.desktop"); app.setAppUserModelId("com.md-to-pdf.desktop");
} }
+2 -2
View File
@@ -6,7 +6,7 @@ import {
describe("应用版本", () => { describe("应用版本", () => {
it("从统一构建版本生成标题徽标", () => { it("从统一构建版本生成标题徽标", () => {
expect(APP_VERSION).toBe("0.4.1"); expect(APP_VERSION).toBe("0.4.4");
expect(APP_VERSION_LABEL).toBe("v0.4.1"); expect(APP_VERSION_LABEL).toBe("v0.4.4");
}); });
}); });
+86
View File
@@ -35,6 +35,15 @@ ec48bce chore: 初始化项目骨架
受限公网图片下载、可见图片标题、图片整块分页与超高图片单页适配均复用 受限公网图片下载、可见图片标题、图片整块分页与超高图片单页适配均复用
统一渲染链路。Electron 安装包和 Docker Compose 发布候选均已通过验证。 统一渲染链路。Electron 安装包和 Docker Compose 发布候选均已通过验证。
`v0.4.2` 为仅面向桌面端的维护版本:移除 Windows 原生应用菜单栏;
Web/Compose 发布仍保持 `v0.4.1`
`v0.4.3` 将桌面发行包迁移为标准 NSIS 安装向导,并使用全英文、无空格、
包含版本与平台的安装包文件名;Web/Compose 发布仍保持 `v0.4.1`
`v0.4.4` 仅精简 Electron 桌面发行包的语言资源,保留简体中文和英文;
Web/Compose 发布仍保持 `v0.4.1`
## 2. 已完成 ## 2. 已完成
### 2.1 项目骨架 ### 2.1 项目骨架
@@ -397,6 +406,37 @@ ec48bce chore: 初始化项目骨架
- 默认示例增加 NASA 中等尺寸图与 Unsplash 超高竖图,直接覆盖正常图片 - 默认示例增加 NASA 中等尺寸图与 Unsplash 超高竖图,直接覆盖正常图片
和超高图片分页场景。 和超高图片分页场景。
### 3.15 v0.4.2 桌面窗口精简
- Electron 主进程不再创建默认应用菜单,移除窗口顶部的
`File / Edit / View / Window` 原生菜单栏。
- 应用窗口同时启用菜单栏自动隐藏,避免 Windows 恢复默认菜单。
- 该维护版本只重新生成桌面安装包和免安装 ZIP;Web/Compose 镜像继续
使用已验证的 `v0.4.1`
### 3.16 v0.4.3 标准 Windows 安装向导
- 桌面发行链路由 Electron Forge Squirrel 迁移到 electron-builder
26.15.3 的 NSIS assisted installer。
- 安装向导提供当前用户/所有用户安装选项、安装目录选择、安装进度和完成
页面;主程序继续使用 `md-to-pdf.exe`
- 正式安装包固定命名为
`md-to-pdf-0.4.3-x86_64-Setup.exe`,免安装包命名为
`md-to-pdf-0.4.3-x86_64.zip`
- 项目自有 `build/installer.nsh` 显式创建桌面和开始菜单快捷方式,
安装完成后直接启动主程序,不依赖 `.lnk`
- 卸载时显式清理桌面快捷方式、开始菜单快捷方式及其目录。
- 安装包和校验文件作为 Gitea `v0.4.3` Release 附件发布,不写入 Git
历史。
### 3.17 v0.4.4 桌面语言包精简
- Electron 发行包只保留 `zh-CN``en-US` 两种 Chromium 语言资源。
- 不裁剪 ICU、ANGLE、Direct3D、Dawn、SwiftShader 或其他 Chromium
运行时组件,保证桌面预览与 PDF 导出在不同图形环境下的可靠性。
- 本版本只重新生成桌面安装包和免安装 ZIP;Web/Compose 发布继续保持
`v0.4.1`
## 4. 已执行验证 ## 4. 已执行验证
2026-07-27 在当前完整工作区成功执行: 2026-07-27 在当前完整工作区成功执行:
@@ -589,6 +629,52 @@ ECharts 第二阶段浏览器与 PDF 验证结果:
`sha256:1ded8a8a11ecb8b69eaa116bb9129dd4ec039e9918b047169fe5f8add2af3a80` `sha256:1ded8a8a11ecb8b69eaa116bb9129dd4ec039e9918b047169fe5f8add2af3a80`
Compose 容器健康运行在 `http://localhost:8080` Compose 容器健康运行在 `http://localhost:8080`
2026-07-27 已完成 `v0.4.2` 桌面维护版本验证:
- 仅重新构建桌面端及其内嵌 Web 静态资源,没有重新构建或替换
Web/Compose 发布镜像。
- Windows 目录版视觉检查通过:默认原生菜单栏已经移除,应用内容直接
位于系统标题栏下方,版本徽标显示 `v0.4.2`
- Windows 主程序继续使用英文文件名 `md-to-pdf.exe`
- Squirrel 安装包为 `Markdown PDF 导出器-0.4.2 Setup.exe`
144,166,400 字节,SHA-256 为
`59DA57522C99EB6B16A9591AFDEC349B785BF9B76950504B314273520152D41B`
Authenticode 状态为未签名。
2026-07-27 已完成 `v0.4.3` 标准安装向导验证:
- NSIS 中文辅助安装向导正确显示安装范围和安装目录选择,版本显示为
`0.4.3`
- 当前用户安装成功,安装目录为
`%LOCALAPPDATA%\Programs\md-to-pdf`,卸载项版本为 `0.4.3`
- 桌面和开始菜单快捷方式均存在,实际目标均为安装目录中的
`md-to-pdf.exe`;从开始菜单快捷方式启动成功。
- 静默卸载返回 0,安装目录、桌面快捷方式和开始菜单目录全部清理;
随后重新安装成功,最终本机保持已安装状态。
- 正式安装包为 `md-to-pdf-0.4.3-x86_64-Setup.exe`
103,346,230 字节,SHA-256 为
`C027B4AC604889C7E7E00BA3CE08A12616312BC9250268775B1B7B578A7C4817`
Authenticode 状态为未签名。
- 免安装包为 `md-to-pdf-0.4.3-x86_64.zip`143,784,617 字节,
SHA-256 为
`91BED88A7CB623B98383408D5553D80A6135FB94F7FE2D77A5FCED339CCF5BC6`
2026-07-27 已完成 `v0.4.4` 桌面语言包精简验证:
- 目录版只包含 `zh-CN.pak``en-US.pak`,语言资源从 55 个、
48,911,653 字节降为 2 个、1,137,843 字节。
- 目录版总大小从 378,084,454 字节降为 330,310,644 字节,减少
47,773,810 字节;Chromium 图形与软件渲染后备组件均保持完整。
- Windows 主程序版本为 `0.4.4`,目录版成功启动并保持应用、GPU、
渲染器等 4 个 Electron 进程正常运行。
- 正式安装包为 `md-to-pdf-0.4.4-x86_64-Setup.exe`94,991,759 字节,
SHA-256 为
`0827FD87A8EEC8B034DF738909CB6A20231245B507AE4A0BAA579AFA03A942DE`
Authenticode 状态为未签名。
- 免安装包为 `md-to-pdf-0.4.4-x86_64.zip`132,470,241 字节,
SHA-256 为
`D6CDB8DAE30676BAB6B2A037567164476AD294588B102A6FBBE9458ABCE5CCC0`
## 5. 当前注意事项 ## 5. 当前注意事项
- `output/` 可能包含本地 PDF 验证产物,已被 Git 忽略,不得提交。 - `output/` 可能包含本地 PDF 验证产物,已被 Git 忽略,不得提交。
+1329 -4028
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "md-to-pdf", "name": "md-to-pdf",
"version": "0.4.1", "version": "0.4.4",
"private": true, "private": true,
"description": "可配置、可主题化的 Markdown PDF 导出工具", "description": "可配置、可主题化的 Markdown PDF 导出工具",
"workspaces": [ "workspaces": [