Web 前端打包 ~100 KB gzip · 待机 CPU 趋近 0% · 编译期类型强契约 · 0 警告 0 类型错误
FlexClash 是一款面向 Windows 10/11 与 Linux 桌面端的高性能、现代化 Mihomo (Clash Meta) 图形代理客户端。
不同于传统 Electron 客户端动辄 200 MB+ 的内存占用与后台高频轮询消耗,FlexClash 基于 Tauri 2.0 (Rust + 系统 WebView) 架构,主进程仅 8 MB,安装包仅约 15.8 MB。前端不仅拥有精致的深色 Fluent / Mica 玻璃质感,更实现了 Rust 统一门面(控制面 + 数据面)+ Specta 端到端类型契约 + 后台单向状态快照广播——内核的 REST 请求与 WebSocket 推送流均不出 Rust,使应用在后台驻留时的 CPU 占用与内存开销降至冰点。
| 痛点 | 传统方案 | FlexClash (v0.6.3) |
|---|---|---|
| 资源常驻 | Electron 内存 ≥ 300 MB,后台易 OOM | Tauri 架构,待机内存低,CPU 趋近 0.0% |
| 系统代理 | 单一系统绑定,切换易断网 | WinINET / GNOME gsettings 双平台原子切换 |
| 通信与稳定性 | 前端散落 fetch 轮询,接口变动易白屏 | Rust 门面兜底 + Specta 编译期绝对类型安全 |
| 状态同步 | 前台高频轮询,状态时序错乱横跳 | Rust 后台 1s 下发 AppStateSnapshot,内核推送流节流后类型化事件直达 |
| 流式数据 | 渲染进程自建 WebSocket,重连与积压全靠前端 | Rust 独占 /traffic・/logs,合并/攒批 + 退避重连,前端零 socket |
| TUN 透明代理 | 配置复杂、需手敲路由 | Windows Wintun + UAC / Linux 细粒度 Capabilities,双内核严格串行调度 |
| 视觉体验 | 通用灰底或生硬网页感 | Windows 11 原生 Mica / Linux 深色极简 Fluent 玻璃 |
FlexClash 采用现代深色 Fluent 玻璃设计语言,所有面板共享自研 --glass-* 暗色毛玻璃设计令牌(12–20px 高斯模糊 + 饱和度增强,深色/浅色双套):
| 区域 | 视觉重点 |
|---|---|
| 顶栏 | 品牌渐变图标 · Running 状态脉动点 · 胶囊导航(Dashboard / Proxies / Connections / Profiles / Stats)· 实时计数与模式切换 |
| 仪表盘 | 三状态卡片(内核状态 / 控制端口 / API 连通性)· 三开关卡(系统代理 / 开机自启 / TUN)· 实时流量(上下行速率)· 折叠内核日志 |
| 策略组 | 策略组与底层节点树级展示 · 节点延迟药丸染色 · 切换防抖与乐观状态同步 · 配置保护机制 |
| 连接页 | 虚拟列表 · 60 fps 滚动 · 速率聚合 · 关键字/策略过滤 · 断开连接模态 |
| 统计页 | 原生 Canvas DPR-aware 波形图(1h / 24h / 7d)· 零第三方重型图表库依赖 |
- Windows 11 Mica / Win10 Acrylic 毛玻璃原生背景(
window-vibrancy) - 自研
--glass-*暗色毛玻璃设计令牌:12–20px 高斯模糊 + 饱和度增强,深色/浅色令牌双套;长列表节点行(.glass-row)不叠加独立 blur,兼顾对比度与渲染性能 - 双语界面:简体中文 + English 实时切换,选择持久化
- 单实例唤醒:Single Instance 强制单进程,重复启动自动聚焦既有窗口;桌面项
StartupNotify=false彻底消除窗口二次呼出时的鼠标转圈等待 - 无感自愈:内核异常退出诊断、持久化
runtime.log记录与用户自定义配置防冲刷保护
- Windows 平台:WinINET 32/64 位注册表双写,覆盖 UWP / Win32 / 控制台应用
- Linux 平台:原生对接 GNOME
gsettings代理控制协议,避免侵入性改动 - 生产级 TUN 虚拟网卡接管:
- Linux:基于 Capabilities(
cap_net_admin,cap_net_bind_service=+ep)细粒度赋权,告别整机sudo启动风险;自动处理策略路由(ip rule+auto-route/auto-redirect)与 fake-ip DNS - Windows:原生集成 Wintun 驱动与 UAC 提权,NSIS 安装器预清理僵尸 sidecar
- Linux:基于 Capabilities(
- 双内核生命周期调度:常规 Sidecar 与提权 TUN 内核严格串行——TUN 期间任何
sidecar::start都被统一守卫(owns_ports)在命令层 / supervisor / 进程拉起最深处三重拒绝;进程句柄经Child::wait()回收,杜绝 Linux<defunct>僵尸进程与 9091/7897 端口抢占 - 默认端口独立:采用混合代理端口
7897、REST 控制端口9091,避免与常见客户端默认端口(7890/9090)产生冲突
- Rust 统一门面(控制面 + 数据面):前端零直连——REST 指令与内核
/traffic、/logsWebSocket 推送流全部收口至 Rust 层 - Specta 强类型契约:Rust 结构体与事件自动生成
src/bindings.ts,命令参数与事件载荷双双编译期校验,杜绝运行时未定义与空指针崩溃 - 单向推模式状态流:Rust 每秒广播
AppStateSnapshot(内核健康 / 系统代理 / 出站模式),实时速率则由内核/traffic流合并后推送,前端彻底告别setInterval与自建 WebSocket - 内建流式 QoS:traffic 最新值合并(1s 仅推 1 次)、logs 有界批量打包(500ms / 4096 行上限),订阅永久挂起不丢连接、不涨内存
- 应用内自动更新:集成 tauri-plugin-updater,一键检查版本、显示 Release Notes、静默下载与自动重启安装(启用自签名更新通道)
- TUN 无感静默提权:
ShellExecuteExW(SW_HIDE) + 全子进程CREATE_NO_WINDOW,彻底消除 CMD 黑框闪烁 - 配置防冲刷保护:用户订阅配置永不被冷启动默认值覆盖,节点完整留存
- 崩溃取证落盘:
runtime.log持久化 + sidecar 退出码追踪,长期挂机可诊断
graph TB
subgraph Frontend["Vue 3 Frontend (WebView)"]
UI[Components & Views<br/>Dashboard / Proxies / Connections]
Stores[Pinia Stores<br/>appstate / proxies / kernel / connections]
Bindings[Typed Bindings Client<br/>src/bindings.ts]
UI --> Stores
Stores --> Bindings
end
subgraph Backend["Rust Core — Control & Data Plane (Tauri 2)"]
Commands[Specta Tauri Commands<br/>12+ Facade Handlers]
Watcher[State Watcher Loop<br/>1s AppStateSnapshot Broadcast]
Ingest[Kernel Ingest Supervisor<br/>tokio-tungstenite 节流 & 攒批]
Sidecar[Kernel Supervisor<br/>mihomo 进程守护 & 日志落盘]
Proxy[System Proxy Manager<br/>Windows WinINET / Linux gsettings]
Tun[TUN Manager<br/>Wintun / Linux Capabilities]
end
subgraph Kernel["Mihomo Core (Isolated Process)"]
REST[REST API :9091]
WS[WebSocket /traffic · /logs]
TUN_IF[TUN Interface]
end
Bindings -->|Typed IPC Invoke| Commands
Watcher -.->|app-state-sync| Stores
Ingest -.->|TrafficPayload · LogBatch| Stores
Commands -->|reqwest Client| REST
Commands --> Sidecar
Commands --> Proxy
Commands --> Tun
Ingest -->|WS 订阅| WS
Sidecar -->|Process Supervision| Kernel
注:Rust 独占内核数据面。
/traffic与/logs的 WebSocket 由core::ingest单一监督任务读取,节流(traffic 每 1s 仅保留最新瞬时值,丢弃中间帧)与攒批(logs 每 500ms 打包一次,有界 4096 行)后,经TrafficPayload/LogBatch类型化事件推入前端;内核重启或断连时按 500ms → 10s 指数退避自动重连,内核停止即abort孤儿任务。渲染进程已不再打开任何原生WebSocket。
双内核生命周期:TUN 开启期间(
Enabling | On)所有拉起常规 Sidecar 的企图被统一守卫(owns_ports)拒绝,提权内核句柄经Child::wait()回收,杜绝<defunct>僵尸与 9091/7897 端口抢占。
| 库 | 版本 | 用途 |
|---|---|---|
| Vue | 3.5 | 组合式 API + <script setup> |
| Vite | 5.4 | 极速构建与 HMR |
| TypeScript | 5.6 | 严格模式编译校验 |
| Pinia | 2.3 | 单向状态存储与快照投影 |
| Tailwind CSS | 3.4 | 原子化设计系统 |
| @tanstack/vue-virtual | 3.10 | 活跃连接虚拟列表(60 fps) |
| @tauri-apps/api | 2.x | 原生窗口与 IPC 通信 |
| Crate | 版本 | 用途 |
|---|---|---|
| tauri | 2.x | 主进程框架与跨平台抽象 |
| specta / tauri-specta | 2.0.0-rc | 编译期 TypeScript 类型契约自动生成 |
| reqwest | 0.12 (rustls) | Mihomo 控制面统一请求与超时保护 |
| tokio | 1.x | 异步任务调度、状态广播心跳与数据面节流 tick |
| tokio-tungstenite | 0.26 | 内核 /traffic・/logs WebSocket 数据面接管 |
| rusqlite | 0.31 | 本地流量历史持久化 |
| winreg / windows | 0.52 / 0.58 | Windows 注册表与提权控制 |
| 平台 | 状态 | 系统代理方案 | 备注 |
|---|---|---|---|
| Windows 11 | ✅ 完整支持 | WinINET / 注册表原子操作 | 支持原生 Mica 背景 + Wintun |
| Windows 10 | ✅ 完整支持 | WinINET / 注册表原子操作 | 支持 Acrylic 背景 + Wintun |
| Linux (GNOME / WSL2 / Arch) | ✅ 完整支持 | gsettings 原生控制 | 平台条件编译,0 Error 构建;Arch/EndeavourOS 提供 PKGBUILD 一键安装 |
| macOS | 🚧 架构就绪 | networksetup (Stub) | 核心 Unix 通路已留存,待实机验证 |
- Node.js >= 20(LTS,CI 实测)
- Rust >= 1.78(stable)
- Linux 构建依赖:
libwebkit2gtk-4.1-dev、libappindicator3-dev、librsvg2-dev、patchelf、libssl-dev(Arch 系:webkit2gtk-4.1、libappindicator-gtk3、librsvg、openssl) - Mihomo Core:将对应平台的二进制放置于
src-tauri/binaries/(bundle.externalBin依此命名解析,缺失会导致构建失败):- Windows:
mihomo-x86_64-pc-windows-msvc.exe - Linux:
mihomo-x86_64-unknown-linux-gnu(需chmod +x)
- Windows:
# 1. 安装依赖
npm install
# 2. 启动开发模式(前端 Vite + 后端 Tauri 热重载)
npm run tauri dev# 前端类型检查
npx vue-tsc --noEmit
# 后端编译检查
cd src-tauri && cargo check推送 v* tag 自动触发 .github/workflows/release.yml 矩阵构建,经 tauri-action 自动发布到 Releases:
| 平台 | 产物 |
|---|---|
| Windows | FlexClash_<ver>_x64-setup.exe(NSIS 安装包)、FlexClash_<ver>_x64_en-US.msi |
| Linux | FlexClash_<ver>_amd64.deb、FlexClash_<ver>_amd64.AppImage |
git clone https://github.com/zhuyikai2002/flexclash.git
cd flexclash/packaging/arch
makepkg -sipackaging/arch/PKGBUILD(flexclash-bin)会从 GitHub Release 下载并解包 .deb 载荷(二进制落位于 /usr/bin/flexclash,内核 /usr/bin/mihomo);flexclash.install 的 post_install / post_upgrade 已内置 setcap cap_net_admin,cap_net_bind_service=+ep /usr/bin/mihomo,安装即享免密码启用 TUN。桌面项统一为小写 flexclash.desktop(StartupNotify=false),不会出现重复启动项。
# 全量生产打包(Linux: deb / rpm / AppImage;Windows: NSIS / MSI)
npm run tauri build- Windows NSIS 安装包:
src-tauri/target/release/bundle/nsis/FlexClash_0.6.3_x64-setup.exe - Windows MSI 企业包:
src-tauri/target/release/bundle/msi/FlexClash_0.6.3_x64_en-US.msi - Linux Debian 包:
src-tauri/target/release/bundle/deb/FlexClash_0.6.3_amd64.deb - Linux AppImage:
src-tauri/target/release/bundle/appimage/FlexClash_0.6.3_amd64.AppImage
CI 门禁(
.github/workflows/ci.yml,push/PR):cargo fmt、clippy -D warnings、Rust 单测、bindings 漂移检查、vue-tsc。发布(.github/workflows/release.yml,v*tag):Ubuntu-22.04 / Windows-latest 矩阵 +tauri-action自动打包上传,含更新器latest.json;Mihomo sidecar 由fetch-mihomocomposite action 按平台下载并做 sha256 校验。
本项目基于 MIT License 开源。
- Mihomo (MetaCubeX) — 强大的核心网络代理引擎
- Tauri — 轻量级、高安全性的跨平台应用框架
- Specta — 优雅的 Rust-to-TypeScript 类型桥梁
Made with 🦀 Rust + 💚 Vue 3