来自 FluxDown 作者 ZerxLab
- 个进程,各司其职
- 3
- 个独立界面模块
- 11
- 行 Rust 界面代码
- ~6.8 万
- 行重写的 Web 控制台
- ~3 万
§ 01
为什么要推倒重来
先说实话:Flutter 版的 FluxDown 能用,也陪很多人下完了数不清的文件。但每次打开它,我都知道,它离我心里那个下载器还差一口气。
它的界面和下载引擎挤在同一个进程里,中间靠一层 FFI 信号桥来回传话。界面一旦出问题,正在跑的下载也跟着遭殃。
多窗口是另一道坎。Flutter 桌面端没有真正的多窗口:设置、队列管理、任务详情,都只能塞进主窗口里当对话框。光是一个快速下载小窗,我就得在三个平台各写一套原生宿主——Windows 用 C++、macOS 用 Swift、Linux 用 C——再往里塞进第二个完整的 Flutter 引擎,靠消息通道和主窗口来回同步。
内存,则是最让我过意不去的地方。那个小窗的引擎一旦创建就不敢销毁——反复创建销毁会崩溃——只能一直占着内存直到程序退出;而为了让下载在后台继续,整个 Flutter 界面也得跟着常驻内存,哪怕你一整天都没打开过它。
还有开发节奏:加一个按钮,要先写 Rust 信号、再生成 Dart 绑定、再写一遍 Dart 模型——同一件事,用两种语言各写一遍。时间都花在了来回搬运上,而不是打磨你每天盯着看的那个窗口。
所以我决定停下来,不再给旧界面打补丁,而是从零开始,用一套纯 Rust 的原生 UI 重写整个桌面客户端。
我想要的下载器,是你几乎感觉不到它的存在:点开就在,关掉也不停,从不拖你后腿。
§ 02
为什么是 GPUI
GPUI 是 Zed 编辑器背后的 Rust UI 框架,界面由 GPU 直接绘制。没有 WebView,没有 Electron,也没有第二种语言——从下载引擎到屏幕上的每一个像素,现在都是同一套 Rust 代码。
这意味着更少的中间层、更短的链路,以及 macOS、Windows、Linux 上各自原生的窗口。它不是把网页塞进一个壳里,而是真正属于桌面的应用。
多窗口在这里是一等公民:设置、队列管理、任务详情、进度窗口都是真正的原生窗口,共享同一个进程和同一份实时状态——想开几个开几个,关掉就真正释放。
§ 03
新的架构:把下载和界面彻底分开
这次重构里最重要的决定,其实你看不见:FluxDown 被拆成了三个各司其职的进程。
- 01
fluxdown-desktop界面只负责把画面画好。按需启动,关掉即退出,不在后台留下任何东西。
- 02
fluxdown-agent网关常驻后台,负责托盘、浏览器接管、剪贴板、云同步与本机 API。
- 03
fluxdownd下载核心独占下载引擎与数据库,掌管任务、队列、定时、RSS、插件与 Webhook。
带来的变化很直接:关掉窗口,下载照旧;再次打开,界面立刻接上实时状态。关掉最后一个窗口,界面进程随之完全退出,占用的内存如数还给系统——后台常驻的只剩不含任何界面运行时的 agent 与下载核心。界面进程无论出什么状况,都碰不到正在下载的文件。而且下载核心与界面之间只说一种协议,NAS 上的 Web 控制台终于和桌面客户端共用同一套能力。
§ 04
新的界面:每一处都重新想过
架构之外,界面本身我也一个像素一个像素地重做了。挑几个我自己最喜欢的变化:
- 命令面板
- ⌘K / Ctrl+K 一键唤出,所有操作与设置一搜即达;支持拼音、首字母与混拼,越常用的越靠前。
- 真正的多窗口
- 设置、队列管理、任务详情、单任务进度窗口各自独立,位置和尺寸都会被记住。
- 看得见的文件
- 任务列表直接显示系统文件图标;双击打开,拖出窗口就是文件(macOS / Linux Wayland),文件被移走或删除会立刻标出来。
- 看得懂的速度
- 任务详情新增「来源构成」与「速度」页,CDN、代理、每张网卡各贡献了多少,一目了然。
- 不乱跳的列表
- 进度刷新时行序保持稳定;任务再多,页面依旧顺滑。
- 重做的主题
- 声明式 token 格式,对比度自动保证可读;还能在官网的主题编辑器里调出属于你的配色。
§ 05
不只是桌面
既然底座换了,我顺手把整个家族都拉到了同一条起跑线上。
- 全新 Web 控制台
- NAS / 服务器端的 Web 控制台从头重写,布局与操作和桌面客户端一一对齐。
- 多设备协同
- 把任务下发到云设备或局域网内已配对的设备;局域网直连配对用一串安全码确认。
- 多网卡聚合
- 多张网卡合力下载同一个文件;自动代理改为多路径并行调度。
- 告别老问题
- 一长串修复:HTTP 续传校验、HLS / DASH 无声、ED2K 超过 4 GB、BT 暂停竞态、队列定时……
- 更安静,更快
- 空闲时不再唤醒 NAS 休眠的硬盘;冷启动更快,等窗口的时间更短。
§ 06
升级前你需要知道
你的任务、历史和设置沿用同一个本地数据库,升级后原样都在。Windows 安装包会直接覆盖升级旧的 Flutter 版,文件关联和 magnet / ed2k 链接也会自动改指向新客户端。
有几件事值得留意:
- 局域网配对协议升级到 v2,两台设备需要一起升级。
- 已保存的站点凭据需要重新输入一次。
- 浏览器扩展请与桌面端一起更新,否则可能显示「未连接」。
- Windows 安装包暂未签名,首次运行时系统可能会提示风险。
- Android 版仍基于 Flutter,继续随下载引擎一起更新。
§ 07
最后,谢谢你
重写一个已经能用的软件,是一件很冒险、也很孤独的事。支撑我走完这段路的,是每一条 issue、每一次投票、每一句「好用」。
FluxDown 依然免费、开源、没有广告。如果新界面让你眼前一亮,告诉我;如果哪里不顺手,更要告诉我——下一个版本往哪走,由你来决定。
—— FluxDown 作者