9.8 KiB
9.8 KiB
模块说明与使用方法
1. 通用调用链
在 LagZero 中,推荐遵循下面这条调用链:
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.vuesrc/views/dashboard/index.vuesrc/stores/games.tssrc/utils/singbox-config.ts
职责:
- 管理游戏库、当前选中游戏、运行状态、延迟与加速时长
- 负责游戏加速的启动与停止
- 根据节点与设置生成 sing-box 配置
- 在进程模式下协调
proxyMonitor
常用方法:
init(): 初始化游戏库setCurrentGame(id): 切换当前游戏addGame(game),updateGame(game),removeGame(id): 游戏 CRUDstartGame(id): 启动加速stopGame(id): 停止加速matchRunningGames(processNames): 根据进程名回填运行状态applySessionNetworkTuningChange(): 当前正在加速时重启应用配置
示例:
<script setup lang="ts">
import { useGameStore } from '@/stores/games'
const gameStore = useGameStore()
async function onStart(gameId: string) {
await gameStore.startGame(gameId)
}
async function onStop(gameId: string) {
await gameStore.stopGame(gameId)
}
</script>
使用建议:
- 如果只是编辑游戏资料,用
addGame/updateGame - 如果涉及启停 sing-box,一律走
startGame/stopGame - 修改加速规则时,优先检查
generateSingboxConfig()是否也要更新
2.2 节点模块
相关文件:
src/views/nodes/index.vuesrc/components/node/*src/stores/nodes.tssrc/utils/protocol.ts
职责:
- 管理节点列表、筛选、排序、分组与多选
- 导入/导出分享链接
- 节点订阅刷新
- 延迟测速与会话统计
常用方法:
loadNodes(): 从数据库加载节点saveNode(node): 保存节点addNodes(content): 从分享链接文本导入节点removeNode(id),removeNodes(ids): 删除节点refreshSubscription(id): 手动刷新订阅runScheduledSubscriptions(reason): 按启动或手动场景执行订阅刷新checkNode(node, methodOverride?, context?): 测单个节点checkAllNodes(): 批量测速
示例:
<script setup lang="ts">
import { useNodeStore } from '@/stores/nodes'
const nodeStore = useNodeStore()
await nodeStore.loadNodes()
await nodeStore.checkAllNodes()
const importedCount = await nodeStore.addNodes(shareLinksText)
console.log('imported:', importedCount)
</script>
使用建议:
- 页面层不要自己解析节点分享链接,统一复用
addNodes - 订阅刷新默认会做去重,手动导入允许重复
- 如果删除节点会影响当前加速中的游戏,
nodesstore 已内置停机兜底逻辑
2.3 本地代理模块
相关文件:
src/stores/local-proxy.tssrc/main.ts
职责:
- 应用启动时自动拉起本地代理
- 在可用节点中递归探测并选择健康节点
- 节点变更后自动切换或恢复
- 定时做本地代理健康检查
常用方法:
startLocalProxy(reason?)stopLocalProxy()recheckLocalProxyHealth()handleNodeListChanged()applySettingsChange()
示例:
<script setup lang="ts">
import { useLocalProxyStore } from '@/stores/local-proxy'
const localProxyStore = useLocalProxyStore()
async function onProxySettingsChanged() {
await localProxyStore.applySettingsChange()
}
</script>
使用建议:
- 不要在组件里直接拼测试端口、递归探测等流程,这些都已经封装在 store 中
- 这个模块与游戏加速共用 sing-box 进程,改动前要确认不会破坏
gamesstore 的启停流程
2.4 设置模块
相关文件:
src/stores/settings.tssrc/components/settings/*src/views/settings/index.vue
职责:
- 持久化语言、主题、窗口关闭行为
- 持久化 DNS、检测方式、本地代理、系统代理与 TUN 相关设置
- 管理全局会话级网络调优参数
常用字段:
language,theme,themeColorwindowCloseActioncheckInterval,checkMethod,checkUrldnsMode,dnsPrimary,dnsSecondary,dnsBootstraplocalProxyEnabled,localProxyPortaccelNetworkMode,systemProxyPort,systemProxyBypasstunInterfaceNamesessionNetworkTuning
常用方法:
resetSessionNetworkTuning()applySessionNetworkProfilePreset(profile, options?)
示例:
<script setup lang="ts">
import { useSettingsStore } from '@/stores/settings'
const settingsStore = useSettingsStore()
settingsStore.accelNetworkMode = 'tun'
settingsStore.applySessionNetworkProfilePreset('aggressive', {
isCurrentNodeVless: true
})
</script>
2.5 游戏扫描模块
相关文件:
src/composables/useGameScanner.tselectron/services/game-scanner.tselectron/services/scanners/*.ts
职责:
- 调用主进程扫描本地游戏平台与本地快捷方式
- 自动匹配分类并写入游戏库
- 扫描运行进程并回填游戏运行状态
常用方法:
scanGames()isScanningscanProgressText
示例:
<script setup lang="ts">
import { useGameScanner } from '@/composables/useGameScanner'
const { isScanning, scanProgressText, scanGames } = useGameScanner()
</script>
2.6 托盘模块
相关文件:
src/views/tray/index.vueelectron/main/tray.tssrc/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-startsingbox-stopsingbox-restartsingbox-ensure-coresingbox-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.tselectron/main/tray.ts
职责:
WindowManager: 主窗口创建、窗口关闭行为管理、开发者工具、主窗口 IPCTrayManager: 托盘图标、托盘浮窗、显示主窗口、退出应用
注意点:
- 关闭按钮行为可配置为
ask / minimize / quit - 托盘浮窗是独立
BrowserWindow,不是原生菜单
4. 渲染进程与主进程之间怎么接
推荐固定模板:
electron/services/*或electron/main/index.ts注册 IPCelectron/preload/index.ts通过contextBridge.exposeInMainWorld暴露src/api/*.ts包装成统一调用方法src/stores/*或src/composables/*负责消费src/views/*/src/components/*只调用上层封装
示例路径:
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,导致跨进程复用失败