在之前的文章我們介紹了一下Electron的選單建立和事件繫結,其中提到了一個remote模組,接下來我們繼續說一下Electron的這個remote模組。
官方關於remote模組的地址:https://www.electronjs.org/docs/api/remote
remote
模組為渲染程式(web頁面)和主程式通訊(IPC)提供了一種簡單方法。
在Electron中, GUI 相關的模組 (如 dialog
、menu
等) 僅在主程式中可用, 在渲染程式中不可用。 為了在渲染程式中使用它們, ipc
模組是向主程式傳送程式間訊息所必需的。 使用 remote
模組, 你可以呼叫 main 程式物件的方法, 而不必顯式傳送程式間訊息, 類似於 Java 的 RMI 。
例如:從渲染程式建立瀏覽器視窗。
上面是官方對remote的基本介紹,之前我們說過package.json中的main乳肉就是Electron的主程式,渲染的index.html頁面相當於一個渲染程式,如果我們想要在idnex.html中開啟一個頁面,如果還用index.js中的方法的話就相當於又開了一個程式,這顯然是不可取的,所以Electron就為我們提供了remote模組來解決此問題。
根據上面的解釋,我們就來做一個這樣的頁面中開啟另一個頁面的功能,先看一下上一章說完之後的目錄結構:
我們先在index.html中第一一個button按鈕,點選該按鈕來行使開啟另一個頁面的方法:
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>hello world</title> 6 </head> 7 <body> 8 <div> 9 <button id="btn">點我開啟其他頁面</button> 10 <script> 11 let btn = document.getElementById('btn'); 12 13 /* 之前在 index.js 中引入 BrowserWindow 的方式 */ 14 // const {BrowserWindow} = require('electron'); 15 16 /* 通過remote模組引入 BrowserWindow 的方式 */ 17 let {BrowserWindow} = require('electron').remote; 18 window.onload = function () { 19 btn.onclick = () => { 20 let win = new BrowserWindow({ 21 width: 500, 22 height: 500, 23 x: 500, // 相對於電腦桌面向右位移500px 24 y: 500, // 相對於電腦桌面向下位移500px 25 }); 26 win.loadFile('other.html') 27 } 28 } 29 </script> 30 </div> 31 </body> 32 </html>
在上面的程式碼中,我們定義了一個button按鈕,並在下面寫了一段JS程式碼,當點選該按鈕時,觸發一個Electron的開啟視窗的方法,和之前寫的略有不同的是我們在引入 BrowserWindow 方法時是從electron的一個 remote 模組中新增的,我們在同級目錄下建立一個 other.html 的檔案,執行起來看一下執行效果:
上面的效果符合我們的預期,如果我們不實用remote模組而直接呼叫BrowserWindow方法會出現什麼結果呢?即把上面的第 14 行註釋解開,將第 17 行註釋掉,執行一下:
通過控制檯可以看出報錯了,並沒有達到我們開啟另一個視窗的預期。
注意: 反過來(如果需要從主程式訪問渲染程式),可以使用 webContents. executeJavascript 。
注意事項: 因為安全原因,remote 模組能在以下幾種情況下被禁用:
BrowserWindow
- 通過設定enableRemoteModule
選項為false
。<webview>
- 通過把enableremotemodule
屬性設定成false
。
remote模組也能反問主程式中的內建模組,主過程中的內建模組被新增為 remote
模組中的獲取器,因此可以像 electron
模組一樣直接使用它們。
1 const app = require('electron').remote.app 2 console.log(app)
以上是關於 remote 的簡單介紹,在日常開發中我們還會經常使用該模組及它的另一些方法,