开发者问题收集

Electron v14 TypeScript 类型定义中缺少 enableRemoteModule

2021-09-04
13017

我已升级到 Electron 14,重构了我的项目以适应 “已移除:远程模块” 重大变更,但由于以下 TypeScript 错误,我无法编译它:

Type '{ plugins: true; nodeIntegration: true; contextIsolation: false; enableRemoteModule: true; backgroundThrottling: false; webSecurity: false; }' is not assignable to type 'WebPreferences'.

Object literal may only specify known properties, and 'enableRemoteModule' does not exist in type 'WebPreferences'.ts(2322)

electron.d.ts(12612, 5): The expected type comes from property 'webPreferences' which is declared here on type 'BrowserWindowConstructorOptions'

受影响的代码:

const window = new electron.BrowserWindow({
    // ...
    webPreferences: { 
      plugins: true, 
      nodeIntegration: true, 
      contextIsolation: false,
      enableRemoteModule: true, 
      backgroundThrottling: false,
      webSecurity: false 
    }, 
    // ...
  });

这是 Electron v14 中的错误还是故意更改?有什么解决方法?

1个回答

现在 Electron 14.0.1 已经发布,下面是我为主进程和渲染进程启用 remote 模块的方法(您的 webPreferences 设置可能会有所不同)。

首先,安装 @electron/remote 包(重要:没有 --save-dev ,因为它需要捆绑):

npm install "@electron/remote"@latest

然后,对于主进程:

  // from Main process
  import * as electron from 'electron';
  import * as remoteMain from '@electron/remote/main';
  remoteMain.initialize();
  // ...

  const window = new electron.BrowserWindow({
    webPreferences: { 
      plugins: true, 
      nodeIntegration: true, 
      contextIsolation: false,
      backgroundThrottling: false,
      nativeWindowOpen: false,
      webSecurity: false 
    } 
    // ...
  });

  remoteMain.enable(window.webContents);

对于渲染进程:

  // from Renderer process
  import * as remote from '@electron/remote';

  const window = new remote.BrowserWindow({
    webPreferences: { 
      plugins: true, 
      nodeIntegration: true, 
      contextIsolation: false,
      backgroundThrottling: false,
      nativeWindowOpen: false,
      webSecurity: false 
    } 
    // ...
  });

  // ...
  // note we call `require` on `remote` here
  const remoteMain = remote.require("@electron/remote/main");
  remoteMain.enable(window.webContents);

或者,一行代码:

require("@electron/remote").require("@electron/remote/main").enable(window.webContents);

需要注意的是,如果从这样的渲染进程创建, BrowserWindow 是一个 远程对象 ,即在主进程内创建的 BrowserWindow 对象的 Renderer 代理。

noseratio
2021-09-23