5.0 KiB
5.0 KiB
LagZero 开发指南
1. 项目定位
LagZero 是一个面向游戏加速场景的桌面客户端,主要由以下几部分组成:
- 渲染进程:
Vue 3 + Pinia + Vue Router + Naive UI + UnoCSS - 主进程:
Electron - 网络内核:
sing-box - 数据存储:
better-sqlite3 + Kysely - 测试:
Vitest + happy-dom
项目采用 Hash 路由,并同时维护主窗口与托盘窗口两套入口视图。
2. 环境准备
基础要求
- Node.js
18+ pnpm- Windows 环境下建议使用管理员权限运行开发环境,尤其是调试 TUN、系统代理和 DNS 相关逻辑时
安装与启动
pnpm install
pnpm rebuild:native
pnpm dev
为什么一定要执行 pnpm rebuild:native
项目依赖 better-sqlite3,它是原生模块。Electron 的 Node ABI 与普通 Node.js 不完全一致,如果不重建,开发阶段很容易遇到启动失败或 ABI 不匹配问题。
3. 常用命令
| 命令 | 作用 |
|---|---|
pnpm dev |
启动 Vite + Electron 开发环境 |
pnpm build |
执行 vue-tsc -b 后构建渲染进程产物 |
pnpm test |
运行 Vitest 单元测试 |
pnpm pack |
打包为未安装目录,便于验证桌面运行环境 |
pnpm dist |
构建当前平台安装包 |
pnpm dist:win:all |
构建 Windows x64/arm64 的 NSIS 与 Portable 包 |
pnpm rebuild:native |
重建 Electron 原生依赖 |
pnpm rebuild:sqlite |
仅重建 better-sqlite3 |
4. 启动流程
主进程启动
electron/main/index.ts 是主进程总入口,主要负责:
- 设置
userData路径与单实例锁 - 启用提权、CSP、CrashReporter、日志系统
- 创建主窗口与托盘窗口
- 实例化
DatabaseService、SingBoxService、SystemService等核心服务 - 注册应用级 IPC、对话框 IPC、扫描 IPC 与更新 IPC
渲染进程启动
src/main.ts 是渲染进程入口,主要负责:
- 初始化运行时日志与延迟会话存储
- 挂载
router、pinia、i18n - 在主窗口中初始化本地代理自动启动与节点监听逻辑
- 对托盘窗口
#/tray做特判,避免执行不必要的业务初始化
启动顺序图
sequenceDiagram
participant App as Electron App
participant Main as electron/main/index.ts
participant Preload as electron/preload/index.ts
participant Renderer as src/main.ts
participant Store as Pinia Stores
App->>Main: app.whenReady()
Main->>Main: 创建窗口 / 托盘 / 注册 IPC
Main->>Main: 初始化 DatabaseService 等服务
Main->>Preload: 加载 preload
Preload->>Renderer: 暴露 window.electron / window.system / window.singbox ...
Renderer->>Store: 初始化 settings / nodes / games / local-proxy
Store->>Main: 通过 src/api -> preload -> IPC 调用主进程能力
5. 日常开发建议
新增一个前端功能
推荐顺序:
- 如果主渲染进程都要用到数据结构,先在
shared/types/定义类型 - 如果只是页面逻辑,先评估放进
store还是composable - 如果需要主进程能力,先在
preload和src/api打通桥接 - 页面层优先走
store,不要在组件里直接拼 IPC 调用链
新增一个 Electron 能力
推荐顺序:
- 在
electron/services/新建或扩展服务 - 在服务中注册
ipcMain.handle(...) - 在
electron/preload/index.ts暴露到window.* - 在
src/api/*.ts增加薄封装 - 在
store或composable中消费
新增一个设置项
推荐落点:
- 持久化设置:
src/stores/settings.ts - 设置界面:
src/components/settings/ - 若会影响加速流程:同步检查
src/stores/games.ts、src/stores/local-proxy.ts、src/utils/singbox-config.ts
新增一个游戏平台扫描器
推荐顺序:
- 在
electron/services/scanners/新增平台扫描器 - 在
electron/services/game-scanner.ts注册到scanners列表 - 复用现有
ScanProgressCallback、dedupeProcessNames、normalizeFsPath等工具 - 通过
useGameScanner()触发扫描,并让gameStore负责入库
6. 开发时需要特别注意的约束
- 渲染进程不要直接暴露或使用
ipcRenderer,统一经过preload shared/层不要依赖 Vue、Electron 或浏览器对象- 托盘窗口走
#/tray,src/main.ts已明确跳过本地代理自动初始化 generateSingboxConfig()是加速配置的单一出口,改代理规则优先改这里- 本地代理与游戏加速共用 sing-box 进程,变更逻辑时要同时考虑
games与local-proxy两条链路
7. 测试与验证
单元测试
pnpm test
当前测试主要覆盖:
- 协议解析
- sing-box 配置生成
- 代理监控逻辑
- Steam 扫描器与扫描工具
- 主题逻辑
- 分类管理和 JSON store
手动验证建议
- 节点导入、节点测速、订阅刷新
- 游戏扫描、游戏启动/停止加速
- TUN 与系统代理两种模式切换
- 本地代理自动选点与健康检查
- 托盘状态同步、主窗口关闭行为、应用重置