如何动态更改预加载脚本中公开的内容?

How to dynamically change what's exposed in a preload script?

我有一个带有预加载脚本的 BrowserWindow

我想根据加载的页面在预加载脚本中显示不同的内容。

在我的应用程序中,要么加载页面 A 并导航到页面 B,要么从头加载页面 B。

我正在考虑通过以下方式向我的预加载传递额外的参数:

{
    preload: "path_to_preload.js",
    additionalArguments: ["onPageB"]
}

然后我的preload可以做:

const onPageB = process.argv.find(arg => arg === "onPageB");

然后我根据页面 B 的需要设置我的预加载脚本。

但是,我的预加载脚本最初可以加载页面 A,所以 onPageB 将是 false,然后即使我导航到页面 B,它也停留在 false。

我真正需要的是动态响应导航。 (理想情况下,我将能够动态切换预加载脚本,但我认为这不受支持,或者从架构的角度来看是不可能的)。

为了检测导航,通常我会这样做:

getMyWebContents().on("did-navigate", (e, url) => ...);

但是我无法从渲染器进程中使用 WebContents

我显然可以通过 ipcRenderer.invoke 查询我所在的页面,但我不能只在加载时这样做。当页面导航时我也需要这样做,这似乎表明我必须从主进程中检测到它,然后让我的预加载脚本知道这一点。

但是我该怎么做。 executeJavaScript 是我在预加载中调用一个函数来触发更改的解决方案吗?不确定这是否会正常工作,或者甚至是一个好的解决方案。

Electron 开发人员提到每次导航都会重新执行预加载脚本(回想起来很明显)。

因此,我们可以在预加载中访问 location.href 并找出我们所在的页面。