本文档介绍了 drawio-desktop 应用程序中的渲染器进程及其与主进程的通信方式。有关主进程本身的更多信息,请参阅 主进程。
drawio-desktop 应用程序使用了 Electron 的多进程架构,其中渲染器进程负责:
本文档详细介绍了渲染器进程的设置、安全性以及进程间双向通信的实现方式。
来源:src/main/electron.js147-347 src/main/electron-preload.js1-79
渲染器进程在主进程需要新窗口时创建。主进程会使用特定的安全设置配置渲染器,并将其加载到 draw.io 网页应用程序中。
来源:src/main/electron.js147-347 src/main/electron.js896-937
在创建新的渲染器进程(浏览器窗口)时,会设置几个重要的配置选项:
配置优先考虑安全性,通过上下文隔离和禁用某些功能来实现,同时保留用户对窗口大小的偏好设置。
来源:src/main/electron.js164-177
预加载脚本在主进程和渲染器进程之间创建了一个安全的桥梁,确保渲染器只能访问特定公开的 API。
预加载脚本通过上下文桥向渲染器进程公开两个主要对象:
electron - 包含用于 IPC 通信的方法process - 公开有限的进程信息来源:src/main/electron-preload.js36-79
预加载脚本向渲染器进程公开了一组经过精心限制的 API:
| API | 目的 |
|---|---|
electron.request() | 向主进程发送请求并处理回调 |
electron.registerMsgListener() | 注册特定消息类型的监听器 |
electron.sendMessage() | 向主进程发送单向消息 |
electron.listenOnce() | 注册一次性事件监听器 |
process.type | 公开进程类型信息 |
process.versions | 公开版本信息 |
这种受控的公开确保了渲染器可以与主进程通信,同时维护安全边界。
来源:src/main/electron-preload.js36-79
请求-响应模式允许渲染器向主进程发出请求,并通过回调接收异步响应。
来源:src/main/electron-preload.js10-34 src/main/electron-preload.js38-52
除了请求-响应模式,drawio-desktop 还使用基于事件的通信,其中任何一方都可以发送事件供另一方监听。
基于事件的通信实现了进程之间更松散的耦合,允许每个进程在无需显式请求-响应周期的情况下响应事件。
来源:src/main/electron.js232-1017 src/main/electron-preload.js53-70
安全性是 drawio-desktop 渲染器进程实现的核心关注点。
上下文隔离确保预加载脚本和渲染器进程在独立的 JavaScript 上下文中执行,防止它们之间的直接访问。
上下文隔离在 BrowserWindow 配置中通过 contextIsolation: true 启用,确保渲染器进程无法直接访问 Node.js API。
来源:src/main/electron.js174 src/main/electron-preload.js36-72
应用程序强制执行严格的内容安全策略 (CSP),该策略限制了渲染器可以加载的资源。
frame-src 'none')此 CSP 应用于渲染器进程中加载的所有内容,增加了额外的安全层。
来源:src/main/electron.js359-371
渲染器发送的所有 IPC 请求都会在主进程中进行验证,以确保它们源自受信任的来源。
此验证可确保只有 draw.io 应用程序代码可以与主进程通信,从而防止来自不受信任内容引起的潜在攻击。
来源:src/main/electron.js125-128
来源:src/main/electron.js311-344 src/main/electron-preload.js10-24
主进程负责管理应用程序窗口,并向渲染器进程通信状态更改。
这种通信确保了渲染器可以根据窗口状态更改调整其 UI,并参与窗口生命周期的决策。
来源:src/main/electron.js245-255 src/main/electron.js311-344 src/main/electron.js391-411
drawio-desktop 中的渲染器进程在设计时将安全性作为首要考虑因素,使用上下文隔离和严格的 CSP 来创建安全的环境。渲染器进程和主进程之间的通信通过 IPC 遵循既定的模式,并通过预加载脚本和上下文桥公开精心设计的 API。
这种架构允许基于 Web 的 draw.io 应用程序在桌面环境中安全运行,同时仍然可以通过受控通道访问桌面功能。
来源:src/main/electron.js164-177 src/main/electron-preload.js1-79