核心问题: 一个带自动 Mihomo 内核拉取管线的 Tauri 客户端,是否比你现有的 Clash 客户端更值得换?
RepoDaily 采用评分
RepoDaily 将该项目的采用分评为 88/100(强):分数来自文章来源、安装路径、生产风险、差异化、许可证清晰度以及 AI/Agent 适配度。
包含 5 个来源、覆盖 3 类来源;如有 RepoDaily 独有模块,会进一步提高证据分。
检测到 6 个工作流步骤、5 个下一步动作,以及 4 个命令/安装信号。
趋势热度为 +195 stars;如内容中有 release、issue 或维护信号,会提高维护可信度。
采纳风险标记为 medium,并包含 5 条安全说明与 4 条跳过条件。
3 个机会视角、4 个替代方案,以及 4 个类型化模块支撑差异化判断。
文章中包含许可证来源或许可证表述。
文章正文和元数据中检测到 2 个 AI/Agent 相关信号。
项目概览
Clash Verge Rev 是一款代理配置桌面客户端,维护者将其描述为基于 Tauri、可运行于 Windows、macOS 和 Linux 的现代 GUI。2026 年 8 月 31 日它以单窗口 195 星排在 GitHub 趋势榜第 17 位。GitHub 把主语言标为 TypeScript,但项目实际是双技术栈:package.json 在 JavaScript 侧声明了 React 19.2.8、MUI 9 和一组 Tauri 2.x 插件,Cargo.toml 则定义了以 src-tauri 为首的八成员 Rust 工作区。
核心设计在于界面与引擎分离。执行 `pnpm run prebuild` 会运行 scripts/prebuild.mjs 下载 Mihomo 内核与服务二进制,加 `--force` 则重新下载并覆盖。仓库因此从不打包代理引擎,每次开发构建都从同一段脚本拉取开始。Rust 侧通过 tauri-plugin-mihomo-api 与内核通信,而该依赖被直接固定在项目自己的 fork 分支 `refactor-use-reqwest-ipc` 上,而非带版本号的正式发布。package.json 里这一行是整个仓库最值得注意的供应链事实。
功能深度写在工作区 crate 名字里:clash-verge-media-unlock、clash-verge-limiter、clash-verge-signal、clash-verge-logging、clash-verge-draft、clash-verge-i18n 和 tauri-plugin-clash-verge-sysinfo。前端方面,配置编辑跑在 Monaco 里并搭配 monaco-yaml 与 meta-json-schema,订阅 YAML 在应用内即可获得 schema 提示;解析则分别由 JavaScript 侧的 js-yaml 和 Rust 侧的 serde_yaml_ng 承担。
治理标准比多数桌面应用更严。package.json 声明版本 2.5.3、许可证 GPL-3.0-only,与 LICENSE 文件中的完整 GPLv3 文本一致。发布 profile 针对优化二进制调校(codegen-units = 1、thin LTO、opt-level 3),工作区级 clippy 配置直接 deny 了 `panic`、`cognitive_complexity`、`await_holding_lock` 等数十类 lint。合并 PR 前还要求签名提交。
为什么现在变热
- 2026 年 8 月 31 日窗口内获得 195 星、趋势榜第 17 名,跨平台桌面代理 GUI 的需求依然稳定。
- 两侧技术栈都很新:Cargo.toml 固定 tauri 2.11.5,前端使用 React 19.2.8 与 @tauri-apps/api 2.11.1。
- 发版全程脚本化:package.json 列出 release-version.mjs、publish-version.mjs、fix-alpha_version.mjs,版本号为 2.5.3。
- Windows 体验有专门打磨:`portable` 与 `portable-fixed-webview2` 两个脚本面向需要固定 WebView2 运行时便携版的用户。
解决什么问题
- 在三个操作系统上手工编辑 Clash/Mihomo YAML 且没有 schema 校验;应用用 Monaco 加 monaco-yaml 和 meta-json-schema 回应这一点。
- GUI 与内核版本同步麻烦;`pnpm run prebuild --force` 把内核刷新压缩成一条命令,省去手动找下载。
- Windows 集成复杂:windows-sys 引入了 WinSock、Security_Authorization、Threading、JobObjects、Storage_FileSystem 等特性,deelevate 负责在服务安装后降权。
- 多语言维护成本:专门的 clash-verge-i18n crate 加上 `i18n:check`、`i18n:format` 脚本(node scripts/cleanup-unused-i18n.mjs)防止语言键漂移。
工作原理
- `pnpm run prebuild` 运行 scripts/prebuild.mjs 拉取 Mihomo 内核与服务二进制;`--force` 会覆盖已有副本。
- src-tauri 的 Rust 后端管理内核进程;reqwest 0.13.4(配置 rustls、json、cookies、gzip、form 特性)与 tokio 1.53.1 负责网络与异步运行时。
- React 19 前端通过 @tauri-apps/api 2.11.1 与官方插件(dialog、fs、http、shell、clipboard-manager、updater)调用后端。
- tauri-plugin-mihomo-api 打通 GUI 与 Mihomo 控制接口;该依赖固定在 clash-verge-rev 自己的 fork 分支 `refactor-use-reqwest-ipc` 上。
- 配置在带 YAML schema 支持的 Monaco 编辑器里修改;react-hook-form、swr 和 dnd-kit 驱动外层设置界面。
- tauri-plugin-updater 2.10.1 配合 scripts/updater.mjs 处理应用更新分发。
架构解读:一个仓库、八个 crate、两套工具链
Cargo 工作区(resolver 2)包含 src-tauri 以及 crates/clash-verge-draft、crates/clash-verge-media-unlock、crates/clash-verge-logging、crates/clash-verge-signal、crates/tauri-plugin-clash-verge-sysinfo、crates/clash-verge-i18n、crates/clash-verge-limiter。crate 名字与产品能力一一对应:流媒体解锁检测、限速、日志、信号与系统信息。
release profile 设置 panic 为 unwind、codegen-units 为 1、thin LTO、opt-level 3,并保留调试信息(debug = 1、strip = none)。另一个 fast-release profile 继承 release 但降到 opt-level 0、关闭 LTO、用 64 个 codegen 单元,`pnpm build:fast` 正是通过 `tauri build -- --profile fast-release` 选中它。
Windows 专属依赖在 Cargo.toml 中单独隔离:deelevate 0.2.0 与 windows-sys 0.61.2(特性含 Win32_Foundation、Networking_WinSock、Security、Security_Authorization、Storage_FileSystem、System_Threading、System_JobObjects)。后端其他值得注意的依赖包括启用 hardware-lock-elision 的 parking_lot、flexi_logger、socket2 和 compact_str。
上手路径:从 clone 到跑起开发构建
- 前置条件:安装 Rust 与 Node.js(CONTRIBUTING 链接到 Tauri 官方指引),执行 `corepack enable`,然后 `pnpm install`。
- Windows:用 MSVC 工具链,执行 `rustup target add x86_64-pc-windows-msvc` 和 `rustup set default-host x86_64-pc-windows-msvc`,并安装 GNU patch 工具。
- Windows ARM 还需安装含 clang 的 LLVM,因为 `ring` crate 构建时依赖 clang。
- 仅 Ubuntu 需要:`sudo apt-get install -y libxslt1.1 libwebkit2gtk-4.1-dev libayatana-appindicator3-dev librsvg2-dev patchelf`。
- `pnpm run prebuild` 拉取 Mihomo 内核与服务二进制(`--force` 重新下载),随后运行 `pnpm dev`、已有实例时用 `pnpm dev:diff`,或 `pnpm dev:tauri` 进入 Tauri 开发模式。
- 构建变体:`pnpm build`(标准)、`pnpm build:fast`(fast-release profile)、`pnpm portable`(Windows 便携版)、`pnpm clean` 清理。
命令面:package.json 实际暴露了什么
- 开发入口:dev、dev:service、dev:sidecar、dev:diff、dev:trace、dev:tauri(`tauri dev -f tauri-dev`,RUST_BACKTRACE=full)。
- 构建:`build` 以 NODE_OPTIONS max-old-space-size 4096 运行 tauri build;`build:fast` 追加 fast-release profile。
- 质量关卡:`lint` 对 src 跑 eslint 且 --max-warnings=0,`format` 用 Biome,`typecheck` 跑 tsc --noEmit,`test` 跑 vitest,`test:dev-control` 用 node --test 执行 scripts/dev-control.test.mjs 和 scripts/service-release.test.mjs。
- 日常维护:knip 检查未用代码,i18n:check、i18n:format、i18n:types 维护语言键;Rust 侧按 CONTRIBUTING 执行 `cargo clippy-all` 和 `cargo fmt`。
维护风险:刻意求严
工作区 clippy 配置 deny 了 panic、unimplemented、cognitive_complexity、future_not_send、await_holding_lock、redundant_clone,并以 correctness 组整体 deny,另加数十条;dbg_macro、expect_used、todo 为警告。对外部贡献者门槛很高,变更审查因此更集中在熟悉 lint 政策的维护者手中。
流程摩擦是有意为之:CONTRIBUTING 要求签名提交、fork 加分支的 PR 模型,提交前同时跑 `cargo clippy-all` 和 `pnpm lint`。定制发版脚本(fix-alpha_version.mjs、release-version.mjs、publish-version.mjs)意味着贡献者要学习项目专属自动化,而不是纯 tauri CLI。
fork 固定依赖 tauri-plugin-mihomo-api(github:clash-verge-rev/tauri-plugin-mihomo#refactor-use-reqwest-ipc)意味着核心 IPC 的变更落在分支名上而非标签版本。打算长期基于此客户端构建的人应持续跟踪该分支的提交。
谁适合关注
适合关注
- 在 Windows、macOS 或 Linux 上管理 Mihomo/Clash 订阅、想要客户端内置 schema 辅助 YAML 编辑的桌面用户。
- Windows ARM 用户与贡献者:ring crate 对 LLVM/clang 的要求已在 CONTRIBUTING 中明确写出。
- 需要便携版的 Windows 用户:`pnpm portable` 与 `portable-fixed-webview2` 是一等公民脚本。
- 愿意跨 Rust 与 TypeScript 工作的开发者:`cargo clippy-all` 和 `pnpm lint` 双双把守贡献入口。
可以先跳过
- 纯移动端用户:项目只面向桌面操作系统。
- 不愿在不审查下载地址的情况下运行 scripts/prebuild.mjs 在构建期拉取二进制的环境。
- 政策上禁止在涉及再分发时引入 GPL-3.0-only 代码的组织。
- 要求所有依赖来自带版本的正式发布的场景:核心 IPC 插件按分支名固定在 fork 上。
风险与注意事项
GPL-3.0-only 桌面客户端,构建时用脚本拉取 Mihomo 内核二进制,核心 IPC 插件固定在 fork 分支而非带标签的发布上。
- 许可证为 GPL-3.0-only:分发修改版会触发 copyleft 义务。
- scripts/prebuild.mjs 在 setup 阶段下载内核与服务二进制,受限网络需先审查其 URL。
- tauri-plugin-mihomo-api 以分支名引用项目自己的 fork,而不是版本号。
- 仓库元数据未填 homepage 和 topics,全部文档都在仓库文件内部。
- LICENSE 文件是完整的 GNU GPL v3 文本,package.json 声明 GPL-3.0-only,两者一致。
- 后端 HTTP 使用配置了 rustls(外加 json、cookies、gzip、form 特性)的 reqwest,而非默认 TLS 绑定。
- 工作区 lint 在 Rust 后端 deny `panic` 与 `unimplemented`,降低代理控制路径上的突然中止。
- CONTRIBUTING 要求合并的变更使用签名提交,主干作者身份可验证。
- 定制更新脚本(updater.mjs、updater-fixed-webview2.mjs)与 portable.mjs 在敏感环境中启用自动更新前值得做一次源码审查。
替代方案比较
| 方案 | 适用场景 | 代价 |
|---|---|---|
Mihomo (Meta 内核) | 只想要代理引擎本体、不要 GUI:作为服务运行并手工编辑 YAML。 | 免费开源 |
v2rayN | 需要 Windows 优先、支持 Clash 格式之外多协议的客户端。 | 免费开源 |
FlClash | 想要基于 Flutter、同时覆盖移动平台的 Clash GUI。 | 免费开源 |
Clash for Windows | 仍以其为标准的老环境;该项目已停止维护,需规划迁移。 | 免费(已停止维护) |
这个趋势说明了什么
把内核供应链钉住并审计
prebuild.mjs 在每次全新 checkout 时拉取 Mihomo 内核与服务二进制,下载地址就是供应链审查的唯一咽喉点。可以内部镜像这些地址并在每次发布时比对。
阅读 scripts/prebuild.mjs,记录它触碰的每个 URL,再对镜像主机执行 `pnpm run prebuild --force` 并比对拉取到的二进制。
发布经过校验的配置
Monaco、monaco-yaml 与 meta-json-schema 已让编辑器具备 schema 感知的 YAML 校验;同一套 schema 也能在订阅文件触达最终用户前先行把关。
把一份故意写坏的配置载入内置编辑器,观察内核重载前能弹出哪些 schema 错误。
先覆盖最难构建的目标平台
Windows ARM 需要 LLVM/clang 编译 ring crate,Ubuntu 需要包括 libwebkit2gtk-4.1-dev 与 patchelf 在内的五个 apt 包;把这些目标纳入 CI 可以消除新贡献者最常见的首次构建失败。
在干净的 Windows ARM 与 Ubuntu 机器上按 CONTRIBUTING 前置条件操作,测量新贡献者到第一次成功 `pnpm dev:tauri` 之前要走多远。
RepoDaily 判断
Clash Verge Rev 2.5.3 是一款治理严格的 GPL-3.0-only 桌面代理 GUI:Tauri 2.11.5 与 React 19 的双栈分工、脚本化的 Mihomo 内核管线,以及多数桌面项目从不采用的工作区级 clippy deny 策略。构建期二进制拉取与 fork 固定的 IPC 插件,是把它当作日常客户端之前必须权衡的两个具体事实。