菜单

代码结构

相关源文件

本文档提供了 drawio-desktop 代码库组织和架构的概述。它解释了主要组件及其关系,重点关注应用程序的核心结构。有关开发设置过程的信息,请参阅 设置

目录结构

drawio-desktop 代码库组织如下:

来源: .gitignore sync.cjs src/main/electron.js src/main/electron-preload.js src/main/disableUpdate.js

关键文件和目录

  • src/main/:包含主要的 Electron 应用程序代码
    • electron.js:应用程序的主要入口点
    • electron-preload.js:用于进程之间安全通信的预加载脚本
    • disableUpdate.js:控制更新功能
  • drawio/:一个 Git 子模块,包含核心的 draw.io Web 应用程序
  • sync.cjs:用于同步 draw.io 子模块和桌面应用程序之间版本号的脚本
  • package.json:包含应用程序元数据和依赖项
  • dist/:包含构建好的应用程序包(未在 Git 中跟踪)

主进程与渲染器进程架构

该应用程序遵循 Electron 的进程架构,具有明确的关注点分离

来源: src/main/electron.js5-6 src/main/electron.js64-76 src/main/electron-preload.js1-4 src/main/electron-preload.js36-72

主进程 (electron.js)

主进程负责:

  1. 应用程序生命周期管理:初始化应用程序,处理窗口的创建和销毁
  2. 窗口管理:创建具有适当设置的浏览器窗口
  3. IPC 处理:处理来自渲染器进程的请求
  4. 文件系统操作:读取和写入文件
  5. 导出功能:将图表导出为不同的格式
  6. 更新系统:检查和应用应用程序更新

主入口点 src/main/electron.js 创建 Electron 应用程序窗口并设置各种操作的事件处理程序。

预加载脚本和 IPC 桥

预加载脚本 src/main/electron-preload.js 使用 Electron 的 contextBridge API 创建了主进程和渲染器进程之间的安全桥梁。这使得

  1. 向渲染器进程暴露有限的 API 集
  2. 安全地处理 IPC 通信
  3. 防止渲染器进程直接访问 Node.js API

来源: src/main/electron-preload.js6-24 src/main/electron-preload.js36-72

子模块关系

draw.io 桌面应用程序构建于核心 draw.io Web 应用程序之上,该应用程序被包含为一个 Git 子模块

两个代码库之间的关系通过以下方式管理:

  1. 版本同步sync.cjs 脚本同步 draw.io 子模块和桌面应用程序之间的版本号
  2. 代码引用:主 Electron 进程从子模块目录加载 Web 应用程序
  3. 构建过程:构建桌面应用程序时,Web 应用程序的代码会被包含在包中

来源: sync.cjs7-14 src/main/electron.js75-76

应用程序初始化流程

应用程序启动时遵循以下初始化顺序:

来源: src/main/electron.js147-346 src/main/electron.js356-372 src/main/electron.js897-937

安全模型

应用程序实施了多项安全措施:

  1. 内容安全策略 (CSP):限制可加载和执行的资源
  2. 上下文隔离:防止渲染器进程和主进程之间的直接访问
  3. 文件访问限制:限制文件访问到应用程序自己的目录
  4. 导航控制:阻止应用程序内部导航到外部 URL

这创建了一个沙箱环境,渲染器进程在该环境中功能受限,并且必须通过 contextBridge 使用暴露的 API 来执行特权操作。

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

更新系统

更新系统允许应用程序检查和应用更新

更新系统可以通过以下方式进行配置:

  1. disableUpdate.js:控制是否完全禁用更新
  2. silentUpdate:确定更新是否应静默下载和安装
  3. 命令行标志--disable-update--silent-update 来控制更新行为

来源: src/main/disableUpdate.js1-4 src/main/electron.js19-25 src/main/electron.js1258-1361

构建流程

应用程序的构建过程包括同步 draw.io 子模块和桌面应用程序之间的版本

此同步确保桌面应用程序的版本与核心 draw.io 引擎的版本匹配,从而保持两个代码库之间的一致性。

来源: sync.cjs7-16

窗口管理

应用程序支持多个窗口,每个窗口都保存在注册表中

窗口通过以下方式创建和管理:

  1. createWindow():创建一个新的浏览器窗口并设置适当的参数
  2. windowsRegistry:跟踪所有打开的窗口
  3. 事件处理程序:处理窗口的 resize、close 和其他事件

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

结论

drawio-desktop 代码库遵循标准的 Electron 架构,主进程和渲染器进程之间有清晰的划分。主进程负责处理系统级操作,而渲染器进程负责显示 draw.io 网页应用程序。两者之间的通信通过 preload 脚本和 contextBridge 进行安全通信。

该应用程序在设计时就考虑了安全性,实施了各种限制措施,以防止未经授权的访问并确保安全运行。更新系统提供了处理更新的灵活性,而构建过程则确保了桌面应用程序与核心 draw.io 引擎之间的一致性。