Electron中dialog弹窗为啥在打包后不显示?
我在开发时用 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;
});
渲染进程调用也没问题,开发环境一切正常,就打包后失效了……是不是权限问题还是路径问题?
electron-builder 打包后,electron 核心模块的路径会变,你直接在主进程用
require('electron')在开发环境没问题,但打包后可能找不到。试试在主进程开头加上这段:
其实更根本的解决办法是检查你的 electron-builder 配置。确认一下打包配置里有没有处理好 electron 依赖:
还有一个可能的坑:如果你的项目用了 asar 打包,electron 的某些原生模块可能会出问题。可以先试试把 asar 关掉调试一下:
关掉 asar 后如果能正常弹出了,那就是 asar 打包 electron 原生模块的兼容性问题。
你先试试在主进程里加个 console.log 看看 dialog 是不是 undefined,确认下到底是模块没加载到还是弹窗本身的问题。
dialog.showOpenDialog 在开发环境正常,打包后失效,基本就是 asar 打包的锅。electron 把整个 app 打成压缩包后,某些 native 模块会抽风。
解决办法很简单,在你的 electron-builder 配置文件(package.json 或者 electron-builder.yml)里加上 asarUnpack:
如果还不行,可能是 preload 脚本那边的问题。检查一下打包后 preload 路径对不对,很多人是这里翻车的:
还有个容易忽略的点:确认打包后你的 preload.js 确实在 dist 目录里,有时候没配置好会漏掉。
你先试试加 asarUnpack,十有八九能解决。