一、核心结论

dialog.showErrorBox 写在主进程时,弹出的是操作系统原生对话框,不是 Vue 渲染的。 它看起来"在 Vue 里显示",只是因为浮在 Electron 窗口之上,本质是两个独立 UI 层在屏幕上重叠。

二、三个"画师"要分清

层是什么谁绘制 UI
Node.jsJS 运行时,无 GUI不画 UI
Electron native 模块Node 与 OS 之间的桥(dialog 等)不画,转手给 OS
操作系统Win/macOS/Linux 窗口系统画系统框(真正的画师)
ChromiumElectron 内置浏览器引擎画 Vue 页面(真正的画师)

关键链路对比:

系统框:main.js (Node) → dialog → Electron C++ → OS API → 【操作系统绘制】
Vue 框:.vue → Vue 组件 → Chromium → 【Chromium 绘制】

三、两个维度别混淆

维度含义系统框Vue
渲染归属(谁画)由谁绘制操作系统Chromium
窗口层级(谁在前)z-order默认置顶、模态普通层级

"系统框在最前端"说的是窗口层级,不是渲染归属。

四、为什么看起来"融为一体"

  1. 置顶 + 模态:系统框默认 topmost,挡住父窗口

  2. 绑定父窗口:居中显示、跟随最小化

  3. 同一 app 触发:主进程同时管着窗口和系统框

但它们是独立的两套体系,不共享 DOM、CSS、事件循环。

五、怎么验证

测试系统框Vue 框
F12 能否选中❌✅
CSS 能否改样式❌✅
窗口最小化后通常仍在跟着消失
能否拖到另一个显示器可以属于窗口

六、窗口层级真相

最顶层
  ↑  其他应用置顶窗口
  ↑  系统级弹窗(UAC、权限请求)
  ↑  dialog.showErrorBox   ← 默认在这
  ↑  Electron 窗口(Vue 页面)
  ↑  普通后台窗口
最底层

"最前"是相对的:它是你应用范围内的最前,但别的应用/系统级提示仍能盖住它。Vue 一般盖不住它(普通窗口压不过置顶窗口)。

七、想真正"在 Vue 里显示"怎么办

放弃 dialog.showErrorBox,走 IPC 把消息传给渲染进程,用 Vue 组件渲染:

主进程 → webContents.send → preload → Vue 组件弹窗

这样样式可控、能被 DevTools 检查,才是同一渲染体系里的 UI。

八、一句话总结

主进程是 Node 环境,但 Node 不画 UI。它弹的系统框是 Electron 转交给操作系统画的,默认置顶浮在 Electron 窗口(Vue 页面)之上;Vue 是 Chromium 画的。两者渲染体系独立,只是窗口层级上系统框更高——不是"共生",是"叠加"。

如果对您有一些用,请帮我点个赞!!!

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