即使使用推荐的设置,也无法从渲染器/预加载脚本中访问电子函数

Posted

技术标签:

【中文标题】即使使用推荐的设置,也无法从渲染器/预加载脚本中访问电子函数【英文标题】:Electron functions are inaccessible from within renderer/preload scripts even with recommended settings 【发布时间】:2022-01-19 17:22:35 【问题描述】:

我花了几天时间阅读票证和文档,试图找到解决此问题的方法,但没有任何建议奏效。这似乎是一个重大疏忽,或者我完全是个傻瓜。

简单地说,我想做的是从应用程序中访问电子 API,例如,我想要一个按钮,可以通过渲染/预加载脚本中的 BrowserWindow 对象单击以关闭、调整窗口大小等.

我通过 electron forge w/ webpack 从由 electron forge 提供的示例 repo 编译它(而不是单独的 webpack),我有 nodeIntegration: truecontextIsolation: falseenableRemoteModule: truepackage.json 也有这些选项设置。

这是我使用的起始项目: https://www.electronforge.io/config/plugins/webpack

通过阅读其他票证,通常推荐的方法是通过各种方法要求 remote 模块,获取窗口对象并关闭/执行您的操作。这个问题在使用时总是返回null

const remote = require('@electron/remote') const remote = require('electron').remote const remote = require('electron')

我尝试了各种来源,但例如这张票没有任何效果: Atom Electron - Close the window with javascript

我还阅读了这篇文章,似乎说remote 模块已被弃用并且不再使用,但是其中的代码也不起作用:https://www.npmjs.com/package/@electron/remote

我创建了一个 git 存储库,其中包含我尝试使用的代码: https://github.com/MajorFailz/electron-problem-example

请帮忙!如果我无法从应用程序中控制应用程序,我就无法使用电子继续开发我的项目。如果我以某种方式变得愚蠢并且错过了一些重要或基本的事情,我非常乐意接受,但正如我所说,感觉这些是任何电子新手需要知道的第一件事,但我迷路了=/

如果你能提供一个可证明的例子,我可以看看。

提前致谢!

编辑:包中的版本

    "@electron-forge/cli": "^6.0.0-beta.61",
    "@electron-forge/maker-deb": "^6.0.0-beta.61",
    "@electron-forge/maker-rpm": "^6.0.0-beta.61",
    "@electron-forge/maker-squirrel": "^6.0.0-beta.61",
    "@electron-forge/maker-zip": "^6.0.0-beta.61",
    "@electron-forge/plugin-webpack": "^6.0.0-beta.61",
    "@vercel/webpack-asset-relocator-loader": "^1.7.0",
    "css-loader": "^6.5.1",
    "electron": "16.0.4",
    "node-loader": "^2.0.0",
    "style-loader": "^3.3.1"
  ,
  "dependencies": 
    "electron-squirrel-startup": "^1.0.0"
  ```

【问题讨论】:

你用的是什么版本的电子? "electron": "16.0.4",已更新票证 你在主进程中初始化@electron/remote/main了吗? npmjs.com/package/@electron/remote#migrating-from-remote 我认为是来自here 啊,我知道了,你必须通过窗口,所以 require("@electron/remote/main").enable(mainWindow.webContents) 在主进程中。啊,终于成功了!谢谢@evolutionxbox,你绝对是明星。 【参考方案1】:

感谢@evolutionxbox 的 cmets,我设法用以下方法解决了这个问题。

npm run install --save @electron/remote

然后在 main.js 中添加以下行: require('@electron/remote/main').initialize()

最后,当您在主进程中创建窗口时,添加以下内容: require("@electron/remote/main").enable(mainWindow.webContents)

现在,当我请求它时,我得到了 BrowserWindow 对象!哇!

【讨论】:

以上是关于即使使用推荐的设置,也无法从渲染器/预加载脚本中访问电子函数的主要内容,如果未能解决你的问题,请参考以下文章

支持事件的图像预加载器 javascript

纯色背景上的透明透明预加载器图像

网络关闭的预加载功能

即使将其加载到内存中,也无法从 kernel.s 打印

乘客:启动预加载器时出错

Electron:无法加载预加载脚本:Resources/app.asar/src/preload.js