Electron中dialog弹窗为啥在打包后不显示?

爱学习的树森 阅读 2

我在开发时用 dialog.showOpenDialog 能正常弹出文件选择框,但用 electron-builder 打包成 exe 后点击没反应,控制台也没报错,这是啥情况?

主进程里是这么写的:

const { dialog } = require('electron');

ipcMain.handle('open-file-dialog', async () => {
  const result = await dialog.showOpenDialog({
    properties: ['openFile']
  });
  return result.filePaths;
});

渲染进程调用也没问题,开发环境一切正常,就打包后失效了……是不是权限问题还是路径问题?

我来解答 赞 0 收藏
二维码
手机扫码查看
1 条解答
秀兰🍀
这问题太经典了,妥妥的 asar 打包坑。

dialog.showOpenDialog 在开发环境正常,打包后失效,基本就是 asar 打包的锅。electron 把整个 app 打成压缩包后,某些 native 模块会抽风。

解决办法很简单,在你的 electron-builder 配置文件(package.json 或者 electron-builder.yml)里加上 asarUnpack:

"build": {
"asar": true,
"asarUnpack": [
"**/node_modules/electron/**"
]
}
如果还不行,可能是 preload 脚本那边的问题。检查一下打包后 preload 路径对不对,很多人是这里翻车的:

// 主进程里别用 __dirname,直接用 process.resourcesPath
const preloadPath = path.join(__dirname, 'preload.js')
// 改成
const preloadPath = path.join(process.resourcesPath, 'app', 'preload.js')
// 或者用这个更靠谱的方式
const preloadPath = path.join(app.getAppPath(), 'preload.js')


还有个容易忽略的点:确认打包后你的 preload.js 确实在 dist 目录里,有时候没配置好会漏掉。

你先试试加 asarUnpack,十有八九能解决。
点赞
2026-03-12 22:02