在Electron中,如何在React代码中启用NodeJS?
我需要采取哪些步骤?我正在尝试访问通常在节点中使用以下命令访问的文件系统组件:
const fs = require('fs');
在我的React代码中,这没有编译,所以我尝试将其更改为导入,但也不起作用。
import fs from 'fs';
// Gives error
Module not found: Error: Can't resolve 'fs' ...
在寻找解决方案时,我发现了一些问题,但(目前)还没有答案:
我看到一个与此匹配的SO问题/答案,但现在找不到!
我已经启用NodeJS在我的电子主应用程序使用:
mainWindow = new BrowserWindow({
width: winState.width,
height: winState.height,
x: winState.x,
y: winState.y,
webPreferences: {
// --- !! ANT !! ---
// Disable 'contextIsolation' to allow 'nodeIntegration'
// 'contextIsolation' defaults to "true" as from Electron v12
contextIsolation: false,
nodeIntegration: true, /* Allow NodeJS code to be called in Web Pages */
enableRemoteModule: true
}
})
2条答案
按热度按时间q8l4jmvw1#
要访问带有React的电子应用程序内的文件系统,您需要代码库的三个不同部分:
fs
和Node拥有的其他所有东西。这可能最终调用new BrowserWindow
,它打开一个窗口和runs the preload script。fs
操作,然后使用结果回复消息。上面的electronAPI
示例可以从React withwindow.electronAPI.sendMessageToMainProcess(channel, payload)
调用。主进程可以侦听消息(通过预加载脚本附加)并使用以下命令回复消息,例如通过从处理函数返回Promise,Promise解析的值将被发送回调用方。
上面的设置非常简单,不需要unsafe
contextIsolation: false
或nodeintegration: true
:自Electron 12以来,上下文隔离已默认启用,并且它是所有应用程序的推荐安全设置。
如果页面脚本中的 any 代码不是您个人的(例如,如果您使用外部库或很少的库-如React),那么您不应该允许页面脚本直接访问Node或您的文件系统。
thigvfpy2#
在电子应用程序中,使用NodeJS require函数的方法是使用
window.require
,如下所示:只有在创建BrowserWindow时首先启用
nodeIntegration: true
,此选项才有效。正如@CertainPerformance所说,这真的是一个黑客。我在第一次开始使用它,因为它比学习如何通过 * 电子IPC* 机制(
ipcRenderer.invoke
)完成等效功能更容易。