本文档描述了 ChatGPT 桌面应用程序中使用的多 WebView 架构。与使用单个 WebView 的传统桌面 Web 包装器不同,此应用程序在单个窗口内使用多个专用 WebView,以创建统一的用户界面,同时保持关注点分离。本文档解释了这些 WebView 的创建、定位以及它们如何相互通信。
有关整体系统架构的详细信息,请参阅 系统架构。有关支持 WebView 之间通信的命令系统的信息,请参阅 命令系统。
该应用程序在单个窗口内使用三个不同的 WebView
来源: src-tauri/src/core/setup.rs56-104 src-tauri/src/core/constant.rs1-2
主 WebView 是显示 ChatGPT 界面的主要内容区域。它直接从“https://chatgpt.com”加载 ChatGPT 网页应用程序。
主要特性
"main"来源: src-tauri/src/core/setup.rs56-94 src-tauri/src/core/constant.rs6-45
标题栏 WebView 提供了一个自定义导航界面,其中包含后退/前进导航、重新加载、设置和主题切换等控件。
主要特性
"titlebar"TITLEBAR_HEIGHT (28.0 像素) 定义的固定高度来源: src-tauri/src/core/setup.rs96-100 src/view/Titlebar.tsx20-178 src-tauri/src/core/constant.rs1
提问 WebView 提供了一个消息输入界面,允许用户向 ChatGPT 发送消息。
主要特性
"ask"ASK_HEIGHT (120.0 像素) 定义的固定高度来源: src-tauri/src/core/setup.rs102-104 src/view/Ask.tsx8-70 src-tauri/src/core/constant.rs2
WebView 在应用程序初始化期间在 setup.rs 文件中创建
来源: src-tauri/src/core/setup.rs20-258
该应用程序为 macOS 和其他平台(Windows、Linux)使用不同的布局。这些差异是为了适应特定平台的 UI 约定。
来源: src-tauri/src/core/setup.rs111-167 src-tauri/src/core/setup.rs198-251
WebView 的确切定位是使用以下组合计算的:
TITLEBAR_HEIGHT, ASK_HEIGHT)例如,在 macOS 上
TITLEBAR_HEIGHTTITLEBAR_HEIGHT),宽度为窗口宽度,高度为 (窗口高度 - 标题栏高度 - 提问高度)ASK_HEIGHT),宽度为窗口宽度,高度为 ASK_HEIGHT来源: src-tauri/src/core/setup.rs107-167 src-tauri/src/core/cmd.rs105-191
当窗口调整大小时,每个 WebView 的位置和大小都会重新计算
来源: src-tauri/src/core/setup.rs180-251
WebView 通过以下几种机制进行通信:
主 WebView 发出 URL 更改事件,标题栏 WebView 会监听这些事件。
来源: src-tauri/src/core/constant.rs6-45 src/view/Titlebar.tsx52-64
标题栏和提问 WebView 中的 React 组件调用 Tauri 命令来操作主 WebView
来源: src/view/Ask.tsx25-49 src-tauri/src/core/cmd.rs72-87 src-tauri/src/core/cmd.rs62-70
提问 WebView 可以通过提问模式功能进行开/关切换
来源: src/view/Titlebar.tsx89-92 src-tauri/src/core/cmd.rs105-191
主 WebView 使用特殊脚本进行初始化,这些脚本启用了以下功能:
在 INIT_SCRIPT 中定义的初始化脚本会监控 URL 更改,并在 URL 更改时通知标题栏 WebView,从而使标题栏能够更新其导航状态。
来源: src-tauri/src/core/constant.rs6-45 src-tauri/src/core/setup.rs93-94
多webview系统需要依赖几个Tauri功能才能正常运行
webview:allow-create-webview: 用于创建多个webviewwebview:allow-set-webview-focus: 用于聚焦特定的webviewevent:allow-emit, event:allow-listen: 用于webview之间的通信window:allow-start-dragging: 用于自定义标题栏功能这些功能定义在 desktop.json 功能文件中。
来源: src-tauri/capabilities/desktop.json1-45
ChatGPT桌面应用程序中的多webview系统提供了一个灵活的架构,该架构
与简单的浏览器包装器相比,这种方法创建了更集成、更原生的桌面体验,同时保持对ChatGPT Web应用程序功能的全部访问。