如何从电子中的渲染器进程调用 preload.js 中定义的函数

Posted

技术标签:

【中文标题】如何从电子中的渲染器进程调用 preload.js 中定义的函数【英文标题】:How to call function defined in preload.js from renderer process in electron 【发布时间】:2021-04-26 04:41:56 【问题描述】:

在this 的回答中,建议可以在preload.js 文件中定义一个javascript 函数并将其附加到window,然后从渲染器进程中调用(在包含的renderer.js 中或直接作为脚本在html 文件)使用window.functionName,即在preload.js

window.myFunction = function()
   //do something here that requires
   //ipcRenderer
 

index.html:

<script>
   var myButton = document.getElementById("myButtonId")
   myButton.addEventListener('click', (e) => 
      window.myFunction();
);
</script>

但是,当我这样做并单击按钮时,我会收到错误消息 Uncaught TypeError: window.myFunction is not a function。 有人可以向我解释为什么会抛出这个错误以及如何定义函数吗?

【问题讨论】:

【参考方案1】:

使用Context Isolation 和contextBridge。

Preload.js

 const  contextBridge  = require('electron')
 contextBridge.exposeInMainWorld('YourAPI',
  
    yourFunction: () => 'Your Codes.'
  );

你的HTML.html

<html>
    <head></head>
    <body>
        <script>
            window.YourAPI.yourFunction();
        </script>
    </body>
</html>

【讨论】:

【参考方案2】:

另一种无需使用 Bridge 方法即可解决此问题的方法是禁用 ContextIsolation,但现在不建议这样做以确保更好的安全性。

但是,如果您有旧代码并且不想更改,您可以这样做。

webPreferences: 
  contextIsolation: false,
  preload: path.join(__dirname, './preload.js'),

将 webPreferences 变量显式设置为 false。现在默认情况下,在较新版本的 Electron 中启用了 ContextIsolation

【讨论】:

以上是关于如何从电子中的渲染器进程调用 preload.js 中定义的函数的主要内容,如果未能解决你的问题,请参考以下文章

无法通过电子中的渲染器进程发送消息

Electron - 解决渲染器进程中的电子模块问题

如何在将 React 与电子结合使用时分离渲染器和主进程依赖关系?

在电子中从 ipcMain 广播消息

不断地将事件从主进程传递到渲染器进程

带有 browserWindow 和 preload.js 的电子生成器。无法加载预加载脚本