![](/img/trans.png)
[英]How can I use multiple preload scripts for different Electron windows when using electron forge with the webpack template?
[英]How do I compile a preload script w/ webpack in Electron?
电子 1.6.5,Webpack 2.4.1
我正在使用带有webview
组件的电子反应样板。 我将一个预加载脚本注入到webview
,它会执行以下操作:
const { ipcRenderer } = require('electron');
const doSomething = require('./utils/do-some-thing.js');
document.addEventListener('DOMContentLoaded', event => {
doSomeThing()
// tell scraper to get started
ipcRenderer.sendToHost('THING IS DONE', [{ url: document.URL }]);
});
webview
需要此脚本作为file://
路径传递,如下所示:
<webview
preload={'./some/folder/preload.js''}
{...props}
/>
问题是我的 webpack 设置不会转译preload.js
因为它没有通过require()
显式调用。 然后,当我构建应用程序时,路径./some/folder/
不存在。
我试过设置 webpack 来创建第二个编译脚本,如下所示:
entry: [
'babel-polyfill',
'./app/index',
'./some/folder/preload.js'
],
output: {
path: path.join(__dirname, 'app/dist'),
publicPath: '../dist/'
},
但这会导致JavaScript heap out of memory
不足错误,这让我相信这是不正确的。
另外:这种方法不会在./dist
文件夹中复制electron
,因为它是由preload.js
和index.js
共同./dist
的require()
吗?
你可以使用 webpack 的电子主和电子预加载配置:
const path = require('path');
module.exports = [
{
entry: './src/index.js',
target: 'electron-main',
output: {
path: path.join(__dirname, 'dist'),
filename: 'index.bundled.js'
},
node: {
__dirname: false,
}
},
{
entry: './src/preload.js',
target: 'electron-preload',
output: {
path: path.join(__dirname, 'dist'),
filename: 'preload.bundled.js'
}
},
]
构建后你会得到两个包,但 Electron 不在其中,所以没有重复。
注意__dirname: false
,这是因为否则的WebPack内容替换需要__dirname
总是被替换/
通过的WebPack,导致意外的行为在几乎所有情况(见这里了解更多信息,应该是默认的假的,但不适合我) .
我们有一个类似的问题,我们有几个预加载脚本而不是一个。 我们的解决方案是使用CopyPlugin 。 所以对我们来说,配置是这样的:
const CopyPlugin = require("copy-webpack-plugin");
plugins.push(new CopyPlugin([{ from: "src/container-with-scripts/", to: "preloadScripts/" }]));
module.exports = {
module: { rules }, // imported from elsewhere
target: "electron-renderer",
node: { global: true },
plugins,
resolve: {
extensions: [".js", ".ts", ".jsx", ".tsx", ".css", ".scss"]
}
};
因此,我们只需将包含所有脚本的文件夹复制到自动生成的 .webpack 文件夹中。
我遇到了同样的问题,这里的解决方案对我有用:
Electron-webpack 文档现在包含如何添加额外条目的示例。
"electronWebpack": {
"main": {
"extraEntries": ["@/preload.js"]
}
}
请注意,您可以使用 @ 别名来引用您的 main.sourceDirectory
在这种情况下,它是主进程脚本的路径,默认情况下将是src/main
这会将来自src/main/preload.js
预加载脚本添加到 webpack 条目中。
然后你需要将预加载脚本添加到窗口中
new BrowserWindow({
webPreferences: {
nodeIntegration: true,
preload: path.resolve(path.join(__dirname, "preload.js")),
}
})
就这样。 __dirname
给了我相对路径,而电子需要预加载脚本的绝对路径,所以它失败了。 path.resolve
将为您提供使其工作所需的绝对路径。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.