我正在开发一个用 Electron 包裹的网络应用程序,我试图找到一种简单的方法将 vars 从 main process 传递到 preload.js 这样我以后可以从我的
BrowserWindow
.
我知道我们可以使用 IPC 将数据从主进程发送/接收到渲染器视图,但我发现这种方式有时对于获取简单数据来说太复杂了。
此外,我不想将 BrowserWindow
webPreferences.nodeIntegration
设置为 true 因为这可能是 XSS 攻击的破解方法,例如 explained here.
我找到了一种方法(如下)将变量从主进程传递到 preload.js 中的
contextBridge
,这样我以后就可以从我的 BrowserWindow
. 的 JS 代码中获取这些变量
index.js(主进程)
process.env.MY_SUPER_VAR = 'Hello'
preload.js
const { contextBridge } = require("electron");
contextBridge.exposeInMainWorld(
"electron", {
mySuperVar : process.env.MY_SUPER_VAR
});
script.js(稍后从page.html加载)
console.log(window.electron.mySuperVar);// 'Hello'
这样做正确吗?安全吗? 欢迎任何建议/建议/示例。谢谢!
我是发表你提到的评论的人。
你可以使用
process.env
,但我推荐process.argv
只是因为它更符合属性的预期用途-(env
是针对特定环境的设置,argv
用于特定于应用程序的设置),否则,它们的功能非常相似。
您可以通过
argv
属性在additionalArguments
上设置
BrowserWindow
值。作为参考的示例,我在我的secure-electron-template
存储库中执行此操作。
例子
win = new BrowserWindow({
width: 800,
height: 600,
title: "Application is currently initializing...",
webPreferences: {
additionalArguments: [`--customValue=${value}`],
preload: path.join(__dirname, "preload.js")
}
});
在您的preload.js文件中,您可以提取值并根据需要使用它。
const arg = process.argv.filter(p => p.indexOf("--customValue=") >= 0)[0];
const argValue = arg.substr(arg.indexOf("=") + 1);
提醒一句,我建议在
additionalArguments
的每个元素前加上 --
以便正确传递值,并且 不包括 任何 \
,当您不遵循这些时不起作用规则.