以 Tauri 撕裂 Electron 垄断:Clash Verge 的轻量哲学与桌面分流革命
率先在桌面端引入 Rust + Tauri 轻量架构,以配置覆写脚本与原生服务模式开创现代 GUI 标杆
第一幕 · 时代的沉重桎梏:Chromium 阴影下的桌面代理泥潭
2021 年底,桌面跨平台代理客户端几乎被基于 Electron 的方案全面统治。凭借成熟的前端 Web 生态与开箱即用的跨平台能力,图形界面虽然变得华丽多样,但随之而来的代价却愈发沉重:每个客户端都必须在底层打包一个完整的 Chromium 浏览器内核与 Node.js 运行时。
在这样的架构下,安装包体积动辄突破 100MB,后台静默待机状态下的常驻内存轻松吞噬 300MB 甚至更高。而在低配办公笔记本或多任务重载工作站上,一个仅在后台静默监听本地端口并转发流量的系统级工具,却与大型生产力应用争抢珍贵的 RAM 和 CPU 调度周期,引发风扇狂转与续航崩塌。
“为什么一个代理界面的资源消耗堪比一整个操作系统?”社区对 Electron 臃肿体量的焦虑与反思在极客圈蔓延。面对社区关于安装包体积的疑问,zzzgydi 后来在 GitHub 议题讨论中一针见血地对比了架构差异:“我看了 cfw 最新 release,macOS 的 dmg 包是 90+MB,而 verge 的 dmg 包才 25 不到。Linux 的 deb 包,verge 的也才 30 不到。AppImage 是因为包含了所有依赖,所以也 90+ 了,但是对比 cfw 的,verge 是带了两个 clash core,还多带了两个 meta 核心需要的初始 dat文件。”
跳出内置 Chromium 的传统惯性,寻找一种更底层、更轻量且兼具现代声明式前端体验的全新架构,成为了摆在桌面开发者面前的紧迫命题。而在项目的致谢文档中,他也坦荡写下了对先行的致敬:“Clash Verge was based on or inspired by these projects... Fndroid/clash_for_windows_pkg: A Windows/macOS GUI based on Clash.”[2][3][14]
第二幕 · “这个坑有点大”:Rust + Tauri 的破局与创世宣言
2021 年 12 月 4 日 14:31(UTC+8),开发者 zzzgydi(Git 署名 GyDi)在 GitHub 建立了 clash-verge 仓库,并推送了初代工程代码。他做出了一个在当时极具冒险精神却深具前瞻性的架构决断:全面拥抱新兴的 Rust + Tauri 框架。
Tauri 彻底颠覆了 Electron 的打包思路:它抛弃了臃肿的独立 Chromium 引擎,转而直接挂载宿主操作系统自带的原生渲染管线(Windows 上的 Webview2、macOS 上的 WebKit);而在操作系统底层交互、内核子进程守护与跨进程通信(IPC)层面,则交由具备极致性能与无 GC 内存安全的纯 Rust 执掌。
在 12 月 26 日提交的早期 README 中,zzzgydi 写下了坦率、幽默而又极具极客底色的创世说明:“A Clash GUI based on tauri... Now it's no different from the others, even fewer. (WIP)... This keng is a little big... This is a learning project for Rust practice.”(用于练习 Rust 的学习项目……这个坑有点大……)。
在最初撰写项目使用指南时,他没有任何居高临下的权威姿态,而是极具极客真诚地坦言自身局限:“由于没有提供啥文档,暂时用 issue 介绍其中一些功能……本项目只是对 clash 的部分配置提供方便易用的 GUI 操作,仅此而已。当前版本对于 providers 的支持还只是能看不能用的状态,如果目前你有这个需求,可以考虑社区里其他更全面更完备的项目。”当 Linux 用户急切询问版本进度时,他也风趣而诚恳地回复:“可能要蹲得比较久……有关 linux 系统代理的设置我还不懂,有没有兴趣来个 PR 啥的呢。”
工程红利是立竿见影且颠覆性的:安装包体积骤降至 20MB 左右,待机常驻内存被压缩至数十兆以内。辅以克制雅致的深浅色 UI 与秒级冷启动速度,Clash Verge 以黑马之姿撕开了桌面分流界面的崭新破晓。[2][3][4][5]
第三幕 · 硬核深水区:TUN 网卡接管、Windows 服务与 Meta 拥抱
界面轻盈只是视觉表层,要把操作系统所有进出流量顺畅接管进代理通道,必须深入底层网络协议栈的深水区。2022 年 2 月 25 日,zzzgydi 提交了关键改动,正式为客户端引入 TUN 虚拟网卡模式,并默认封装 Wintun 高性能驱动,让非代理感知型应用实现无缝全局接管。
但在桌面运维的现实场景中,TUN 模式与特权端口操作极易触发 Windows 频繁的 UAC 管理员提权弹窗,甚至导致开机自启动失败。2022 年 4 月 24 日,zzzgydi 耗费大量精力为 Windows 端独创了“服务模式”(Service Mode):将需要高权限执行的底层网卡配置与内核守护注册为独立系统服务,前端 UI 则在普通用户权限下运行。通过本地安全通信协同,彻底消除了每次启动的弹窗骚扰。
在攻坚早期底层服务安装的报错时,他毫不避讳在 issue 中记录排障事实:“程序内部调用 sc 命令得到 exitcode 为 6。暂不清楚原因。解决方法:手动新建一个 install.bat……”随后,他系统总结了客户端启动的底层依赖根因:“程序依赖系统的 Webview2,当 Webview2 不存在时将启动失败……程序采用端口占用的方式实现程序单例和拉起已开启的程序。”
在内核生态的选择上,zzzgydi 同样展现出过人的技术敏锐度。2022 年 5 月中旬,当社区新兴的分支 Clash.Meta(后来的 Mihomo)刚刚崭露头角时,他迅速在 Verge 中完成 Meta 内核集成;5 月 30 日,他更进一步在配置中直接将 Meta 设为默认推荐核心,率先打通了多内核无感热切换通道,加速了社区向现代核心迁移的进程。[6][7][8][9][11]
第四幕 · 规则的自主权:Script 脚本与 YAML Merge 的工程范式
随着去中心化代理生态的发展,普通用户面临着另一道难题:机场或服务商下发的远程订阅配置参差不齐,用户手动的分流规则往往在每次订阅更新后被全量覆盖冲掉。
zzzgydi 决意把配置的主动权彻底交还给使用者。2022 年 5 月 16 日,他为 Verge 设计并实装了 Script 脚本模式;随后在 9 月 21 日,引入了优雅简洁的 YAML Merge 扩展机制。他在使用指南中深入剖析了脚本沙盒的安全与边界:“实现原理是利用 Webview2 里的 JS 引擎执行用户脚本,所以不能执行任何系统 api 的操作……仅采用 new Function 和严格模式执行用户脚本。脚本安全性的考虑:应该不存在脚本突破沙盒产生威胁……总而言之,不要随便运行别人的脚本。”
随着客户端规模扩大,纯前端 Webview 执行的短板逐渐显露:当窗口关闭且后台需要定时更新订阅时,Webview 上下文销毁会导致增强逻辑失效。2022 年 8 月 9 日,zzzgydi 在 Issue #151 中清醒地提出了重构蓝图:“现在是利用 Webview 的 js 引擎实现功能,当完全关闭 webview 时且存在定时更新配置文件的情况,就会导致 Enhanced 的逻辑完全失效。ToDo:merge profile 在 rust 侧实现;script profile 通过引入 quickjs 实现。”
将配置处理流水线下沉至 Rust 原生层与嵌入式 QuickJS 引擎,构成了 Verge 坚不可摧的护城河:用户既可以编写一段轻量优雅的 JavaScript 脚本在内存中劫持修饰配置树,也可以编写声明式的 YAML Merge 规则片段动态覆写节点、策略组与 DNS 策略。原始订阅保持只读纯净,个性化分流毫秒级注入生效,这套设计直接定义了后世桌面代理扩展的最高标准。[10][13][4][12]
第五幕 · 原版退场与社区接续
2023 年 10 月 31 日凌晨,zzzgydi 推送了标签为 v1.3.8 的稳定版本,完成了其作为项目第一阶段缔造者的历史答卷。而在 11 月 3 日上午 10:23,他还在 Issue #893 里耐心地指导用户排查配置语法:“注意一下,merge 不是什么字段都支持的,并不完全支持 cfw 的 commands,详细的看 wiki。”
然而,外部环境的风暴来得猝不及防。11 月 3 日下午,原版 Clash 核心遭遇突发删库风暴,整个中文代理生态陷入剧烈震荡。15:11:23,zzzgydi 在仓库推送了一次清空提交,提交说明只有简短克制的两个单词:“chore: rm”。198 个源代码文件与 25,610 行代码在顷刻间被清理,README 仅留孤零零的一个词:“Removed”,原项目正式宣告归档谢幕。
提交清空代码仅仅两分钟后的 15:13:06,一位用户在 Issue #905 焦急地发问:“clash core 404了会对这个有影响吗”。面对风暴席卷而来的时代拐点,zzzgydi 在该议题里留下回复,那是一个力透纸背、极度平静却又沉重无比的单字:
“有”。
随后,他关闭了该 Issue。在当日傍晚有关退出进程残留的提问中(Issue #906),他最后留下一句“尝试过,没关掉”。这些回复仅记录原项目当时的讨论,不代表他此后停止所有开源活动。
原版留下的代码随后由社区接续。当前 clash-verge-rev 仓库创建于 2023 年 11 月 21 日(UTC),README 明确将项目称为 Clash Verge 的延续;这是仓库记录的时间,不代表组织成立时间。
代码得以延续,维护身份却需要分别确认。2024 年 3 月 23 日 11:29:32(UTC+8),一位贡献者在 Clash Verge Rev 的 PR #724 中请他查看改动,他回复:
“当前项目不是我在维护哈,可以等维护者回复哈”
这条原话划清了作品传承与实际维护的边界:zzzgydi 是原版 Clash Verge 的创始开发者,Rev 的后续开发由社区维护者承担。Rev 的作品社群也不能归作他的个人或作品社群。[15][17][19][18][20][1]