從零開始學Electron筆記(三)

豐寸發表於2020-07-09

在之前的文章我們介紹了一下Electron的選單建立和事件繫結,其中提到了一個remote模組,接下來我們繼續說一下Electron的這個remote模組。

官方關於remote模組的地址:https://www.electronjs.org/docs/api/remote

remote 模組為渲染程式(web頁面)和主程式通訊(IPC)提供了一種簡單方法。

在Electron中, GUI 相關的模組 (如  dialogmenu 等) 僅在主程式中可用, 在渲染程式中不可用。 為了在渲染程式中使用它們, 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 的簡單介紹,在日常開發中我們還會經常使用該模組及它的另一些方法,

 

相關文章