Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ac54ce46be | ||
|
|
06407650e0 | ||
|
|
8d91d08809 |
+15
-4
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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}`
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -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"]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
};
|
|
||||||
@@ -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,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");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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");
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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 忽略,不得提交。
|
||||||
|
|||||||
Generated
+1329
-4028
File diff suppressed because it is too large
Load Diff
+1
-1
@@ -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": [
|
||||||
|
|||||||
Reference in New Issue
Block a user