幼儿饰品瑜伽美体用品微软
投稿投诉
微软创意
爱情通信
用品婚姻
爱好看病
美体软件
影音星座
瑜伽周边
星座办公
饰品塑形
搞笑减肥
幼儿两性
智家潮品

Electron进程间通信的四种方式

  在electron中进行使用ipcMain和ipcRenderer模块,通过开发人员定义的通道传递消息来进行通信。新的版本中electron推荐使用上下文隔离渲染器进程进行通信,这种方式的好处是无需在渲染进程中直接使用ipcRenderer发送消息,这种在渲染进程中调用nodejs对象的方法对于渲染进程有侵入性。当我们使用vue或者其他前端框架开发界面时,上下文隔离方式使用起来更加方便,基本上感受不到electron对前端框架的影响。
  上下文隔离的进程间通信方式有四种:1。渲染器进程到主进程(单向)
  要将单向IPC消息从渲染器进程发送到主进程,您可以使用ipcRenderer。sendAPI发送消息,然后使用ipcMain。onAPI接收。通常使用场景是从Web向主进程发送消息。使用ipcMain。on监听事件
  在主进程中,使用ipcMain。on在settitle通道上设置一个IPC监听器:consthandleSetTitle(event,title){constwebContentsevent。senderconstwinBrowserWindow。fromWebContents(webContents)win。setTitle(title)}ipcMain。on(settitle,handleSetTitle)
  上面的handleSetTitle回调函数有两个参数:一个IpcMainEvent结构和一个title字符串。每当消息通过settitle通道传入时,此函数找到附加到消息发送方的BrowserWindow实例,并在该实例上调用win。setTitle函数设置窗口标题。通过预加载脚本暴露ipcRenderer。send
  要将消息发送到上面创建的监听器,您可以使用ipcRenderer。send。默认情况下,渲染器进程没有权限访问Node。js和Electron模块。作为应用开发者,你需要使用contextBridge来选择要从预加载脚本中暴露哪些API。
  在您的预加载脚本中添加以下代码,向渲染器进程暴露一个全局的window。electronAPI变量。import{contextBridge,ipcRenderer}fromelectroncontextBridge。exposeInMainWorld(electronAPI,{setTitle:(title)ipcRenderer。send(settitle,title)})
  然后我们就能够在渲染器进程中使用window。electronAPI。setTitle()函数。构建渲染器进程UI
  在BrowserWindow加载的我们的HTML文件中,添加一个由文本输入框和按钮组成的基本用户界面:!DOCTYPEhtmlhtmlheadmetacharsetUTF8!https:developer。mozilla。orgenUSdocsWebHTTPCSPmetahttpequivContentSecurityPolicycontentdefaultsrcself;scriptsrcselftitleHelloWorld!titleheadbodyTitle:inputidtitlebuttonidbtntypebuttonSetbuttonbodyhtml
  为了使这些元素具有交互性,我们将在导入的renderer。js文件中添加几行代码,以利用从预加载脚本中暴露的window。electronAPI功能:constsetButtondocument。getElementById(btn)consttitleInputdocument。getElementById(title)setButton。addEventListener(click,(){consttitletitleInput。valuewindow。electronAPI。setTitle(title)});
  这种方式只能把消息从web中发送到主进程,并不能从主进程中获取到返回值。2。渲染器进程到主进程(双向)
  双向IPC的一个常见应用是从渲染器进程代码调用主进程模块并等待结果。这可以通过将ipcRenderer。invoke与ipcMain。handle搭配使用来完成。
  我们依然通过一个示例来了解这种通信方式:使用ipcMain。handle监听事件
  在主进程中,我们将创建一个handleFileOpen()函数,它调用dialog。showOpenDialog并返回用户选择的文件路径值。每当渲染器进程通过dialog:openFile通道发送ipcRender。invoke消息时,此函数被用作一个回调。然后,返回值将作为一个Promise返回到最初的invoke调用。asyncfunctionhandleFileOpen(){const{canceled,filePaths}awaitdialog。showOpenDialog()if(canceled){return}else{returnfilePaths〔0〕返回文件名给渲染进程}}ipcMain。handle(dialog:openFile,handleFileOpen)通过预加载脚本暴露ipcRenderer。invoke
  在预加载脚本中,我们暴露了一个单行的openFile函数,它调用并返回ipcRenderer。invoke(dialog:openFile)的值。import{contextBridge,ipcRenderer}fromelectroncontextBridge。exposeInMainWorld(electronAPI,{openFile:()ipcRenderer。invoke(dialog:openFile)})构建渲染器进程UI
  在渲染器中调用window。electronAPI。openFile调用打开文件对话框,并获取打开的文件名,并显示在界面上。!DOCTYPEhtmlhtmlheadmetacharsetUTF8!https:developer。mozilla。orgenUSdocsWebHTTPCSPmetahttpequivContentSecurityPolicycontentdefaultsrcself;scriptsrcselftitleDialogtitleheadbodybuttontypebuttonidbtnOpenaFilebuttonFilepath:strongidfilePathstrongbodyhtml
  渲染器进程脚本constbtndocument。getElementById(btn)constfilePathElementdocument。getElementById(filePath)btn。addEventListener(click,async(){constfilePathawaitwindow。electronAPI。openFile()filePathElement。innerTextfilePath})3。主进程到渲染器进程(双向)
  将消息从主进程发送到渲染器进程时,需要指定是哪一个渲染器接收消息。消息需要通过其WebContents实例发送到渲染器进程。此WebContents实例包含一个send方法,其使用方式与ipcRenderer。send相同。使用webContents模块发送消息
  在菜单中通过使用webContents。send将IPC消息从主进程发送到目标渲染器。constmenuMenu。buildFromTemplate(〔{label:app。name,submenu:〔{click:()mainWindow。webContents。send(updatecounter,1),label:Increment,},{click:()mainWindow。webContents。send(updatecounter,1),label:Decrement,}〕}〕)Menu。setApplicationMenu(menu)通过预加载脚本暴露ipcRenderer。on
  使用预加载脚本中的contextBridge和ipcRenderer模块向渲染器进程发送消息:import{contextBridge,ipcRenderer}fromelectroncontextBridge。exposeInMainWorld(electronAPI,{onUpdateCounter:(callback)ipcRenderer。on(updatecounter,callback)})
  加载预加载脚本后,渲染器进程应有权访问window。electronAPI。onUpdateCounter()监听器函数。构建渲染器进程UI!DOCTYPEhtmlhtmlheadmetacharsetUTF8!https:developer。mozilla。orgenUSdocsWebHTTPCSPmetahttpequivContentSecurityPolicycontentdefaultsrcself;scriptsrcselftitleMenuCountertitleheadbodyCurrentvalue:strongidcounter0strongbodyhtml
  更新HTML文档中的值constcounterdocument。getElementById(counter)window。electronAPI。onUpdateCounter((event,value){constoldValueNumber(counter。innerText)constnewValueoldValuevaluecounter。innerTextnewValue})返回一个回复
  对于从主进程到渲染器进程的IPC,没有与ipcRenderer。invoke等效的API。不过,您可以从ipcRenderer。on回调中将回复发送回主进程。
  在渲染器进程中,使用event参数,通过countervalue通道将回复发送回主进程。constcounterdocument。getElementById(counter)window。electronAPI。onUpdateCounter((event,value){constoldValueNumber(counter。innerText)constnewValueoldValuevaluecounter。innerTextnewValueevent。sender。send(countervalue,newValue)发送消息到主进程})
  在主进程中,监听countervalue事件并适当地处理它们。。。。ipcMain。on(countervalue,(event,value){console。log(value)将打印到Node控制台})。。。4。渲染器进程到渲染器进程
  没有直接的方法可以使用ipcMain和ipcRenderer模块在Electron中的渲染器进程之间发送消息。为此,我们有两种选择:将主进程作为渲染器之间的消息代理。这需要将消息从一个渲染器发送到主进程,然后主进程将消息转发到另一个渲染器。从主进程将一个MessagePort传递到两个渲染器。这将允许在初始设置后渲染器之间直接进行通信。Electron与Vue进程通信
  上面我们介绍了Electron的四种进程间通信方式,那么将Electron和Vue结合起来,其本质依然是主进程与渲染进程之间的通信,通信方式不会由什么变化,只是目前比较流行的TS编程方式会让一些人束手无策,会报一些属性不存在的错误,这就需要我们去为TS声明这些额外的属性。例如:注册上下文隔离接口
  在预加载脚本中添加如下代码:importosfromos;import{contextBridge}fromelectron;contextBridge。exposeInMainWorld(electronAPI,{platform:os。platform(),});
  2。为TS声明类型srctypesglobal。d。tsexportinterfaceIElectronAPI{platform:string;}declareglobal{interfaceWindow{electronAPI:IElectronAPI;}}
  3。在Vue中调用接口srcApp。vuetemplateimgaltVuelogosrca2020imgdataimg。jpgdatasrcimg02。bs178。combgcj40b8560f1b6fe433。jpgHelloWorld:msgHelloVue3TypeScriptVitein{platform}template

