我以前做过这个,但除了你已经拥有的之外,我还在使用electron-webpack:
electron ^11.2.0
electron-builder ^22.9.1
electron-webpack ^2.8.2
webpack ^4
这个想法是通过webpack.DefinePlugin 公开一个变量,您可以为您的主进程和渲染器进程执行此操作。
使用electron-webpack,您可以为两个进程提供webpack 配置:
// webpack.main.config.js
const webpack = require('webpack');
module.exports = {
plugins: [ new webpack.DefinePlugin({__BURRITO__: true}) ]
};
// webpack.renderer.config.js
const webpack = require('webpack');
module.exports = {
plugins: [ new webpack.DefinePlugin({__TACO__: true}) ]
};
这两个文件通过package.json 中的一些配置暴露给electron-webpack:
{
…
"electronWebpack": {
"main": {
"webpackConfig": "webpack.main.config.js"
},
"renderer": {
"webpackConfig": "webpack.renderer.config.js"
}
}
}
然后在你的主进程中:
// src/main/index.js
const {app, BrowserWindow} = require('electron')
app.whenReady().then(() => {
const mainWindow = new BrowserWindow({webPreferences: {nodeIntegration: true}});
console.log(__BURRITO__ ? "?" : "?");
mainWindow.loadURL(`http://localhost:${process.env.ELECTRON_WEBPACK_WDS_PORT}`);
});
两件事:
-
.loadURL 位看起来很有趣,但这只是因为我在渲染器中使用了electron-webpack 默认 html 模板。在开发期间,它通过这个本地服务器提供服务。
-
您不需要启用nodeIntegration 标志。那只是因为electron-webpack 默认渲染器模板在这里和那里使用了一些require 语句。
如果您的渲染器进程包含一些脚本,它们也可以访问您的 at-compile-time 变量。这里我再次使用electron-webpack 默认模板,它自动需要src/renderer/index.js:
// src/renderer/index.js
if (__TACO__) {
document.body.innerHTML = "?"
}
当您通过electron-webpack dev 运行此程序时,您可以看到两件事:
- 在主进程的输出中看到一个卷饼
- 在渲染器进程的 html 中看到一个 taco
这说明electron-webpack在编译时成功注入了两个变量。