Node.js 电子-IPC改变了物体
在我的Electron项目中,我试图通过将其设置为全局模式来创建一个模块singleton。因为我在这个模块中使用了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
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
,导入它会产生错误。因此,我应该在渲染器中导入它。