electron進程間通信機制

electronnodejs+chrome內(nèi)核+native層的集成,類似chrome瀏覽器每個頁面都屬于一個進程(稱為渲染進程)叽躯,另外還有主進程,其提供了如下進程間通信機制:

  1. IPCMain IPCRender通信模塊肌括,其中IPCMain用于主進程点骑,IPCRender用于渲染進程,這兩者都是node's EventEmiter實例的封裝谍夭;
  • 渲染進程->主進程

    渲染進程通過IPCRender.send發(fā)送異步消息黑滴,IPCRender.sendSync發(fā)送同步消息;主進程通過IPCMain.on接收消息并通過event.sender.send響應(yīng)異步消息紧索,event.returnValue響應(yīng)同步消息袁辈。

    通過IPCMain與IPCRender模塊可實現(xiàn)client-server模型,主進程作為server端注冊消息并提供業(yè)務(wù)服務(wù)(如創(chuàng)建窗口珠漂、托盤晚缩、數(shù)據(jù)持久化訪問及設(shè)置等),渲染進程作為client端以發(fā)送消息媳危,因此可建立消息與業(yè)務(wù)的分離荞彼,業(yè)務(wù)層注冊可實現(xiàn)的消息并處理響應(yīng)結(jié)果及返回數(shù)據(jù);

// In main process.
  const {ipcMain} = require('electron')
  ipcMain.on('asynchronous-message', (event, arg) => {
    console.log(arg) // prints "ping"
    event.sender.send('asynchronous-reply', 'pong')
  })

  ipcMain.on('synchronous-message', (event, arg) => {
    console.log(arg) // prints "ping"
    event.returnValue = 'pong'
  })
// In renderer process (web page).
  const {ipcRenderer} = require('electron')
  console.log(ipcRenderer.sendSync('synchronous-message', 'ping')) // prints "pong"

  ipcRenderer.on('asynchronous-reply', (event, arg) => {
    console.log(arg) // prints "pong"
  })
  ipcRenderer.send('asynchronous-message', 'ping')

主進程->渲染進程

主進程通過BrowserWindow.webcontent.send發(fā)送消息待笑,通過在主進程管理所有窗口對象鸣皂,可遍歷所有窗口對象的webcontent屬性來發(fā)送消息,進而可實現(xiàn)主進程向渲染進程的廣播消息

注意暮蹂,webContents.on 監(jiān)聽的是已經(jīng)定義好的事件寞缝,如上面的 did-finish-load。要監(jiān)聽自定義的事件還是通過 ipcMainipcRenderer仰泻。

渲染進程的監(jiān)聽事件回調(diào)函數(shù)中荆陆,也可以通過 event.sender 來向主進程發(fā)送消息。這個對象只是 ipcRenderer 的引用(event.sender === ipcRenderer)集侯。因此被啼,event.sender 發(fā)送的消息在主進程中還是需要通過 ipcMain.on 方法來監(jiān)聽帜消,而不是通過 webContents.on 方法。

  • // In the main process.
      const {app, BrowserWindow} = require('electron')
      let win = null
    
      app.on('ready', () => {
        win = new BrowserWindow({width: 800, height: 600})
        win.loadURL(`file://${__dirname}/index.html`)
        win.webContents.on('did-finish-load', () => {
          win.webContents.send('ping', 'whoooooooh!')
        })
      })
    
    <!-- index.html -->
      <html>
      <body>
        <script>
          require('electron').ipcRenderer.on('ping', (event, message) => {
            console.log(message) // Prints 'whoooooooh!'
          })
        </script>
      </body>
      </html>
    
  1. electron.remote模塊

渲染進程可加載remote模塊趟据,并訪問主進程的模塊或者app對象券犁,從而使用主進程的模塊或者獲取變量术健,如BrowserWindow汹碱、global對象。

進程間通信機制封裝
可通過electron提供的通訊機制接口封裝一套通訊模塊荞估,用于主進程與渲染進程間通信咳促,基于client-server訂閱/發(fā)布廣播模型構(gòu)建一套完成的進程間消息機制勘伺,消息機制流程(可參考)如下:

image.png

渲染進程加載本地js文件
渲染進程需要加載本地的IPC Clientjs文件已實現(xiàn)進程間通信跪腹,可通過如下方式實現(xiàn):

  • 使用browserwindow.webPreferences.preload指定需要加載的js文件

  • 使用browserwindow.webcontent.executejavascript()接口

使用executejavascript方式存在時序問題,因其加載晚于webcontent加載渲染頁面飞醉,而preload方式要早于webcontent頁面加載冲茸;

BrowserWindow對象都有唯一的窗口ID(可通過getCurrentWindow來獲取)缅帘,若是基于業(yè)務(wù)需要設(shè)置綁定不同的ID轴术,可通過此唯一的ID綁定需要設(shè)置的ID,并通過remote模塊獲取對應(yīng)關(guān)系钦无,以解決BrowserWindow對象通過executejavascript時序問題逗栽;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市失暂,隨后出現(xiàn)的幾起案子彼宠,更是在濱河造成了極大的恐慌,老刑警劉巖弟塞,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凭峡,死亡現(xiàn)場離奇詭異,居然都是意外死亡决记,警方通過查閱死者的電腦和手機想罕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來霉涨,“玉大人按价,你說我怎么就攤上這事◇仙” “怎么了楼镐?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長往枷。 經(jīng)常有香客問我框产,道長凄杯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任秉宿,我火速辦了婚禮戒突,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘描睦。我一直安慰自己膊存,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布忱叭。 她就那樣靜靜地躺著隔崎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪韵丑。 梳的紋絲不亂的頭發(fā)上爵卒,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音撵彻,去河邊找鬼钓株。 笑死,一個胖子當(dāng)著我的面吹牛陌僵,可吹牛的內(nèi)容都是我干的轴合。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼拾弃,長吁一口氣:“原來是場噩夢啊……” “哼值桩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起豪椿,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤奔坟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后搭盾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體咳秉,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年鸯隅,在試婚紗的時候發(fā)現(xiàn)自己被綠了澜建。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡蝌以,死狀恐怖炕舵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情跟畅,我是刑警寧澤咽筋,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站徊件,受9級特大地震影響奸攻,放射性物質(zhì)發(fā)生泄漏蒜危。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一睹耐、第九天 我趴在偏房一處隱蔽的房頂上張望辐赞。 院中可真熱鬧,春花似錦硝训、人聲如沸响委。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晃酒。三九已至表牢,卻和暖如春窄绒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背崔兴。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工彰导, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人敲茄。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓位谋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親堰燎。 傳聞我的和親對象是個殘疾皇子掏父,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容