Electron.remote未定义。

73

我在使用Electron时遇到了麻烦。正如您所见的标题,当我加载远程模块时,它显示未定义。这是入口js的代码:

const electron = require('electron');
const { app, BrowserWindow, Tray, remote, ipcMain } = electron;

function initApp() { ... }

app.on('ready', () => {
    initApp();

    console.log(electron);         // object, but no remote inside
    console.log(electron.remote);  // undefined
    console.log(remote);           // undefined
});

我尝试遵循官方文档:http://electron.atom.io/docs/api/remote/

使用:

const { remote } = electron;
const { BrowserWindow } = remote;

let win = new BrowserWindow({width: 800, height: 600});  // error! BrowserWindow is not a constructor blabla

...
remote.getCurrentWindow().focus();

我不知道我错过了什么。任何建议都将非常感激。


1
你是在渲染进程中运行这段代码吗? - Max
不,这是主进程。 - modernator
1
那么你的问题就在这里了。remote只需要用于从渲染进程内部要求其他模块。在主进程中,直接从require('electron')获取您的模块即可。看起来你已经这样做了,你只需要删除remote... - Max
@Teak,你应该把你的评论转换成答案。 - Vadim Macagon
谢谢,我认为我误解了Electron远程模块,现在我解决了我的问题。谢谢你的回答Teak。正如Vadim所说,写下你的评论作为回答会更好。 - modernator
对于 Electron 14 及更高版本:https://dev59.com/vFEG5IYBdhLWcg3wRYlA#69297584 - noseratio - open to work
5个回答

163

更新2020,由于这个回答仍然出现在顶部。对于当前版本的Electron,要使原始答案正常工作,您需要在主进程中创建窗口时设置enableRemoteModule

const myWindow = new BrowserWindow({
    webPreferences: {
        enableRemoteModule: true
    }
}); 

原始回答:

remote 只需要在渲染进程内从其他模块中引用时才需要。在主进程中,您可以直接通过 require('electron') 获取您的模块。看起来示例中只是不必要地添加了 remote

渲染进程:

const { remote } = require('electron');
const { BrowserWindow } = remote;

主要流程:

const { BrowserWindow } = require('electron');

4
在 TypeScript 和渲染进程中,import { remote } from 'electron'; 在 Windows 上会抛出错误,但在 Mac OS 上运行良好。 - Alexey Sh.
7
我收到了"Uncaught TypeError: Cannot destructure property 'BrowserWindow' of 'remote' as it is undefined."的错误消息,意思是无法解构'remote'对象中的'BrowserWindow'属性,因为它未定义。 - Barkermn01
7
非常感谢你在2020年更新答案时思考周到!我不明白为什么我的“遥控器”未定义。 - Jason Fetterly
14
我已将 enableRemoteModule 设置为 true,但仍然遇到相同的错误。 - David Essien
6
使用 Electron 的 v17 版本时,electron import 中的 remote 属性不可用。 - Robert Cabri
显示剩余3条评论

65

谢谢!真的错过了那个 enableRemoteModule - Parampreet Rai
4
求你了,我找了两天才找到。 - Enrico Borba
1
您应该知道remote已经被弃用,并将从新版本中删除,很可能在2021年底之前即可实现。 - Slbox
在 Electron 版本 27 中,当使用远程模型时,我的脚本文件 render.js 无法加载。无法加载预加载脚本:/home/dev105/eclipse-workspace/TG/src/render.js (匿名) @ node:electron/js2c/renderer_init:2 - undefined

26

远程模块在 Electron 12 中已被弃用,并将在 Electron 14 中删除。它被 @electron/remote 模块所替代。

// Deprecated in Electron 12:
const { BrowserWindow } = require('electron').remote
// Replace with:
const { BrowserWindow } = require('@electron/remote')

// In the main process:
require('@electron/remote/main').initialize()

6
在 electron 中,有时候会出现 remote 变量未定义的情况。你需要在 main.js 文件中创建窗口时设置 webPreference 对象,并像下面这样设置 enableRemoteModule 属性为 true,这样就可以解决问题了。
```javascript webPreferences: { enableRemoteModule: true } ```
 win = new BrowserWindow({
    width: 700,
    height: 600,
    hasShadow: true,
    webPreferences: {
      nodeIntegration: true,
      enableRemoteModule: true,
     },
  });

3
我启用了远程模块,仍然出现此问题。
index.html:43 Uncaught TypeError: Cannot read properties of undefined (reading 'getCurrentWindow')

for

const remote = require('electron').remote;

(或者)

const { remote } = require('electron');

在使用时

remote.getCurrentWindow().close();

我已经添加了

webPreferences: {
            nodeIntegration: true,
            contextIsolation: false,
            enableRemoteModule: true,
    }

这不是对问题的回答。当您拥有足够的声望时,您将能够评论任何帖子; 相反,提供不需要询问者澄清的答案 - Tyler2P
您可以从 @Ha0ran 处检查答案,自 v14 以上的版本开始,electon 的远程已从包中删除。 - GoldenArcher

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接