Visitar URL original
fix(desktop): 修复 dev:desktop 启动失败 — Node 24 electron 安装死锁 + #183 dev 窗口隐藏回归 by xianxh · Pull Request #200 · zhuzhaoyun/Molio · GitHub
Skip to content

fix(desktop): 修复 dev:desktop 启动失败 — Node 24 electron 安装死锁 + #183 dev 窗口隐藏回归 - #200

Merged
zhuzhaoyun merged 4 commits into
mainfrom
fix/electron-install-node24
Aug 6, 2026
Merged

zhuzhaoyun merged 4 commits into
mainfrom
fix/electron-install-node24

Conversation

@xianxh

@xianxh xianxh commented Aug 5, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

  • 问题:pnpm dev:desktop 报 ERR_PNPM_RECURSIVE_RUN_FIRST_FAIL / "Electron failed to install correctly",electron.exe 缺失。与日志监控降噪 PR (fix(daemon): 消除云监控 stderr 误报 — 诊断日志走 stdout + 限频告警 #183) 时间上巧合,但实际根因是本机 Node 升级到了 v24.16.0。
  • 根因:Node.js 24.16.0~24.17.x 的 streams 回归(nodejs/node#63487)使 electron postinstall 的解压链 extract-zip@2 → yauzl@2 → fd-slicer@1 在大 zip 条目上背压死锁、静默退出 0,留下残缺 dist;pnpm 构建缓存还会把残缺产物回放给后续每次安装,导致所有新 worktree 复现。
  • 修复:pnpm-workspace.yaml 覆盖 yauzl: ^3.3.1(解析为 3.4.0,重写了流处理、彻底移除 fd-slicer 依赖,workaround 来自 electron/forge#4277)。已在仍为 Node 24.16.0 的本机验证:完整解压出 electron.exe,pnpm dev:desktop 三进程全部正常(daemon :3100 / web :5173 / electron 窗口)。
  • 测试:按错误驱动测试规则新增 apps/desktop/test/electron-binary.test.js 守卫测试(校验 yauzl override 存在 + electron 二进制完整,缺失时报出修复指引);desktop 全量 205 用例通过(198 pass / 0 fail)。

Node 上游修复已随 24.18.0 发布(revert nodejs/node#63834)。建议本机 Node 升级到 >=24.18.0;有本 override 后 Molio 在受影响 Node 版本上也不再受影响。

附注:lockfile 含一处无关漂移(@types/react-dom 19.2.3→19.2.4,types-only patch,系强制重解析带入),与磁盘安装状态一致。

Test plan

  • node --test apps/desktop/test/electron-binary.test.js 通过
  • pnpm --filter @molio/desktop test 全量通过
  • Node 24.16.0 下全新安装完整解出 electron.exe(214MB)
  • pnpm dev:desktop 启动验证:daemon/web 均 200,electron 进程存活、renderer ready

追加修复(0265808,maintainer 补充)

安装死锁修好后,pnpm dev:desktop 仍看不到窗口——这是 #183 (33e400f) 引入的另一个独立回归,与本 PR 的 Node 版本问题无关:

  • 根因:fix(daemon): 消除云监控 stderr 误报 — 诊断日志走 stdout + 限频告警 #183 为修 ARMS Browser SDK splash→app 双重注入,移除了 createWindow() 的共享 ready-to-show handler;生产模式改由 loadApp() 在应用加载完成后显示窗口,但 dev 模式没有 loadApp() 路径,窗口以 show: false 创建后永远不显示。三进程全部正常(daemon/vite/renderer ready)、DevTools 停靠在隐藏窗口里,表现为"进程活着但看不到窗口"。
  • 修复:dev 模式完全跳过 ARMS 初始化(无注入顾虑),在 createWindow() dev 分支恢复 ready-to-show → show();生产显示路径不动。
  • 测试:新增 apps/desktop/test/dev-window-show.test.js(对修复前源码失败 ✖ / 修复后通过 ✔);desktop 全套 208/208 绿。

Node.js 24.16.0~24.17.x 存在 streams 回归(nodejs/node#63487),
electron postinstall 的解压链 extract-zip@2 → yauzl@2 → fd-slicer@1
在大文件条目上背压死锁、静默退出 0,electron.exe 装不出来,
pnpm dev:desktop 报 ERR_PNPM_RECURSIVE_RUN_FIRST_FAIL /
"Electron failed to install correctly";pnpm 构建缓存还会把残缺产物
反复回放给后续安装,导致每个新 worktree 都复现。

修复:pnpm-workspace.yaml 覆盖 yauzl 到 ^3.3.1(解析为 3.4.0,
重写了流处理、不再依赖 fd-slicer),并按错误驱动测试规则新增守卫测试
apps/desktop/test/electron-binary.test.js(校验 override 存在 +
electron 二进制完整,缺失时给出修复指引)。

参考:electron/forge#4277;Node 上游修复在 24.18.0(nodejs/node#63834),
建议本机 Node 升级到 >=24.18.0(有 override 后 Molio 已不受影响)。

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔍 OpenCodeReview found 1 issue(s) in this PR.

  • ✅ 1 posted as inline comment(s)
  • 📝 0 posted as summary

Comment thread pnpm-lock.yaml
Comment on lines +7 to +8
overrides:
yauzl: ^3.3.1

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This global override bumps yauzl from 2.x to 3.x for every consumer in the workspace, not just the electron→extract-zip chain. Note that extract-zip@2.0.1 declares yauzl@^2.10.0 in its own package metadata, so this makes extract-zip run against a major-version-incompatible dependency it was never built/tested against. Currently extract-zip is the only yauzl consumer, but any current or future package depending on yauzl 2.x APIs would silently get 3.x too. Consider scoping the override to the affected consumer (extract-zip@2.0.1: { yauzl: ^3.3.1 }) to limit blast radius, and confirm the yauzl APIs extract-zip uses (open, readEntry, openReadStream, close, etc.) are still compatible with 3.4.0 at runtime.

yauzl override 重新生成 lockfile 时 importer/packages 段把
@types/react-dom 升到 19.2.4,但 snapshots 段遗留旧的 19.2.3 条目,
导致 CI pnpm install --frozen-lockfile 报
ERR_PNPM_LOCKFILE_MISSING_DEPENDENCY,win/mac build-and-test 均失败。
本地 frozen-lockfile 重装 + build + typecheck 验证通过。
@github-actions

github-actions Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

✅ OpenCodeReview: Review complete: 0 finding(s) across 2 selected item(s).

macOS 上 path.txt 指向的 Contents/MacOS/Electron 是 ~30KB 启动器 stub,
真正的引擎在 Electron Framework.framework 里,原 >1MB 断言在 macOS CI
误报 truncated extraction。改为 darwin 下检查 framework 主二进制。
@github-actions

github-actions Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

✅ OpenCodeReview: Review complete: 0 finding(s) across 2 selected item(s).

@xianxh
xianxh requested a review from zhuzhaoyun August 5, 2026 07:11
@xianxh xianxh self-assigned this Aug 5, 2026
#183 (33e400f) 为修 ARMS SDK splash→app 双重注入移除了 createWindow()
的共享 ready-to-show handler,生产模式改由 loadApp() 显示窗口,但 dev
模式因此失去了唯一的 show() 调用路径:窗口以 show:false 创建后永远不
显示。pnpm dev:desktop 表现为所有进程正常(daemon/vite/renderer 全部
就绪)却看不到窗口——DevTools 也停靠在隐藏窗口里。

dev 模式完全跳过 ARMS 初始化,无注入顾虑,在 dev 分支恢复
ready-to-show → show();生产 loadApp()/错误页显示路径不动。

新增 dev-window-show.test.js 回归测试(对修复前源码失败、修复后通过;
desktop 全套 208/208 绿)。

Co-Authored-By: Claude <noreply@anthropic.com>
@github-actions

github-actions Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

Affected Areas & Test Selection

Matched areas:

  • desktop

Changed files: 5

  • apps/desktop/src/main.js
  • apps/desktop/test/dev-window-show.test.js
  • apps/desktop/test/electron-binary.test.js
  • pnpm-lock.yaml
  • pnpm-workspace.yaml

Top changed symbols (by caller count):

Symbol Kind Callers
body function 51
existsSync method 24
createWindow function 2
loadApp function 1
showDaemonErrorPage function 1
createWindowSource function 0
devBranchSource function 0

E2E specs that will run on this PR:

  • (P0 baseline only — see apps/web/e2e/area-map.json)

Generated by Impact Analysis workflow. This is informational, not a gate.

@zhuzhaoyun zhuzhaoyun changed the title fix(desktop): 修复 Node 24.16~24.17 下 electron 安装死锁导致 dev:desktop 失败 fix(desktop): 修复 dev:desktop 启动失败 — Node 24 electron 安装死锁 + #183 dev 窗口隐藏回归 Aug 6, 2026
@github-actions

github-actions Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

✅ OpenCodeReview: Review complete: 0 finding(s) across 3 selected item(s).

@zhuzhaoyun
zhuzhaoyun merged commit f960f48 into main Aug 6, 2026
5 checks passed
@zhuzhaoyun
zhuzhaoyun deleted the fix/electron-install-node24 branch August 6, 2026 09:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants