# 模块说明与使用方法
## 1. 通用调用链
在 LagZero 中,推荐遵循下面这条调用链:
```mermaid
flowchart LR
A["View / Component"] --> B["Store / Composable"]
B --> C["src/api"]
C --> D["window.*"]
D --> E["Electron IPC"]
E --> F["Service / Database / System"]
```
原则上:
- 组件负责展示与交互
- `store` 负责跨页面业务状态
- `composable` 负责可复用逻辑
- `src/api` 是渲染进程调用主进程的薄封装
- `preload` 是唯一允许暴露主进程能力给渲染进程的地方
## 2. 前端模块
### 2.1 游戏模块
相关文件:
- `src/views/library/index.vue`
- `src/views/dashboard/index.vue`
- `src/stores/games.ts`
- `src/utils/singbox-config.ts`
职责:
- 管理游戏库、当前选中游戏、运行状态、延迟与加速时长
- 负责游戏加速的启动与停止
- 根据节点与设置生成 sing-box 配置
- 在进程模式下协调 `proxyMonitor`
常用方法:
- `init()`: 初始化游戏库
- `setCurrentGame(id)`: 切换当前游戏
- `addGame(game)`, `updateGame(game)`, `removeGame(id)`: 游戏 CRUD
- `startGame(id)`: 启动加速
- `stopGame(id)`: 停止加速
- `matchRunningGames(processNames)`: 根据进程名回填运行状态
- `applySessionNetworkTuningChange()`: 当前正在加速时重启应用配置
示例:
```ts
```
使用建议:
- 如果只是编辑游戏资料,用 `addGame` / `updateGame`
- 如果涉及启停 sing-box,一律走 `startGame` / `stopGame`
- 修改加速规则时,优先检查 `generateSingboxConfig()` 是否也要更新
### 2.2 节点模块
相关文件:
- `src/views/nodes/index.vue`
- `src/components/node/*`
- `src/stores/nodes.ts`
- `src/utils/protocol.ts`
职责:
- 管理节点列表、筛选、排序、分组与多选
- 导入/导出分享链接
- 节点订阅刷新
- 延迟测速与会话统计
常用方法:
- `loadNodes()`: 从数据库加载节点
- `saveNode(node)`: 保存节点
- `addNodes(content)`: 从分享链接文本导入节点
- `removeNode(id)`, `removeNodes(ids)`: 删除节点
- `refreshSubscription(id)`: 手动刷新订阅
- `runScheduledSubscriptions(reason)`: 按启动或手动场景执行订阅刷新
- `checkNode(node, methodOverride?, context?)`: 测单个节点
- `checkAllNodes()`: 批量测速
示例:
```ts
```
使用建议:
- 页面层不要自己解析节点分享链接,统一复用 `addNodes`
- 订阅刷新默认会做去重,手动导入允许重复
- 如果删除节点会影响当前加速中的游戏,`nodes` store 已内置停机兜底逻辑
### 2.3 本地代理模块
相关文件:
- `src/stores/local-proxy.ts`
- `src/main.ts`
职责:
- 应用启动时自动拉起本地代理
- 在可用节点中递归探测并选择健康节点
- 节点变更后自动切换或恢复
- 定时做本地代理健康检查
常用方法:
- `startLocalProxy(reason?)`
- `stopLocalProxy()`
- `recheckLocalProxyHealth()`
- `handleNodeListChanged()`
- `applySettingsChange()`
示例:
```ts
```
使用建议:
- 不要在组件里直接拼测试端口、递归探测等流程,这些都已经封装在 store 中
- 这个模块与游戏加速共用 sing-box 进程,改动前要确认不会破坏 `games` store 的启停流程
### 2.4 设置模块
相关文件:
- `src/stores/settings.ts`
- `src/components/settings/*`
- `src/views/settings/index.vue`
职责:
- 持久化语言、主题、窗口关闭行为
- 持久化 DNS、检测方式、本地代理、系统代理与 TUN 相关设置
- 管理全局会话级网络调优参数
常用字段:
- `language`, `theme`, `themeColor`
- `windowCloseAction`
- `checkInterval`, `checkMethod`, `checkUrl`
- `dnsMode`, `dnsPrimary`, `dnsSecondary`, `dnsBootstrap`
- `localProxyEnabled`, `localProxyPort`
- `accelNetworkMode`, `systemProxyPort`, `systemProxyBypass`
- `tunInterfaceName`
- `sessionNetworkTuning`
常用方法:
- `resetSessionNetworkTuning()`
- `applySessionNetworkProfilePreset(profile, options?)`
示例:
```ts
```
### 2.5 游戏扫描模块
相关文件:
- `src/composables/useGameScanner.ts`
- `electron/services/game-scanner.ts`
- `electron/services/scanners/*.ts`
职责:
- 调用主进程扫描本地游戏平台与本地快捷方式
- 自动匹配分类并写入游戏库
- 扫描运行进程并回填游戏运行状态
常用方法:
- `scanGames()`
- `isScanning`
- `scanProgressText`
示例:
```ts
```
### 2.6 托盘模块
相关文件:
- `src/views/tray/index.vue`
- `electron/main/tray.ts`
- `src/layouts/MainLayout.vue`
职责:
- 展示当前游戏、延迟、丢包与加速时长
- 提供快速启停、显示主窗口与退出应用操作
- 与主窗口通过托盘状态快照同步
注意点:
- 托盘页走 `#/tray`
- `src/main.ts` 对托盘窗口做了特判,不会初始化主窗口的本地代理监听逻辑
## 3. Electron 主进程模块
### 3.1 `DatabaseService`
文件:`electron/services/database.ts`
职责:
- 初始化 SQLite 数据库
- 管理 `nodes`、`games`、`categories` 等核心数据
- 做数据迁移、默认分类补齐、分类与标签冲突修复
建议:
- 业务数据落库优先经过这个服务
- `GameService` / `NodeService` / `CategoryService` 只是它的 IPC 薄封装
### 3.2 `SingBoxService`
文件:`electron/services/singbox/index.ts`
职责:
- 下载和校验 sing-box 二进制
- 启动、停止、重启 sing-box 进程
- 采集日志并转发到渲染进程
- 处理进程路由规则更新
对应 IPC:
- `singbox-start`
- `singbox-stop`
- `singbox-restart`
- `singbox-ensure-core`
- `singbox-get-install-info`
### 3.3 `SystemService`
文件:`electron/services/system.ts`
职责:
- `ping` / `tcpPing`
- DNS 刷新
- TUN 网卡重装
- 系统代理设置与恢复
- 本地 HTTP 代理连通性测试
- 主进程代理 HTTP 请求
适用场景:
- 节点测速
- 本地代理健康检查
- 系统代理模式切换
- 网络诊断工具
### 3.4 `ProxyMonitorService`
文件:`electron/services/proxy-monitor.ts`
职责:
- 按游戏进程名轮询进程树
- 找出链式拉起的子进程
- 将新发现的子进程同步给 sing-box 动态代理
适用场景:
- `proxyMode = 'process'`
- `chainProxy = true`
### 3.5 `GameScannerService`
文件:`electron/services/game-scanner.ts`
职责:
- 并发调用多个平台扫描器
- 去重安装目录和进程名
- 提供目录扫描能力给“选择文件夹导入进程”功能
当前已接入平台:
- Steam
- Microsoft
- Epic
- EA
- BattleNet
- WeGame
- Local shortcut
### 3.6 `WindowManager` 与 `TrayManager`
文件:
- `electron/main/window.ts`
- `electron/main/tray.ts`
职责:
- `WindowManager`: 主窗口创建、窗口关闭行为管理、开发者工具、主窗口 IPC
- `TrayManager`: 托盘图标、托盘浮窗、显示主窗口、退出应用
注意点:
- 关闭按钮行为可配置为 `ask / minimize / quit`
- 托盘浮窗是独立 `BrowserWindow`,不是原生菜单
## 4. 渲染进程与主进程之间怎么接
推荐固定模板:
1. `electron/services/*` 或 `electron/main/index.ts` 注册 IPC
2. `electron/preload/index.ts` 通过 `contextBridge.exposeInMainWorld` 暴露
3. `src/api/*.ts` 包装成统一调用方法
4. `src/stores/*` 或 `src/composables/*` 负责消费
5. `src/views/*` / `src/components/*` 只调用上层封装
示例路径:
```text
src/views/nodes/index.vue
-> src/stores/nodes.ts
-> src/api/nodes.ts
-> window.nodes.*
-> ipcMain.handle('nodes:*')
-> electron/services/node.ts
-> electron/services/database.ts
```
## 5. 扩展建议
### 新增一个 IPC 能力
最推荐的文件落点:
- 主进程逻辑:`electron/services/xxx.ts`
- 桥接层:`electron/preload/index.ts`
- 渲染进程 API:`src/api/xxx.ts`
- 业务状态:`src/stores/xxx.ts` 或 `src/composables/useXxx.ts`
### 新增一个共享数据结构
最推荐的文件落点:
- `shared/types/*.ts`
- 渲染进程 re-export:`src/types/index.ts`
### 新增一个系统级功能
优先判断是否属于下面其中一种:
- 文件系统、网络诊断、端口检查、系统代理:加到 `SystemService`
- sing-box 生命周期和配置校验:加到 `SingBoxService`
- 业务数据 CRUD:加到 `DatabaseService`
- 游戏平台扫描:加到 `GameScannerService` 或 `scanners/`
## 6. 维护时最容易踩坑的点
- 直接在组件里调用 `window.*`,会让调用链分散,后期难维护
- 修改节点结构却忘了同步 `shared/types`、数据库和协议解析
- 只改游戏加速逻辑,没考虑本地代理复用同一 sing-box 进程
- 给托盘页加主窗口初始化逻辑,导致托盘窗口触发多余副作用
- 在 `shared/` 里引入 Electron 或 Vue,导致跨进程复用失败