
1个窗口3个WebviewChatGPT桌面客户端的多Webview架构10分钟看懂【免费下载链接】ChatGPT❄️ ChatGPT Desktop Application (Mac, Windows and Linux)项目地址: https://gitcode.com/GitHub_Trending/cha/ChatGPT这篇文章带你用10分钟看懂 ChatGPT 桌面客户端Mac / Windows / Linux的核心架构它如何用1 个窗口承载 3 个 Webview把官方网页、自定义标题栏、底部快捷提问框装进同一个应用里。项目基于 Tauri React Rust 构建是学习「多 Webview 桌面应用架构」的优秀开源样本 先看效果一个窗口三种界面区域从演示动图可以看出整个应用虽然看起来像一个普通网页窗口但内部其实是三层界面叠在一起顶部 28px自定义标题栏地址标识、前进/后退/刷新、置顶、主题切换中部主体ChatGPT 官方网页chatgpt.com底部 120px可选开启独立的快捷提问输入框Ask Mode这三层就是三个独立的 Webview。架构总览core 窗口如何挂载 3 个 Webview一切的起点在 src-tauri/src/core/setup.rs。应用启动时Rust 后端做了三件事创建唯一窗口core初始 800×600最小 300×200macOS 下使用 Overlay 标题栏样式隐藏系统标题栏构建mainWebview加载https://chatgpt.com并注入初始化脚本构建titlebar与ask两个 Webview分别加载index.html?typetitlebar和index.html?typeask。然后通过add_child按坐标和尺寸把三者拼进同一个窗口Webview加载内容位置职责mainchatgpt.com主体区域真正的聊天网页titlebar本地 index.html顶部 28px 高自定义导航与工具按钮ask本地 index.html底部 120px 高快捷提问输入框高度常量定义在 src-tauri/src/core/constant.rsTITLEBAR_HEIGHT 28.0、ASK_HEIGHT 120.0。为什么要把 Webview 拆成三个这是整套架构最值得新手借鉴的地方 main 是第三方网站ChatGPT 页面自带侧边栏、用户头像等 UI无法改造。把网页「原封不动」放进一个 Webview才能始终跟随官方更新。titlebar 必须是自己的要显示当前 URL、实现刷新/前进/后退、窗口置顶、主题切换等功能只能在窗口顶部叠一层「自己的」Webview 来完成。ask 输入框独立成层它不占用网页空间且可以独立获取焦点。用户可以在 Ask 框里快速输入并直接发送无需和网页内的输入框抢焦点。前端的两个「本地页面」由路由分发src/routes.tsx 根据 URL 参数type把请求导向 Titlebar 视图 或 Ask 视图同一个index.html入口即可渲染出两种界面。三个 Webview 之间如何「对话」跨 Webview 协作靠两条通道全部在 Rust 侧中转 ⚙️通道一URL 变更广播。启动时向main注入 INIT_SCRIPT 脚本劫持history.pushState/popstate等事件。每当网页内部跳转脚本就通过 Tauri 事件把新 URL 发给titlebar标题栏随即更新地址胶囊。通道二IPC 命令。命令注册在 src-tauri/src/main.rs实现在 src-tauri/src/core/cmd.rsview_reload/view_go_back/view_go_forward标题栏按钮 → 对main执行location.reload()、history.back()等window_pin切换窗口置顶并持久化配置ask_sync/ask_sendAsk 输入框的关键魔法 Ask 的完整链路非常巧妙src/view/Ask.tsx用户在底部框里打字 →ask_sync命令 → Rust 在main里执行ChatAsk.sync(文本)实时把内容「镜像」到网页内的真实输入框按CtrlEntermacOS 为⌘Enter→ask_send命令 → 执行ChatAsk.submit()提交500ms 后焦点回到 Ask 框形成「连续提问」流。也就是说你打的是自己的输入框发送的却是网页里的输入框用户体验像原生应用底层却零侵入网页。细节亮点布局重排与跨平台差异窗口缩放自适应on_window_event监听Resized事件实时重算三个 Webview 的位置与尺寸setup.rs 重排逻辑macOS 与其他系统布局不同macOS 的main下移到 28px 之下以避开红绿灯按钮其他系统main从 (0,0) 开始、标题栏压在网页底部setup.rs 平台分支Ask 模式开关set_view_ask命令在开启/关闭时重排布局并切换焦点状态写入本地配置src-tauri/src/core/conf.rs下载拦截main的下载请求被重定向到系统下载目录完成后自动打开文件setup.rs。10分钟复盘关键文件清单想动手阅读源码按这个顺序10 分钟即可跑通理解src-tauri/src/main.rs — 入口与 IPC 命令注册src-tauri/src/core/setup.rs — 窗口 3 Webview 构建与布局核心中的核心src-tauri/src/core/constant.rs — 高度常量与注入脚本src-tauri/src/core/cmd.rs — 所有跨视图命令的实现src/routes.tsx — 前端如何按type参数渲染标题栏/输入框src-tauri/tauri.conf.json — 应用配置总结ChatGPT 桌面客户端用「1 窗口 3 Webview」的多 Webview 架构优雅地解决了「原生体验 vs 第三方网页不可控」的矛盾让网页做网页擅长的事让原生层做网页做不了的事。这套思路——主视图 功能条视图分层叠放、Rust 中转通信、注入脚本桥接事件——同样适用于任何需要包装 Web 服务的桌面应用开发非常值得新手借鉴 ✨【免费下载链接】ChatGPT❄️ ChatGPT Desktop Application (Mac, Windows and Linux)项目地址: https://gitcode.com/GitHub_Trending/cha/ChatGPT创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考