Clash Verge 开发者文档

面向 Clash Verge 源码构建、二次开发与项目贡献,说明 Tauri 2 + Rust + React 的客户端架构、 本地开发与打包流程、前后端通信、Mihomo 外部控制 API,以及提交代码前需要完成的检查。

  • 客户端Tauri 2 + Rust + React
  • 内核Mihomo(Clash Meta)
  • 协议GPL-3.0

Clash Verge 项目架构

Clash Verge 是基于 Tauri 2 的桌面客户端。React + TypeScript 负责图形界面,Rust 与 Tauri 负责桌面应用和系统集成, Mihomo(Clash Meta)负责规则匹配、DNS 与流量转发。开发时先区分客户端逻辑与内核逻辑,可以更快定位问题。

技术 负责什么
界面层 React + TypeScript + Vite 订阅、节点、规则、连接与日志的可视化操作
应用层 Tauri 2 + Rust 窗口与托盘、内核进程管理、系统代理与 TUN、配置读写、自动更新
内核层 Mihomo(Clash Meta) 协议实现、规则匹配、DNS、流量转发,并对外提供 RESTful API

说明 Clash Verge 的图形界面负责呈现与交互,客户端通过 Tauri/Rust 与系统能力连接,并通过 Mihomo API 读取或修改内核运行状态。 遇到问题时,应先判断它属于前端界面、桌面应用层,还是 Mihomo 内核层。

Clash Verge 开发环境

本地开发需要 Rust、Node.js、Corepack/pnpm,以及当前操作系统对应的 Tauri 构建依赖。不同平台的准备项并不完全相同。

系统 需要安装 备注
通用 Node.js、Corepack/pnpm、Rust 工具链 先执行 corepack enable,并确认 nodepnpmcargo 可用
Windows MSVC Rust 工具链、GNU patch;Windows ARM 还需要 LLVM/clang 确保 Rust 与 Node.js 已加入 PATH;Windows ARM 构建需满足 clang 依赖
macOS Xcode Command Line Tools xcode-select --install
Linux WebKitGTK 4.1、Ayatana AppIndicator、librsvg、patchelf 等开发包 包名按发行版不同,参照 Tauri 官方的依赖清单

注意 Linux 依赖名称会随发行版变化;当前贡献文档以 Ubuntu 为例列出 WebKitGTK、Ayatana AppIndicator、librsvg 与 patchelf。 Windows ARM 还需要 LLVM/clang。具体依赖始终以仓库最新 CONTRIBUTING.md 为准。

Clash Verge 本地开发与构建

开发流程从克隆仓库、安装依赖开始,再通过 prebuild 准备 Mihomo 内核与服务资源,最后进入开发模式或生成当前平台的安装包。

  1. 克隆仓库

    拿到源码并进入项目目录。

  2. 安装前端依赖

    仓库使用 pnpm 管理依赖,混用别的包管理器容易导致锁文件冲突。

  3. 准备 Mihomo 与运行时资源

    执行项目的 prebuild 脚本,下载当前平台所需的 Mihomo 内核与 service/sidecar 资源。

  4. 启动开发模式

    pnpm dev 用于标准开发流程;需要直接运行 Tauri 开发模式时也可使用仓库提供的 pnpm dev:tauri

  5. 打包安装包

    pnpm build 生成正式构建;需要更快的测试构建时可使用项目提供的 pnpm build:fast

shell
# 1. 克隆仓库
git clone https://github.com/clash-verge-rev/clash-verge-rev.git
cd clash-verge-rev

# 2. 启用包管理器并安装依赖
corepack enable
pnpm install

# 3. 下载 Mihomo 内核与运行时资源
pnpm run prebuild
# 需要重新下载时:
# pnpm run prebuild --force

# 4. 启动 Clash Verge 开发环境
pnpm dev
# 可选:pnpm dev:tauri

# 5. 构建当前平台
pnpm build
# 快速测试构建:pnpm build:fast

说明 当前仓库使用 pnpm 管理前端依赖,开发前应先执行 pnpm run prebuild 准备内核与服务资源。 命令名称和参数以后仍可能调整,因此应同时核对 package.jsonCONTRIBUTING.md

Clash Verge 源码目录

