Node.js 电子-IPC改变了物体

Node.js 电子-IPC改变了物体,node.js,singleton,electron,ipc,Node.js,Singleton,Electron,Ipc,在我的Electron项目中,我试图通过将其设置为全局模式来创建一个模块singleton。因为我在这个模块中使用了jquery,所以我在渲染器过程中导入它,然后通过ipc将它发送到main,并在那里将它设置为全局。以下是我的代码的相关部分: main.js: ipcMain.on( "setGlobal", ( event, global_var) => { global[global_var[0]] = global_var[1]; console.log(global_var

在我的Electron项目中,我试图通过将其设置为全局模式来创建一个模块singleton。因为我在这个模块中使用了
jquery
,所以我在渲染器过程中导入它,然后通过ipc将它发送到main,并在那里将它设置为全局。以下是我的代码的相关部分:

main.js:

ipcMain.on( "setGlobal", ( event, global_var) => {
  global[global_var[0]] = global_var[1];
  console.log(global_var);
  event.returnValue = 1;
} );
renderer.js:

const favourites = require("./components/favourites");

console.log(favourites);

ipcRenderer.sendSync("setGlobal", ["favourites", favourites]);

console.log(remote.getGlobal("favourites"));
渲染器进程中的
console.log
s的输出如下图所示:

主流程的输出为:

[ 'favourites', { favourites: [] } ]
如您所见,我从ipcRenderer发送的对象(模块)在ipcMain中发生了更改,它丢失了
add
init
函数。你知道这种行为的原因是什么,以及如何解决它吗


PS:当然,我用一个简单的对象测试了它,该对象包含函数,而不是
require(“收藏夹”)
。他们也以同样的方式行事。我做了一个变通方法,只使用实体作为全局对象,并将它们作为参数传递给所有函数。然而,从代码可读性的角度来看,这不是一个好方法。

你不能那样使用IPC。如文件所述(例如)

通过通道向主进程同步发送消息,也可以发送任意参数。参数将在JSON内部序列化,因此不包括函数或原型链

您的函数根本无法进入主进程


要制作模块单例,您只需在模块中使用单例模式,并在主进程中使用
require
,在渲染器中使用
remote.require
。因为需要使用缓存(至少在默认情况下),所以应该返回相同的模块。(或多或少,在这方面)

例如,如果导出一个类:


你不能那样使用IPC。如文件所述(例如)

通过通道向主进程同步发送消息,也可以发送任意参数。参数将在JSON内部序列化,因此不包括函数或原型链

您的函数根本无法进入主进程


要制作模块单例,您只需在模块中使用单例模式,并在主进程中使用
require
,在渲染器中使用
remote.require
。因为需要使用缓存(至少在默认情况下),所以应该返回相同的模块。(或多或少,在这方面)

例如,如果导出一个类:


在@pergy的回答之后,我决定放弃IPC,只使用globals。因此,以下是我发现的解决方法:

主要流程:

global.provider = {};
渲染器进程:

const favourites = require("./components/favourites");
remote.getGlobal("provider").favourites = favourites;
其他模块:

const favourites = remote.getGlobal("provider").favourites;

在@pergy的回答之后,我决定放弃IPC,只使用globals。因此,以下是我发现的解决方法:

主要流程:

global.provider = {};
渲染器进程:

const favourites = require("./components/favourites");
remote.getGlobal("provider").favourites = favourites;
其他模块:

const favourites = remote.getGlobal("provider").favourites;

谢谢你的信息性回答!唯一的问题是我无法将模块导入主进程,因为它需要
jQuery
,导入它会产生错误。因此,我应该在渲染器中导入它。感谢您提供的详细答案!唯一的问题是我无法将模块导入主进程,因为它需要
jQuery
,导入它会产生错误。因此,我应该在渲染器中导入它。