使用process.env从主进程传递变量到Electron中的预加载脚本-好的选择?

jm81lzqq  于 2023-05-04  发布在  Electron
关注(0)|答案(1)|浏览(351)

我正在开发一个用Electron Package 的web应用程序,我试图找到一种简单的方法将var从main process传递到preload.js,这样我以后就可以从我的BrowserWindow中获取它。
我知道我们可以使用IPC从主进程向渲染器视图发送/接收数据,但我发现这种方式有时太复杂,无法获取简单的数据。
此外,我不想将BrowserWindow webPreferences.nodeIntegration设置为true,因为这可能是XSS攻击的裂缝,如这里解释的。
我找到了一种方法(如下)将var从主进程传递到preload.js中的contextBridge,这样我以后就可以从我的BrowserWindow的JS代码中获取这些var。

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'

这是一种正确的做法吗?安全吗?任何建议/意见/例子都是受欢迎的。谢谢!

1qczuiv0

1qczuiv01#

我是那个发布你提到的评论的人。
你可以使用process.env,但我推荐使用process.argv,因为它更符合属性的预期用途(env用于特定于环境的设置,argv用于特定于应用程序的设置),否则,它们的功能非常相似。
您可以通过BrowserWindow上的additionalArguments属性设置argv值。作为参考的一个例子,我在我的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的每个元素前面加上--,以便正确传递值,并且 * 不包括 * 任何\,它是does not work when you do not follow these rules

相关问题