我有一个在开发中构建和运行的电子应用程序,但是当用电子生成器打包应用程序时,预加载脚本没有打包在正确的位置。
这是一个有很好记录的问题,例如这里和这里有非常相似的问题,但在我的案例中,没有一个回答或解决方案有效。
从我的electron.js文件:
function createWindow() {
const mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
preload: path.join(app.getAppPath(), 'src/preload.js'),
contextIsolation: true,
},
});
// In production, set the initial browser path to the local bundle generated
// by the Create React App build process.
// In development, set it to localhost to allow live/hot-reloading.
const appURL = app.isPackaged
? url.format({
pathname: path.join(__dirname, 'index.html'),
protocol: 'file:',
slashes: true,
})
: 'http://localhost:3000';
mainWindow.loadURL(appURL);
mainWindow.webContents.openDevTools();
}
我的预加载脚本:
const { contextBridge, shell } = require('electron')
contextBridge.exposeInMainWorld(
'electron',
{
openBrowserWindow: (url) => shell.openExternal(url)
}
)
我的电子应用程序package.json:
"build": {
"extends": null,
"appId": "com.app",
"productName": "App",
"directories": {
"output": "dist"
},
"mac": {
"target": {
"target": "pkg",
"arch": [
"universal"
]
},
"darkModeSupport": "true",
"extendInfo": "app"
},
"pkg": {
"installLocation": "/Applications",
"overwriteAction": "upgrade"
},
"files": [
"**",
"../app/src/*",
"src/preload.js"
],
"extraResources": [
"../app/src/*",
"src/preload.js"
],
"extraFiles": [
"../app/src/*",
"src/preload.js"
]
}
上面,我试图确保以不同的方式复制"src/preload.js“文件,但是我仍然得到了错误:
无法加载预加载脚本:...app/Contents/Resources/app.asar/src/preload.js 错误:找不到模块'...app/Contents/Resources/app.asar/src/preload.js‘
预加载脚本实际上是复制的,但它不是app.asar文件的一部分。它被复制到参考资料文件夹外的src文件夹中,该文件夹包含app.asar文件:
如何正确配置电子构建器,使该文件位于正确的位置,并可在包运行时访问?
发布于 2021-12-08 04:57:45
如果你这样做了:
const mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
preload: path.resolve(app.getAppPath(), 'preload.js'),
contextIsolation: true,
},
});
有用吗?(曾为我工作过电子webpack和电子建设者)
发布于 2021-12-13 08:40:49
preload: path.join(app.getAppPath(), 'src/preload.js'),
由于您没有将preload.js
打包到应用程序包文件(asar默认)中,这不会像这样工作。app.getAppPath()
将指示应用程序包文件(或目录,以防您将asar
设置为false)。
您的代码指示/xxx.app/Contents/Resources/app.asar/src/preload.js
或/xxx.app/Contents/Resources/app/src/preload.js
,您的预加载脚本文件不在那里,而是在第二个父目录中。
在你的情况下,这是正确的道路,
path.join(app.getAppPath(), '..', '..', 'src', 'preload.js');
发布于 2022-10-06 07:20:05
首先,添加控制台日志进行测试。
console.log({dirname: __dirname})
console.log({getAppPath: app.getAppPath()})
console.log({resourcesPath: process.resourcesPath})
const mainWindow = new BrowserWindow({ ... })
其次,您必须添加contextIsolation: true
。
如果您使用的是electron-builder
,并且由于某些原因不能添加contextIsolation: true
,则可以使用以下解决方法:
package.json
"build": {
...
"extraResources": [
...
"app/preload.js" // <---- add your path
],
}
electron.js
const preloadPath =
process.env.NODE_ENV === 'development'
? path.join(__dirname, '../preload.js') // <---- add your path
: path.join(process.resourcesPath, '/app/preload.js'); // <---- add your path
const mainWindow = new BrowserWindow({
...
webPreferences: {
contextIsolation: false,
preload: preloadPath,
...
}
})
path.join(process.resourcesPath, '/app/preload.js')
是什么?
在构建应用程序之后,您可以在这里找到您的额外资源。
C:\Users\<user>\AppData\Local\Programs\<app>\resources
-代表Windows
。
对于MacOS
,您可以在应用程序上使用right click
,然后单击Show Package Contents
> Resources
https://stackoverflow.com/questions/70175316
复制相似问题