electron TypeError:window.required不是函数

ct2axkht  于 2022-12-08  发布在  Electron
关注(0)|答案(7)|浏览(242)

我试图建立一个电子应用程序,并希望使用window.require。不幸的是,编译器显示“TypeError:window.require不是一个函数”。具有讽刺意味的是,require只**在main.js中工作。
下面是我试图运行的代码:

const electron = window.require('electron')
const low =  window.require('lowdb')
const FileSync = window.require('lowdb/adapters/FileSync')

我在另一篇文章中读到有人遇到了同样的问题,通过在.html文件中添加以下代码来修复:

<script type="text/javascript" src="../../../Gehaltseinstellungen_Hinzufügen.js">
        window.nodeRequire = require;
        delete window.require;
        delete window.exports;
        delete window.module;
    </script>

另外,作者说使用“nodeRequire”代替require可以解决问题,但它没有...
我读到的另一个选项是,在渲染过程被激活时,NodeIntegration被设置为false,但我不知道如何在渲染时激活Node。

mum43rcc

mum43rcc1#

您可以将webPreferences.contextIsolation设置为false,如下所示

webPreferences: {
        nodeIntegration: true,
        contextIsolation: false
    }

它也许有用

2j4z5cfb

2j4z5cfb2#

不清楚您使用的Electron版本。您使用的语法不标准。
首先,如果您使用的是Electron 5.0,nodeIntegration在BrowserWindows中默认为false,因此您需要在创建窗口时显式指定它:

mainWindow = new BrowserWindow({
  width: 800,
  height: 600,
  webPreferences: {
    nodeIntegration: true
  }
})

鉴于上述情况,下面的语法可以正常工作(即不需要“window”引用):

const { ipcRenderer, remote } = require('electron');
cbeh67ev

cbeh67ev3#

需要所有3个设置这样做,使这一工作:

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

注意:macbook m1,大冲浪11.4,也许它必须做一些关于操作系统,idk。
P.S.正如评论中提到的,在使用nodeIntegration之前,请检查电子文档,以了解何时可能存在安全问题:
隔离不受信任的内容每当您从不受信任的来源接收代码时,就会存在安全问题(例如远程服务器)并在本地执行。例如,假设远程网站显示在默认的BrowserWindow中。如果攻击者设法更改了上述内容,(通过直接攻击源代码,或通过位于您的应用和实际目标之间),他们将能够在用户的计算机上执行本机代码。
在️任何情况下都不应该在启用Node.js集成的情况下加载和执行远程代码。相反,只使用本地文件(与应用程序打包在一起)来执行Node.js代码。要显示远程内容,请使用标记或BrowserView,确保禁用nodeIntegration并启用contextIsolation。
来源:https://www.electronjs.org/docs/latest/tutorial/security#isolation-for-untrusted-content

sq1bmfud

sq1bmfud4#

我在《电子+Angular 》中也遇到过这个问题。

webPreferences: {
    nodeIntegration: true,
    contextIsolation: false
  }

以上配置适合我。

slsn1g29

slsn1g295#

电子+React+ typescript 中也有同样的问题。这为我解决了

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

nfs0ujit6#

我被这个问题困了几天。我一辈子都想不出这个问题。看了很多文档和stackoverflow,最后!!!
我通过以下方法修复了此错误:
创建文件preload.js:

const { remote } = require('electron');
    window.ipcRenderer = require('electron').ipcRenderer;

然后在main.js/electron.js中:

const win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      nodeIntegration: true,
      //this line is crucial
      preload: path.join(app.getAppPath(), '/path-to-file/preload.js'),
      contextIsolation: false
    }
  })

最后是App.js:

const { ipcRenderer } = window

我在windows中从electronic得到了ipcRenderer。我敢肯定你可以得到你想要的任何其他东西。

i34xakig

i34xakig7#

您不需要像建议的那样修改Web首选项,我建议您不要这样做,除非您有更好的理由,因为隐含的安全问题(https://www.electronjs.org/docs/latest/tutorial/security#isolation-for-untrusted-content)。
相反,你可以使用预加载脚本来添加你需要的任何功能到window
preload.js(位于根文件夹中):

contextBridge.exposeInMainWorld('ipcRenderer', {
  invoke: (event) => ipcRenderer.invoke(event),
});

main.js中的Web首选项:

webPreferences: {
  preload: path.join(__dirname, 'preload.js'),
}

现在,您可以在代码中引用它:

const { ipcRenderer } = window as any;
const response = await ipcRenderer.invoke(...);

参考文档:https://www.electronjs.org/docs/latest/tutorial/tutorial-preload#communicating-between-processes

相关问题