源码主要分为前端、Tauri/Rust 应用层与构建脚本。修改界面通常从 src/ 开始,桌面应用与系统集成则重点查看 src-tauri/

目录结构(示意)
clash-verge-rev/
├─ src/                    # React + TypeScript 前端
├─ src-tauri/              # Tauri 2 + Rust 桌面应用层
│  ├─ src/                 # Rust 业务与系统集成代码
│  ├─ resources/           # 应用运行资源
│  ├─ sidecar/             # Mihomo 等外部二进制资源
│  ├─ Cargo.toml           # Rust 依赖
│  └─ tauri.conf.json      # Tauri 构建、应用标识与打包配置
├─ scripts/                # prebuild、版本与发布辅助脚本
├─ .github/                # CI / GitHub Actions
├─ package.json            # 前端依赖与 pnpm scripts
├─ CONTRIBUTING.md         # 官方贡献与开发环境说明
└─ UPDATELOG.md            # 版本更新记录

说明 目录结构会随开发分支调整,上表用于建立代码层级认知。实际修改前应直接查看当前仓库; 涉及界面文案时还应同步项目的国际化资源,并运行相应的格式与检查命令。

Tauri 前后端通信

Clash Verge 前端通过 Tauri API 与 Rust 应用层通信。需要读取系统状态、修改本地配置或调用桌面能力时, 通常通过 invoke 进入 Rust 命令;持续状态变化则可以通过事件监听接收。

typescript
import { invoke } from "@tauri-apps/api/core";
import { listen } from "@tauri-apps/api/event";

// 调用 Rust 侧已经注册的 Tauri 命令
const result = await invoke("command_name", {
  payload: { key: "value" },
});

// 监听 Rust 侧事件
const unlisten = await listen("event-name", (event) => {
  console.log(event.payload);
});

// 页面或组件卸载时取消监听
unlisten();
rust
// 示意:Rust 侧通过 #[tauri::command] 暴露命令
#[tauri::command]
fn command_name(payload: serde_json::Value) -> Result<serde_json::Value, String> {
    Ok(payload)
}

fn main() {
    tauri::Builder::default()
        .invoke_handler(tauri::generate_handler![command_name])
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}

注意 上面的代码只说明 Tauri invoke / event 的通信模型,不代表 Clash Verge 当前实际命令名。 开发具体功能时,应从前端调用位置追踪到 src-tauri 中真实注册的命令和事件。

Mihomo 外部控制 API

Mihomo 可通过 external-controller 暴露 RESTful API。配置 secret 后, 请求需要携带 Bearer 鉴权;代理组、配置、连接、日志与实时流量等运行状态都可以通过这套接口读取或控制。

shell
# 示例地址:请替换为 Clash Verge 当前实际的 external-controller
BASE=http://127.0.0.1:9090
AUTH="Authorization: Bearer 你的-secret"

# 读取 Mihomo 版本与当前配置
curl -H "$AUTH" "$BASE/version"
curl -H "$AUTH" "$BASE/configs"

# 修改运行模式:rule / global / direct
curl -X PATCH -H "$AUTH" -d '{"mode":"rule"}' "$BASE/configs"

# 查看代理与策略组
curl -H "$AUTH" "$BASE/proxies"

# 查看活动连接
curl -H "$AUTH" "$BASE/connections"

# 实时流量与日志可使用 GET / WebSocket
# ws://127.0.0.1:9090/traffic?token=你的-secret
# ws://127.0.0.1:9090/logs?level=info&token=你的-secret
接口 方法 用途
/version GET 内核版本,常用来探测 API 是否可用
/configs GET / PATCH / PUT 读取配置、局部修改(模式、端口),或整体重载配置文件
/proxies GET 列出全部节点与策略组及当前选择
/proxies/{name} GET / PUT 查看单个节点信息,或为策略组切换节点
/proxies/{name}/delay GET 指定测速地址与超时,返回延迟
/rules GET 当前生效的规则列表,用于确认规则是否按预期加载
/connections GET / DELETE 活动连接列表,或断开指定连接
/traffic/logs WebSocket 实时上下行流量与日志流

注意 示例中的端口只是 Mihomo API 演示值,Clash Verge 实际运行端口应以当前配置为准。 external-controller 具有较高控制权限,开发调试时应优先监听本机,并为 API 设置可靠的 secret