游三孔,知天下解锁历史典故之孔庙篇孔庙,又被称为至圣庙,是我国历代王朝祭祀思想家、政治家、教育家孔子的庙宇,规模宏大、气势雄伟壮丽、金碧辉煌,极具东方特色,被誉为天下第一庙。1994年,孔庙、孔府、孔林一起被列……众星红毯再斗艳!吴磊领口往下剪开2寸,秦海璐为美足足饿了3天前不久北影红毯上,众星盛装出席,争奇斗艳,然而还不到一个月,某品牌举办活动,各方明星再次汇集于此,为了能够在红毯之上,艳压群芳,明星们各个在造型上下足了功夫。吴磊领口在原……何必鱼死网破?郭艾伦转会下家被爆出,老叔有心招揽广州队却没钱谁也没有想到,击败辽宁队的也许正是辽宁队自己,原本夺得20212022赛季总冠军的辽宁队,阵容可以说是无可挑剔,唯一的弱点就是韩德君的年龄偏大即将退役,辽宁队需要赶紧培养韩德君……今年9月梅州进口增速全省第一记者从梅州海关获悉,据统计,2022年前三季度,梅州市进出口82。5亿元,其中,出口68。9亿元,进口13。6亿元。9月份当月,进出口9。7亿元,其中,出口6。7亿元,进口3亿……陈梦爆冷,23不敌19岁小将,首轮出局,球迷时代姐谁都敢输比世界大赛更难打的是什么?那就是全运会和全锦赛,因为世界上很多的乒乓球好手都在中国。毕竟乒乓球是我们的国球,好的苗子有如过江之鲫。全锦赛的首轮比赛,就爆出了好几个冷门,比如奥运……67年不洗澡,一洗人没了伊朗有一个94岁的流浪汉老头坚持67年不洗澡,却活了94岁。这种生活在我看来也是一种选择,虽然居无定所,有时也饥饿难耐,可是这种生活也有他精神上的自由自在,生活上无拘无束,也少……国美深陷危机,黄老板套现近10亿,准备抛弃国美?9月26日,国美员工称,公司未按时发放8月工资。随后,国美回应属实,主要是公司转型进程受阻、现金流承压,导致工资发放做了应急调整,不排除继续减员。企业经营一旦好转,将第一时间给……新兴市场遭股债双杀不少机构称已跌出机会中国基金报记者姚波MSCI新兴市场指数经历了自金融危机以来最快速的深幅下跌,而新兴市场债市年内已流出700亿美元,创下自2005年来最高纪录。不少外债高企的国家已经出现了……把面包车改造成房车这对敢想敢做的日本情侣旅行,有人为了吃,有人为了放空,有人为了看海,有人喜欢冒险运动但是对大部分人来说,旅行的开心总有结束的那一刻。不过日本有一对情侣就做到了很多人想做却不敢做的事:把旅……纽约金价10月31日下跌新华社芝加哥10月31日电(记者徐静)纽约商品交易所黄金期货市场交投最活跃的12月黄金期价10月31日比前一交易日下跌4。1美元,收于每盎司1640。7美元,跌幅为0。25。……车载激光雷达进入普及元年巨头订单激增,全球格局有变每经记者:陈鹏丽每经编辑:董兴生2022年,全球车载激光雷达呈现海外冷、国内热的冰火两重天景象。车载激光雷达鼻祖Ibeo公司倒在了冬季开始的前一天。据Ibeo官网,公司由……手机拍照新姿势小米翻转摄像头手机专利公布如果想要用手机拍摄天空,或是地面,你会怎么做?将手机举过头顶,或是让手机与地面平行,应该是大部分人唯一的选择。今天,北京小米移动软件有限公司申请的一种设有翻转式摄像模组的……
从熙熙攘攘到没人问津,郭亮村太作了,给全部景区提了个醒随着越来越多的人涌向城市,人们越来越感受到城市生活的压力,开始怀念乡村的宁静和休闲,因此他们会去乡村度假。因此,中国的许多村庄都有机会利用旅游业的东风,赚得盆满钵满。郭亮……本届世界杯最有看点的小组赛荷兰vs塞内加尔荷兰是此组实力最强,塞内加尔最有黑马潜质,而且双方都有顶级大牌压阵,分别是范戴克和马内,这也是曾经的红军之矛与现在的利物浦之盾的较量,两人作为多年队友彼此……河南全景式艺术盛宴,文史典故诙谐再现,就在世界最大的戏剧幻城头条创作挑战赛我看过月亮之都江西宜春那位列世界三大名秀之一的《宋城千古情》剧场,也欣赏过在我国首个雾中岛剧场诞生地建德月亮岛上演的《江清月近人》,还参加过在国内首个民国主……富士康董事长坐镇!要求不能停产,河南经济的出路只能靠富士康?《经济日报》10月31日消息,鸿海旗下富士康郑州厂区传出部分员工徒步返乡,鸿海董事长刘扬伟高度重视,10月30日亲自坐镇指挥督军调度,了解状况,力求顺利排除状况,让当地厂区维持……换上普通钢带的NOMOS,还是文艺青年的最爱吗?每一个初识NOMOS的文艺青年很难不被打动,正如曾经的我一样。不得不说,专注包豪斯风格的NOMOS将腕表的文艺气质演绎到了极致。印象中的NOMOS,基本上都是皮表带款式,……怀孕后哥嫂对我体贴入微带我产检帮我买保养品可这一切都是阴谋怀孕后,哥哥嫂子对我体贴入微。带我产检,帮我买保养品,甚至连孩子的衣服都买好了。直到那天嫂子跟我说:等孩子出生了,我们一定会好好照顾她的。1。hr结婚的时候,……官方消息!上海男篮送别双外援,比斯利确定离队,富兰克林太可惜北京时间11月2日,根据上海男篮官方社交媒体透露,CBA常规赛第一阶段结束后,大鲨鱼的两位外援:富兰克林和比斯利已经确认离队。感谢他们曾经为大鲨鱼全力以赴!对于这个消息,……卡塔尔贿赂厄瓜多尔球员输球,走韩国队老路?4强就是这样诞生的2022世界杯记者AmjadTaha独家爆料,卡塔尔贿赂了8名厄瓜多尔球员,让他们在揭幕战输给卡塔尔。世界杯揭幕战将是卡塔尔对阵厄瓜多尔,记者称卡塔尔支……做企业是一条需要不断修炼的不归路抱团取暖,逆寒而行逆寒正文第二集,均收集于同名合集下,探寻中小微个体穿越寒冬发展之路。不管是全球最大网红马斯克,还是苹果创始人乔布斯,他们对做企业的理解都是企业家的……现役联盟5大顶级战力詹皇落榜,杜兰特领衔,5人场均得分超30随着NBA新赛季开始之后,在本赛季现在各支球队的进攻火力看起来似乎是比过去几年还要出色了,赛季至今场均得分最高的凯尔特人场均能够拿下120。4分,而上赛季联盟场均得分最高的球队……产检老公陪同都做了什么呢?头条创作挑战赛各位孕妈,你们去产检的时候老公会陪同一起去吗?我产检老公没有每次陪同。但我每次预约去产检都尽量挑老公休息的时间,就是想让老公参与,虽然他陪同去医院,但是很多……霜降随感今天是农历九月二十八,霜降节气,我们当地有个习俗,十月朝送寒衣,就是进入十月,天气转凉,为已故的亲人送去御寒的冬衣,寄托相思之情。今天是周日,人们都赶在了休息日去公墓祭奠已故的……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网