RepoDaily · 2026-08-31 · Security tool

Clash Verge Rev 2.5.3:Tauri 打造的跨平台代理 GUI,内核靠脚本自动拉取

#17 Security tool TypeScript +195 clash-verge-rev/clash-verge-rev 打开仓库

Clash Verge Rev 把 Mihomo 内核装进 Tauri 桌面壳,前端用 React 19,覆盖 Windows、macOS 与 Linux。2.5.3 版本带工作区级 clippy 拦截和脚本化内核下载管线。

项目类型Security tool
最适合在 Windows、macOS 或 Linux 上管理 Mihomo/Clash 订阅、希望客户端内置 YAML 编辑的桌面用户,以及能同时驾驭 Rust 和 Node.js 工具链的贡献者。
风险等级中等:GPL-3.0-only 客户端,构建时下载 Mihomo 内核二进制,核心 IPC 插件固定在自己的 fork 分支上。
评估时间安装并导入一条订阅约 30-60 分钟;完整本地开发构建约半天。

核心问题: 一个带自动 Mihomo 内核拉取管线的 Tauri 客户端,是否比你现有的 Clash 客户端更值得换?

88/100

RepoDaily 采用评分

RepoDaily 将该项目的采用分评为 88/100(强):分数来自文章来源、安装路径、生产风险、差异化、许可证清晰度以及 AI/Agent 适配度。

基于 RepoDaily 来源和采用说明的方向性评分,不是基准测试。风险: 中
100证据质量

包含 5 个来源、覆盖 3 类来源;如有 RepoDaily 独有模块,会进一步提高证据分。

100可安装/可试用性

检测到 6 个工作流步骤、5 个下一步动作,以及 4 个命令/安装信号。

60维护可信度

趋势热度为 +195 stars;如内容中有 release、issue 或维护信号,会提高维护可信度。

93生产准备度

采纳风险标记为 medium,并包含 5 条安全说明与 4 条跳过条件。

100差异化

3 个机会视角、4 个替代方案,以及 4 个类型化模块支撑差异化判断。

82许可证清晰度

文章中包含许可证来源或许可证表述。

60Agent / AI 适配度

文章正文和元数据中检测到 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 前还要求签名提交。

解决什么问题

  • 在三个操作系统上手工编辑 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)防止语言键漂移。

工作原理

  1. `pnpm run prebuild` 运行 scripts/prebuild.mjs 拉取 Mihomo 内核与服务二进制;`--force` 会覆盖已有副本。
  2. src-tauri 的 Rust 后端管理内核进程;reqwest 0.13.4(配置 rustls、json、cookies、gzip、form 特性)与 tokio 1.53.1 负责网络与异步运行时。
  3. React 19 前端通过 @tauri-apps/api 2.11.1 与官方插件(dialog、fs、http、shell、clipboard-manager、updater)调用后端。
  4. tauri-plugin-mihomo-api 打通 GUI 与 Mihomo 控制接口;该依赖固定在 clash-verge-rev 自己的 fork 分支 `refactor-use-reqwest-ipc` 上。
  5. 配置在带 YAML schema 支持的 Monaco 编辑器里修改;react-hook-form、swr 和 dnd-kit 驱动外层设置界面。
  6. 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` 之前要走多远。

下一步建议

先用自己的订阅跑一次开发构建,再去比较替代品

前置条件写得足够精确,一个下午就能完成;本地构建比任何功能清单都更能说明这款应用的真实状态。

  1. 安装 Rust 与 Node.js,然后执行 `corepack enable` 和 `pnpm install`。
  2. 运行 `pnpm run prebuild` 拉取 Mihomo 内核与服务二进制。
  3. 用 `pnpm dev:tauri` 启动,并导入一条现有的订阅配置。
  4. 在内置 Monaco 编辑器里修改该配置,确认代理规则生效。
  5. 在更长试用之前,阅读 scripts/prebuild.mjs 与 LICENSE,对照你的分发计划核对 GPL-3.0-only 义务。

RepoDaily 判断

Clash Verge Rev 2.5.3 是一款治理严格的 GPL-3.0-only 桌面代理 GUI:Tauri 2.11.5 与 React 19 的双栈分工、脚本化的 Mihomo 内核管线,以及多数桌面项目从不采用的工作区级 clippy deny 策略。构建期二进制拉取与 fork 固定的 IPC 插件,是把它当作日常客户端之前必须权衡的两个具体事实。

信息来源