使用 process.env 将 vars 从主进程传递到 Electron 中的预加载脚本 - 不错的选择?

Using process.env to pass vars from main process to preload script in Electron - Good option?

提问人:Faks 提问时间:4/19/2023 更新时间:5/3/2023 访问量:305

问:

我正在开发一个用 Electron 包装的 Web 应用程序,我试图找到一种简单的方法将 vars 从主进程传递到预加载.js,以便我以后可以从我的 .BrowserWindow

我知道我们可以使用 IPC 将数据从主进程发送/接收到渲染器视图,但我发现这种方式有时太复杂了,无法仅获取简单的数据。

另外,我不想将 BrowserWindow 设置为 true,因为这可能是 XSS 攻击的破解,如此处所述webPreferences.nodeIntegration

我找到了一种方法(如下)将变量从主进程传递到 preload.js 中的 a,以便我以后可以从我的 JS 代码中获取这些变量。contextBridgeBrowserWindow


index.js(主进程)

process.env.MY_SUPER_VAR = 'Hello'

预加载.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 Electron 环境变量 全局

评论


答:

1赞 reZach 5/3/2023 #1

我是发布你提到的评论的人。

您可以使用 ,但我建议这样做,因为它更符合属性的预期用途 - (用于特定于环境的设置,用于特定于应用程序的设置),否则,它们的功能足够相似。process.envprocess.argvenvargv

可以通过 BrowserWindow 上的属性设置值。作为一个例子,我在我的secure-electron-template存储库中这样做。argvadditionalArguments

  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);

需要注意的是,我建议在with的每个元素前面加上前缀,以便正确传递值,并且不包含任何,当您不遵循这些规则时,它将不起作用。additionalArguments--\