vscode调试electron主进程断点不生效,主因是launch.json缺失runtimeexecutable和args配置、node.js版本不在v18.15.0–v20.14.0区间;渲染进程调试需单独配置pwa-chrome attach模式并启用autoattachchildprocesses;contextisolation启用后preload.js必须用contextbridge暴露api;打包黑屏多因未适配上下文隔离。

VSCode里按F5直接调试主进程,但断点不生效?
大概率是 launch.json 配置漏了关键项,或者 Node.js 版本不匹配。Electron 调试对运行时环境极其敏感,不是“装了就能用”。
-
runtimeExecutable必须指向项目本地的 Electron 二进制:Linux/macOS 是"${workspaceFolder}/node_modules/.bin/electron",Windows 得用"${workspaceFolder}/node_modules/.bin/electron.cmd" -
args必须显式传["."],否则 Electron 启动时不加载当前目录的main.js - Node.js 版本必须严格落在
v18.15.0–v20.14.0区间——v22+ 会报ERR_MODULE_NOT_FOUND,v16 则触发DEP0148并让 IPC 失效 - 确认
npm install electron --save-dev已执行,全局安装(npm install -g electron)会导致require('electron')找不到模块
渲染进程断点全灰,DevTools打不开或白屏?
这不是 VSCode 设置问题,而是主进程没正确启动 DevTools 服务,且 VSCode 没配 attach 模式。
- 主进程代码中,
win.webContents.openDevTools({ mode: 'detach' })必须放在'ready-to-show'事件之后,不能写在new BrowserWindow()后立刻调用 -
.vscode/launch.json必须新增第二个配置,"type": "pwa-chrome","request": "attach",端口固定为9222 - 两个调试配置不能合并——VSCode 不支持单条配置同时 attach 主进程 + 渲染进程;必须先启动主进程配置(F5),等窗口出现后再手动触发渲染进程配置(Ctrl+Shift+D → 选中对应配置 → F5)
- 漏掉
"autoAttachChildProcesses": true,新建的子窗口、二级BrowserWindow就无法被断点捕获
打包后应用启动黑屏或报错 require is not defined?
这是 preload.js 或 renderer 环境误用了 Node.js 全局变量,和打包无关,本质是上下文隔离(contextIsolation)没适配好。
- 若启用了
contextIsolation: true(强烈推荐),渲染进程默认拿不到require、process,所有 IPC 桥接必须通过contextBridge显式暴露 - preload.js 开头必须加判断:
if (contextIsolation) { contextBridge.exposeInMainWorld(...) },否则生产环境直接报错 - ESLint 必须区分环境:主进程文件(
main.js、preload.js)设env: { node: true },渲染进程文件(renderer.js、Vue/React 组件)设env: { browser: true },并加globals: { ipcRenderer: 'readonly' }避免误报 - 打包命令本身不解决逻辑错误——
electron-builder或electron-forge只是把代码打包,运行时行为完全取决于你写的 JS 是否兼容隔离模式
想用快捷键一键打包 Windows/macOS/Linux?
VSCode 本身不提供跨平台打包快捷键,但可以靠 task + keybinding 组合实现接近“一键”的效果。
- 在
.vscode/tasks.json里定义三个 task,分别调用electron-builder --win、--mac、--linux,注意每个 task 的group设为build - 然后在
keybindings.json里绑定:Ctrl+Alt+W→workbench.action.terminal.runActiveFile(触发 build win task),同理配 Mac/Linux - 真正省时间的是预设 target:比如 Windows 直接指定
nsis,macOS 用default(即 dmg),避免每次交互选格式 - 别依赖
npm run dist这类通用脚本——不同打包工具(builder/forge/vite-plugin-electron)命令参数差异大,快捷键必须和实际使用的工具强绑定
process.platform 判定逻辑写死、路径拼接没用 path.join()、或者 preload.js 里忘了包裹 contextBridge 分支。这些细节不会在开发服务器下报错,但一打包就集体爆发。











