一、问题背景
quasar:2.6.0
electron:^22.0.0
运行 quasar 项目时,控制台出现 “Unable to load preload script” 的错误提示,但是程序运行没有丝毫问题,具体如下图所示:
找到 src-electron/electron-main.js 有这么一段代码:
mainWindow = new BrowserWindow({
...,
webPreferences: {
// 在页面运行其他脚本之前预先加载指定的脚本
preload: path.resolve(__dirname, process.env.QUASAR_ELECTRON_PRELOAD),
},
});
该代码的作用是使得process.env.QUASAR_ELECTRON_PRELOAD
目录下文件被预加载,再使得这个文件指向的脚本 src-electron/electron-preload.js 被加载,所以推测在预加载的某个过程出现问题
二、尝试解决的方法(若看解决方案可跳过)
- 查看
process.env.QUASAR_ELECTRON_PRELOAD
对应的地址,是否为报错信息的地址 - .quasar/electron/electron-preload.js 文件中加载的文件是否指向 src-electron/electron-preload.js
- electron-preload.js 文件是否会被预加载(确认webPreferences中preload会被执行)
- 搜索 quasar 的 GitHub 仓库,查看到 electron 版本号的 sandbox 会导致报错
三、解决方法
通过设置sandbox: false
去开启 preload
mainWindow = new BrowserWindow({
...,
webPreferences: {
sandbox: flase, // 开启沙盒则preload脚本被禁用,所以得设为false
// 在页面运行其他脚本之前预先加载指定的脚本
preload: path.resolve(__dirname, process.env.QUASAR_ELECTRON_PRELOAD),
},
});
解释:
因为在 Electron 22.0.0 版本当中,sandbox 成为了默认选项,在开启了沙盒环境的情况下,preload 脚本默认被禁用(但实际体验还是能用?),因此会出现 “Unable to load preload script” 的报错,得通过设置 sandbox: false
将其禁用
拓展:
在23+版本中,preload 已经成为沙盒 WebContents 默认开启的,所以开启了 sandbox 也无妨