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

问题描述 投票:0回答:1

我正在开发一个用 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'

这样做正确吗?安全吗? 欢迎任何建议/建议/示例。谢谢!

variables process electron environment-variables global
1个回答
0
投票

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

可以使用

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
的每个元素前加上
--
以便正确传递值,并且 不包括 任何
\
,当您不遵循这些时不起作用规则.

© www.soinside.com 2019 - 2024. All rights reserved.