菜单

主进程

相关源文件

本文档详细介绍了 draw.io 桌面应用程序的 Electron 主进程架构。主进程负责应用程序生命周期管理、窗口创建、进程间通信、文件系统操作和系统集成。有关渲染器进程及其与主进程通信的信息,请参阅渲染器进程与通信

概述

主进程作为 draw.io 桌面应用程序的骨干,为操作系统和运行在渲染器进程中的 draw.io Web 应用程序提供了一个安全的桥梁。

来源: src/main/electron.js1-1396

入口点和初始化

主进程的入口点是electron.js。应用程序启动时,它会初始化和配置环境

  1. 导入所需的 Node.js 和 Electron 模块
  2. 设置配置选项(更新行为、拼写检查等)
  3. 创建全局变量和注册表
  4. 解析命令行参数
  5. 强制应用程序单实例运行

来源: src/main/electron.js1-69 src/main/electron.js353-398 src/main/electron.js413-490

关键配置变量

主进程维护了几个重要的配置变量

可变目的默认配置源
disableUpdate控制是否禁用更新false环境、命令行或 flatpak 检测
silentUpdate控制更新是否静默安装false环境或命令行
enableSpellCheck启用拼写检查macOS 上为trueElectron store
enableStoreBkp启用备份存储trueElectron store
isGoogleFontsEnabled启用 Google FontsfalseElectron store
windowsRegistry跟踪所有打开的窗口[]内存中的数组

来源: src/main/electron.js19-82

窗口管理

主进程通过createWindow()函数创建和管理浏览器窗口。此函数

  1. 从存储中加载之前的窗口大小/位置
  2. 创建具有适当安全设置的新浏览器窗口
  3. 加载 draw.io Web 应用程序
  4. 设置窗口事件(关闭、调整大小、最大化)的事件处理程序
  5. 实现适当的窗口关闭处理,包括未保存更改的检测

来源: src/main/electron.js147-347

窗口创建和配置

窗口创建时采用了以安全为重点的配置

来源: src/main/electron.js163-177

进程间通信(IPC)

主进程通过 Electron 的 IPC 机制与渲染器进程通信。这允许 Web 应用程序通过桌面应用程序执行文件访问等系统级操作。

来源: src/main/electron.js232-237 src/main/electron.js391-411 src/main/electron.js947-982 src/main/electron-preload.js1-79

关键 IPC 处理程序

主进程实现了几个用于常见操作的 IPC 处理程序

处理器目的
newfile创建一个新的图表窗口
openDevTools打开开发者工具进行调试
isModified-result处理对已修改文档检查的响应
toggleSpellCheck切换拼写检查功能
toggleStoreBkp切换备份存储功能
toggleGoogleFonts切换 Google Fonts 功能
toggleFullscreen切换全屏模式
checkForUpdates手动检查应用程序更新
zoomInzoomOutresetZoom控制应用程序缩放级别

来源: src/main/electron.js391-1075

安全模型

主进程实现了多项安全功能来保护应用程序

  1. 内容安全策略 (CSP): 限制可加载的资源
  2. URL 过滤: 阻止加载应用程序目录以外的文件
  3. 上下文隔离: 确保渲染器进程无法直接访问 Node.js API
  4. 导航控制: 防止未经授权的导航
  5. 窗口打开限制: 限制窗口创建能力

来源: src/main/electron.js359-389 src/main/electron.js1224-1255

内容安全策略

该应用程序使用严格的 CSP,该策略

  1. 将脚本执行限制为自身和特定的哈希脚本
  2. 控制连接源
  3. 管理图像、媒体、字体和样式源
  4. 防止使用 frame、base 和 object

来源: src/main/electron.js363-369

更新系统

主进程包含一个使用 electron-updater 的自动更新系统。它可以

  1. 从 GitHub 检查更新
  2. 自动或经用户确认下载更新
  3. 在应用程序重启时安装更新
  4. 通过配置禁用

来源: src/main/electron.js19-30 src/main/electron.js1052-1065 src/main/electron.js1129-1138 src/main/electron.js1257-1353

更新配置

更新系统可以通过多种机制进行配置

方法目的
命令行标志 --disable-update禁用更新检查
环境变量 DRAWIO_DISABLE_UPDATE禁用更新检查
命令行标志 --silent-update启用静默更新
环境变量 DRAWIO_SILENT_UPDATE启用静默更新
文件 disableUpdate.js由构建脚本修改的中央控制文件

来源: src/main/electron.js19-25 src/main/disableUpdate.js1-4 sync.cjs15-16

命令行界面

主进程使用 Commander.js 实现了一个全面的命令行界面。这使得

  1. 打开特定的图表文件
  2. 创建新图表
  3. 将图表导出为各种格式(PDF、PNG、JPG、SVG、XML)
  4. 批量处理多个文件
  5. 控制应用程序行为

来源: src/main/electron.js430-489 src/main/electron.js499-840

应用程序生命周期

主进程处理应用程序生命周期,包括

  1. 初始启动和窗口创建
  2. 窗口管理和恢复
  3. 应用程序退出逻辑
  4. 特定于平台的行为(macOS 与 Windows/Linux)

来源: src/main/electron.js356-1178 src/main/electron.js1142-1178

特定于平台的行为

应用程序根据平台实现不同的行为

平台行为
macOS- 自定义应用程序菜单
- 遵守 Cmd+Q 退出
- 处理“open-file”事件
- 当所有窗口关闭时仍然运行
Windows/Linux- 无菜单栏
- 当所有窗口关闭时退出

来源: src/main/electron.js68-71 src/main/electron.js1077-1127 src/main/electron.js1142-1162

主进程创建和管理应用程序菜单,macOS 和 Windows/Linux 的实现方式不同

  • 在 macOS 上,创建了一个包含标准 macOS 菜单项的完整应用程序菜单
  • 在 Windows/Linux 上,默认不显示应用程序菜单

菜单操作包括

  • 应用程序操作(关于、支持、检查更新)
  • 标准编辑操作(剪切、复制、粘贴)
  • 缩放控件

来源: src/main/electron.js1077-1127