Clash Verge 数据与调试目录

Clash Verge 的客户端配置、订阅数据、生成配置与日志保存在本机。调试配置加载、升级迁移或启动问题时,数据目录和日志目录通常是第一排查入口。

系统 大致位置 里面有什么
Windows %APPDATA%\<应用标识>\ 客户端设置、订阅与生成配置、扩展配置/脚本、Mihomo 与应用日志
macOS ~/Library/Application Support/<应用标识>/
Linux ~/.local/share/<应用标识>/

说明 当前 Tauri 配置中的应用标识可在 src-tauri/tauri.conf.json 查看,但实际数据路径仍可能因平台和构建渠道不同而变化。 调试时优先使用客户端提供的应用目录/日志目录入口定位文件,修改前先备份。

Clash Verge 贡献流程

参与 Clash Verge 开发时,应先阅读 CONTRIBUTING.md,保持改动范围明确,并在提交 PR 前完成前端与 Rust 侧的检查、格式化和本地验证。

  1. 先确认贡献范围

    较大的功能或行为修改先通过 Issue / Discussion 对齐问题与方案;修复已有明确问题时也应引用对应上下文。

  2. Fork 并新建分支

    一个分支只做一件事,分支名能说明意图,例如 fix/tray-menu-crash

  3. 运行代码检查与本地验证

    前端运行 pnpm lint,Rust 侧运行 cargo clippy-all,并用 cargo fmt / pnpm format 保持格式一致。

  4. 使用签名提交

    官方贡献说明要求提交进行签名验证;同时保持提交信息清晰,一条提交尽量对应一个独立改动点。

  5. 提交 PR 并附验证说明

    PR 中写清系统环境、修改范围与验证结果;涉及界面变化时附截图,涉及行为变化时说明复现步骤与测试方式。

注意 项目采用 GPL-3.0,提交代码意味着以同样协议授权。涉及新增依赖时请在 PR 里说明必要性与协议兼容性。

Clash Verge 构建与发布

Clash Verge 的正式安装包通过 GitHub Actions/CI 构建并发布到 Releases。开发分支还存在自动构建流程,而 Mihomo Alpha 内核切换属于另一层运行时能力,两者不要混为一谈。

渠道 适合谁 说明
正式 Releases 发布与日常使用 按版本号发布安装包,变更内容查看 Releases 与 UPDATELOG.md
AutoBuild / 开发构建 测试最新提交 面向开发验证,更新频率更高,不应与 Mihomo Alpha 内核通道混淆
自行构建 开发与定制 产物未签名,系统会有安全提示,不建议作为长期使用方式分发给他人

说明 对外分发时应以项目 GitHub Releases 为正式发行来源;自行构建版本需要明确标识来源。 Mihomo 稳定/Alpha 内核切换是客户端内核选择能力,不等同于 Clash Verge 应用版本的发布渠道。

Clash Verge 构建排错

Clash Verge 本地构建失败通常集中在依赖、系统工具链、prebuild 资源或平台运行时。先按下面的现象定位,再去仓库 Issues 搜索同类问题。

现象 常见原因 怎么处理
依赖安装报锁文件错误 用了 npm 或 yarn 安装 统一用 pnpm;删掉 node_modules 后重新 pnpm i
开发模式启动即退出 未准备 Mihomo / service 等运行时资源 先执行 pnpm run prebuild;需要重新下载时加 --force
Rust 编译提示找不到链接器 缺少平台构建工具(MSVC / CLT) 补齐系统构建工具后重开终端再编译
Linux 上报缺少某个库 WebKitGTK 等开发包未安装 按报错里的库名安装对应 -dev
下载内核资源超时 网络无法访问发布地址 配好终端代理再重试,或手动放置资源后重跑
打包成功但启动白屏 前端资源未正确构建,或 WebView2 缺失 先确认前端构建产物存在;Windows 上补装 WebView2 运行时
改了界面文案但语言切换后丢失 只改了一种语言的词条 同步更新 src/locales/ 下所有语言文件

参与 Clash Verge 开发

先按照贡献文档完成本地环境与 prebuild,再从范围清晰的小改动开始。提交前完成 lint、Rust 检查、格式化与签名提交。