[RFC] 103 - 桌面端拦截路由 #7310
arvinxx
started this conversation in
RFC | 特性开发
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
背景概述
在做 #6878 时,我们期望在桌面端 settings 可以在独立窗口打开,但如果是在web里仍然跳转页面。这里需要的是在桌面端模式下的拦截路由逻辑,使得桌面端可以相对灵活地控制特定路由的处理方式。进而获得更好的用户体验。
本文档描述了这样一个全局路由拦截机制实现逻辑,该机制能够在用户尝试通过各种方式导航到特定路径(如
/settings
)时自动拦截请求,并在特定的独立窗口中打开相应内容,同时支持子路径处理。设计目标
无缝拦截用户导航
灵活的窗口管理
子路径精确识别
扩展性设计
技术架构
LobeHub 桌面应用的路由拦截机制由三个主要部分组成:
1. 拦截器定义(渲染进程 - Preload)
在预加载脚本中设置DOM级别的拦截器,捕获:
<a>
元素点击事件pushState
和replaceState
)2. 拦截配置(共享配置)
定义哪些路径需要拦截及其对应的目标窗口:
3. 主进程处理(Electron主进程)
处理来自渲染进程的拦截请求,并执行相应的窗口操作:
工作流程
用户触发导航
Preload脚本拦截
routeInterceptor.ts
中的拦截器捕获导航尝试findMatchingRoute
检查是否需要拦截发送IPC消息
invoke('interceptRoute', ...)
向主进程发送请求主进程处理
BrowserWindowsCtr.interceptRoute
接收请求窗口管理
browserManager
打开对应窗口showSettingsWindowWithTab
导航到子路径openTargetWindow
打开并显示窗口返回结果
组件关系图
拓展与配置
添加新的拦截路径
要添加新的拦截路径,只需在
interceptRoutes
配置中添加新项:新窗口定义
同时,需要在
appBrowsers
中定义新窗口的配置:总结
该路由拦截机制通过渲染进程拦截、共享配置和主进程处理的三层架构,实现了无缝的路由导航和窗口管理。该设计不仅能满足设置窗口的拦截需求,还为未来添加新的拦截规则和窗口类型提供了可扩展的框架。
通过这种方式,我们就能够为用户提供一个更像原生应用的体验,同时保持基于网页的界面灵活性和功能丰富性。这种混合模式可以作为现代桌面应用开发的最佳实践,在用户体验和开发效率之间取得良好的平衡。
Beta Was this translation helpful? Give feedback.
All reactions