contextBridge

    进程: Renderer

    如下,是一个从隔离的预加载脚本将 API 暴露给渲染器的示例:

    1. window.electron.doThing()

    “Main World”是主渲染器代码运行的 JavaScript 上下文。 默认情况下,你在渲染器中加载的页面在此环境中执行代码。

    Isolated World

    contextBridge模块有以下方法:

    • apiKey string - 将 API 注入到 窗口 的键。 API 将可通过 window[apiKey] 访问。
    • api any - 你的 API可以是什么样的以及它是如何工作的相关信息如下。

    contextBridge.exposeInIsolatedWorld(worldId, apiKey, api)

    • worldId Integer - 要注入 API 的 world 的 ID。 0 是默认 world,999 的 world 被 Electron 的 contextIsolation 使用。 使用 999 would 为 preload 上下文暴露对象。 我们建议使用 1000+ 来创建隔离的 world。
    • apiKey string - 将 API 注入到 window 的键。 API 将可通过 window[apiKey] 访问。
    • api any - 你的 API可以是什么样的以及它是如何工作的相关信息如下。

    提供给 的 必须是一个 FunctionstringnumberArrayboolean;或一个键为字符串,值为一个 FunctionstringnumberArrayboolean的对象;或其他符合相同条件的嵌套对象。

    Function 类型的值被代理到其他上下文中,所有其他类型的值都会被 复制冻结。 在 API 中发送的任何数据 /原始数据将不可改变,在桥接器其中一侧的更新不会导致另一侧的更新。

    一个 exposeInIsolatedWorld 的例子,如下:

    1. const { contextBridge, ipcRenderer } = require('electron')
    2. contextBridge.exposeInIsolatedWorld(
    3. 1004,
    4. {
    5. doThing: () => ipcRenderer.send('do-a-thing')
    6. }
    7. )

    API Functions

    你通过 contextBridge 绑定的 值会被 Electron 代理,以确保保持上下文隔离。 这导致了我们在下面概述的一些键的限制。

    参数 / 错误 / 返回类型支持

    因为当参数、错误和返回值在桥接器上发送时会被 复制 ,所以只有某些类型可以使用。 从上层来看,如果你想要使用的类型可以序列化并反序列化为同一个对象,这个类型可以使用。 为确保完整性,下面列出了一份类型支持表:

    contextBridge 可以被预加载脚本用来让您的渲染器访问Node API。 上面所述的支持类型表也适用于您通过 contextBridge暴露的Node API。 请注意许多Node的API授权访问本地系统资源。 请非常谨慎地暴露全局变量和api给不受信任的远程内容。

    1. const { contextBridge } = require('electron')
    2. const crypto = require('crypto')
    3. contextBridge.exposeInMainWorld('nodeCrypto', {
    4. sha256sum (data) {
    5. const hash = crypto.createHash('sha256')
    6. hash.update(data)
    7. return hash.digest('hex')