您如何 'require' 使用新的、安全的默认设置在 Electron 中使用外部模块?

How do you 'require' external modules in Electron with the new, secure, default settings?

我有一个几年前的 Electron 应用程序,我正在尝试更新它以使用最新版本的 Node、Electron 和我使用过的所有外部模块。这是一次非常令人沮丧的经历,因为所有范例都发生了变化,尤其是在安全方面,但我希望尽可能让我的应用程序使用安全设置。

据我了解,Electron(我使用的是16.0.5版本)的相关默认设置是

nodeIntegration: false
contextIsolation: true
sandbox: true

这是我的 createWindow 块中的内容:

const createWindow = () => {
  // Create the browser window.
  const win = new BrowserWindow({
      width: 1280,
      height: 720,
      webPreferences: {
        preload: path.join(__dirname, 'preload.js'),
      }
  });

  // and load the index.html of the app.
  win.loadFile('index.html');

  // Open the DevTools.
  win.webContents.openDevTools();
}

如您所见,我根本没有更改默认值。这是需要的,遵循 Electron 网站的 security instructions

但是,由于这个原因,我完全无法恢复我的应用程序以前的功能。我遇到的最大问题是我根本无法找到 require 任何外部依赖项的方法。据我了解,预加载文件只能需要特定的 Electron 模块,而普通渲染器 JavaScript 文件根本不需要任何东西(你会得到一个 require() is not defined 错误)。据我从文档中了解到,main.js 文件具有正常的 require 访问权限,您打算使用 ipcmain.jspreload.js 之间进行通信,以便只有您的主进程可以完全访问远程模块。

这很好,很漂亮,除了我什至 require main.js 中的任何东西都让我非常困惑:

// in main.js
const google = require('googleapis');
App threw an error during load
Error: Cannot find module 'googleapis'

我确定我已经 yarn install 正确编辑,尝试使用不同的模块,更改顺序等。我也无法找到 单个示例 在线有人使用新的默认安全设置但对外部模块使用 require。它们中的每一个都使用 require 作为内置的东西和 preload.js 文件示例,来自 Google 或官方文档,只是展示如何公开基本的内置东西,比如 windowdocument 使用 preload.js 调用,这真的没什么用。

所以这是不可能的吗?我想知道 Node/Electron 应用程序不能使用任何 public 节点模块到底有什么意义,所以如果默认安全设置阻止您拥有提供任何类型的应用程序有用的功能,我不知道为什么它们是默认值。我错过了什么?我怎样才能在不禁用这些看似关键的安全功能的情况下恢复使用外部模块,如 googleapisffmpeg

事实证明,我出现 'Cannot find module' 错误的原因是因为我在 pnp 中使用 Yarn。 Electron 不支持不在 node_modules 文件夹中的包,请参阅 discussion on Yarn GitHub and semi-confirmation of issue on Electron GitHub

切换到 nodelinker: node-modulesnodelinker: pnpm.yarnrc.yml 代替 nodelinker: pnp 解决了它。

这仍然只是部分帮助我,因为我必须弄清楚如何允许沙盒渲染器和预加载访问外部模块方法,但它是一个起点,解决了我最初的挫败感“等等——你不能要求任何东西 外部?