从最早那个 Go 版桌面端用到现在:Reasonix 这次 Electron 迁移,是一次漂亮的负优化 #10269
xiaokay2099
started this conversation in
General
Replies: 5 comments 3 replies
1 reply
|
说的有道理,但是能不能不要一件事反复说。什么4段启动,Electron,升级之类的,反复出现。 太影响阅读了。 |
1 reply
|
尽量规避这开发习惯团队所开发的产品,太闹心了;尽早摆脱才是最好的 |
0 replies
|
从1.20多左右就开始屎了,一个对话框上下乱跳问题修了n个版本修不好,修得差不多了又重构了(不排除一直无法彻底修好干脆放弃重构的可能性),又整出一大堆新问题 |
1 reply
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment

Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
我尊重技术决策,但我不认可把架构升级的成本,转嫁给用户的做法
我不是来唱衰这个项目的。
我是从 Go 版桌面端的第一个版本开始用的。那时候它还不完美,但方向很清楚:一个本地引擎,一个静态二进制,终端、桌面、编辑器都能接进来。启动快,占用低,行为可预期。我把它装在工作机上,一路用到现在。
所以接下来的这些话,不是陌生人的挑刺,而是一个长期用户看着它从好走向别扭之后的失望。
9 月 9 日,项目合并了一个 46 个提交的 PR(#9988):桌面壳从 Wails 迁移到 Electron。我在升级之后,第一件事是发现启动时多了一个黑窗口一闪而过;第二件事,是发现我最常待的那个地方——对话层——变得不太可靠了。最后的结局是:我卸载了新版,回退到了 1.38.3——迁移之前的最后一个稳定版本。
一个已经发展到近 7000 次提交、有稳定用户群的项目,在这个阶段做框架级的大换血,然后让用户来承担震荡。这就是我想说的"负优化"。
先说清楚我怀念的是什么,免得被理解成"老东西就是好"。
Wails 版本的桌面端有什么好?
这是我说的"非常好的时候"。它不是怀旧滤镜,是几个可测量的工程指标:启动段数、常驻内存、升级成功率。
现在这几个指标,全都不如以前。
我把能查到的事实列出来,避免空谈。以下每一条都有公开出处:
这份清单里,最说明问题的不是问题数量,而是第三条和第四条。
第三条意味着:一个老用户升级失败之后,得到的不是"正在修复",而是一条冷冰冰的 unsupported install_layout "electron-v1",然后官方告诉你——请你手动去下载一次完整安装包。这是把迁移的账单,直接寄给了用户。
第四条更值得玩味:这个 bug 之所以存在,恰恰是因为这次迁移。Wails 时代桌面进程本身就是 GUI 子系统,压根不需要隐藏什么窗口;换成 Electron 之后,启动链被拆成了多段,新链路的第一环就漏了一个参数。更别提项目里早就有专门做这件事的工具函数,Electron 拉起后台服务时用得好好的——偏偏引导环节没用。
一个团队刚刚完成一次 46 提交的架构迁移,却在新链路的第一环上漏掉了自己库里现成的防护。这不是技术难题,这是执行质量的问题。
把上面的变化翻译成用户能感知的东西:
以上四条,我全部都亲身撞上了。而我的处理方式很简单:回退到 1.38.3——也就是迁移之前的最后一个稳定版本,Wails 壳的最后一版。
一个用户为了能继续正常干活,被迫退回旧版本,这本身就是对这次迁移最直接的评分。我不是在"体验新版",我是在逃离新版。
四条里,第 1 条和第 4 条是不可接受的。第 2、3 条是可以讨论的。
我希望这篇批评是有技术含量的,所以必须说清楚:Electron 本身不坏,坏的是"这个项目选它"这一步。
先看被拿来当正面案例的 OpenCode。同样是 Tauri → Electron,为什么它做成了,还被夸?
因为 OpenCode 的架构前提完全不同:它整个内核是 TypeScript。它的 server(agent 循环、LLM 调用、SQLite)本来就跑在 Node/Bun 里。迁到 Electron 之后,server 直接跑进 Electron 内置的 Node 进程,原来那个需要额外拉起的 CLI 子进程整个消失了。启动链更短,架构更简单,调试更省事。
换句话说:Electron 对 OpenCode 是做减法。它把 Tauri 时代"先起 server 再让 UI 连上去"的麻烦抹掉了。
再看 Reasonix。它的内核是 Go。Electron 的 Node 运行时吸收不了 Go。所以迁移之后:
Electron 对 Reasonix 是做加法。 它没有像对 OpenCode 那样替项目消灭复杂度,反而新增了一层需要协同、需要打包适配、需要跨平台验证的结构。这就是我作为一个用户的直观感受从何而来——不是错觉,是启动链真的变长了。
那它换来了什么?主要是统一 WebView,摆脱 WebView2 / WebKitGTK 的碎片化。这个收益是真实的,我不否认。但把它和上面那份代价清单放在天平两端:用安装布局断层 + 启动链变长 + 一轮对话层重做,去换渲染一致性,这笔账,我认为算不过来。
顺便说一句,官方自己的 PR 描述里也承认了:这次迁移"不是所有发布验收都已通过的声明",四平台原生安装/卸载/升级回滚/签名公证"仍需相应环境"。也就是说,用户在用开发分支的迁移结果,替代原本稳定的产品。
如果非要说这次迁移"愚蠢",那愚蠢不在于选型,而在于时机与方式:
对比之下,OpenCode 的做法值得抄作业:保留两个版本并存,Electron 先进 beta 渠道,成为直下载默认,最后才过渡到正式发布。用户有退路,风险有缓冲,舆论有交代。
悲哀的不是"用了 Electron"。
悲哀的是:一个已经知道怎么做对的项目,在最有能力做稳的时候,选择了最激进的方式。
它明明有更好的选项——保留 Wails 线继续维护、Electron 独立走 beta、先在预览渠道把启动链和打包链路打磨干净再切换默认。它明明有足够成熟的工具(隐蔽子进程的函数就在自己仓库里)。它明明知道自己在做一件会打断用户升级路径的事。
结果这些"明明",一个都没落在用户身上。
我用了它最好的那几版,所以我现在的不适感是具体的:我知道它曾经不闪黑窗,我知道它曾经能平稳升级,我知道它曾经不需要用户在"新功能"和"能用"之间做选择。
这就是我为什么说"悲哀"——不是愤怒,是看着一件做对了的事情,被一次不必要的激进选择抵消掉。
至于现在——我已经回退到了 1.38.3,迁移之前的最后一个稳定版本。工作机上的 Reasonix,就停在那里。
本文基于公开信息撰写:迁移 PR #9988、更新边界追踪 #10222、启动黑窗 #10106、对话层重构 #10209 / #10223、社区反馈 #10171,以及相关 issue 中的 PE 子系统与启动链实测记录。文中架构对比部分基于各方公开的技术说明与我个人的分析判断,属于观点,非官方结论。
All reactions