如何在Electron React应用程序中使用节点模块



我目前正在制作一个桌面应用程序,它是与Electron捆绑或构建的ReactJS应用程序,我想在我的应用程序中使用电子附带的节点模块,特别是从子进程模块执行或派生。我的目标是按下一个按钮,作为子/侧进程从命令提示符执行一组命令,并返回stdout。

我的应用程序遵循典型的应用程序创建过程,就像在线教程一样,首先制作一个react应用程序,获取一些依赖项和package.json更改,获取electron,制作一个包含所有基本窗口配置的electron.js或main.js类型的文件。

在主入口点文件中,对我来说是electron.js,我有:

webPreferences: {
nodeIntegration: true
},

然而,我不能在我的react代码中使用子进程节点模块,即使我在电子侧的创建窗口函数中允许它。在我的反应组件中,当我进行时

import { exec } from 'child_process';

react似乎能识别它,并在悬停时显示所有exec函数信息(参数、重载、在child_process模块中找到等)。

但是,如果我通过单击按钮运行此示例命令,我会得到错误:"TypeError:对象(…)不是函数;。这里的错误指的是exec。

import { exec } from 'child_process';
...
const run = () => {
exec('ls -lh', (error, stdout, stderr) => {
if (error) {
console.log(`error123: ${error.message}`);
return;
}

if (stderr) {
console.log(`stderr123: ${stderr}`);
return;
}

console.log(`stdout:n${stdout}`);
})
};
....
return (
<div>
<button onClick={run}>Run Command!</button>
</div>
)
export ....

有人知道如何让反应侧访问目录中的节点模块,或者如何正确导入/访问它们吗?直接从反应侧导入或从电子传递到反应?或者我只是运行不正确?我是javascript之类的东西的新手,所以理解这个问题和调试对我来说真的很难

感谢Badal为我指明了正确的方向。

我找到的答案包括将contextolation设置为false,nodeIntegration设置为true,并使用ipcMain处理程序(电子主进程)和ipcRenderer处理程序(呈现,在本例中为react,进程)。下面的第一个链接显示了如何使用处理程序(查看线程中较新的答案),第二个链接是关于内部工作的更详细的文档。请注意,如果你在网上搜索这个"react electronic应用程序中的节点模块",很多人都在使用remote等,但electron.remote是v12或13及以后最不推荐使用的模块,使用它和其他不推荐的模块不会告诉你它不推荐使用。相反,它会给出fs.filereadsync或wtvr错误(我忘了),因为它在构建过程中无法理解它。ipcMain和ipcRenderer的处理程序现在处理所有应用程序内部通信和进程,正如ipc的名称所暗示的那样。

如何在react中导入ipcRenderer?

https://www.electronjs.org/docs/api/ipc-main

(电子的新变化)https://www.electronjs.org/docs/breaking-changes

有了这个,您可以有一个运行按钮来执行某个命令,并使用ipcrender将其发送到事物的电子端。在电子端(默认发送到主进程文件,所以是electron或main.js),您可以导入您想要的任何节点模块并使用它们。对我来说,我制作了一个新文件,做了const{exec}=require("child process"),然后有了一个执行某些命令行操作的函数。对exec的函数调用被放置在ipcMain处理程序中。

这是不安全的。出于我的目的,安全性不是一个问题,但对其他人来说可能是一个问题。确保执行输入清理和其他预防措施,防止人们滥用应用程序,以及在没有适当手柄的情况下拨打可能渗透到系统的电话。如果您正在使用子进程、操作系统子系统模块等,这一点尤为重要。只要前端能够抽象出内部沟通的本质,那就应该是一个良好的开端。

电子,作为一个框架,是一个变化非常快的关键。如果你想用它很好地创建应用程序,我强烈建议你要非常注意版本更改。我是新手,通过对这件事的搜索,我看到了电子内部过程的许多微小但重大的变化,许多搜索结果产生了不推荐/过时的信息。

最好从主进程访问Node API。因此,您需要从Renderer到Main进程进行通信以执行此类操作。

要从Renderer进程访问Node API,还需要将contextIsolation设置为false,将nodeIntegration设置为true。这又是非常不安全的,因为

。。它有助于防止网站访问Electron内部或预加载脚本可以访问的强大API。[1]

所以尽量避免在生产中这样做,因为对于开发,你可以自由地进行实验。

参考:

[1]https://www.electronjs.org/docs/tutorial/context-isolation

最新更新