天天看點

Electron之開發中的難點整理

electron分為:主程序與渲染程序。

在一個electron的程式中,一般會存在一個主程序跟若幹個渲染程序。

主程序:

1. 可以使用和系統對接的Electron Api -建立菜單,上傳檔案等。

2. 建立渲染程序- Renderer Process

3. 全面支援node.js

4. 隻有一個,作為整個程式的入口點。

渲染程序:

1. 可以有多個,每個渲染程序對應一個視窗。

2. 每個都是一個單獨的程序。

3. 全面支援node.js 和 Dom Api

4. 可以使用一部分Electron提供的API

如果說我們要在一個electron程式打開後,再同時打開一個渲染程序(也就是同時打開兩個視窗)我們應該怎麼辦呢?
const {app,BrowserWindow} = require('electron')
app = 主程式。
BrowserWindow = 建立并控制浏覽器視窗。

app.on('ready',()=>{
    let mainWindow = new BrowserWindow({
        width:800,
        height:600,
        webPreferences:{
            nodeIntegration:true // 是否啟用node
        }
    })
    
    mainWindow.loadFile('index.html')// 主程序加載頁面
    
    // 子視窗
    let secondWindow = new BrowserWindow({
        width: 400,
        height: 300,
        webPreferences: {
            nodeIntegration: true,
        },
        parent: mainWindow,
    })
    secondWindow.loadFile('secodWindow.html')
})      

上述代碼在app監測到ready 之後。首先建立了 mainWindow 也就是主程序。主程序渲染的是index.html 這個頁面。而主程序渲染完後,同時又啟動了一個新的子視窗。secondWindow,在它啟動時候配置它的父視窗為 mainWindow。

這樣在一個electron打開的時候我們就可以同時啟動兩個視窗。mainWindow是secordWindow的父級程序。

項目中,我們經常會碰到這樣一個情況,開發環境中,electron的打開位址一般指向本地的項目開發位址,如:localhost:8080。而線上環境的時候就沒有這個位址,我們如何處理?

其實這類問題的答案很簡單,我們需要判斷環境變量。

electron-is-dev      

我們在目前項目中安裝以上插件,用來判斷目前環境是否是 dev (開發)環境。

Electron之開發中的難點整理

根據目前環境我們可以配置出,如果是開發環境我們就走 位址,如果不是開發環境,我們則走項目打包之後的位址即可。

隐藏electron的邊框之後,突然發現這個程式無法拖動。這個如何解決呢?
<body style="-webkit-app-region: drag">
</body>
// 整個區域可拖拽      
// 注意:
如果想要整個視窗都可進行拖拽,則必須将其中的按鈕标記為不可拖拽,否則使用者将無法點選他們

button{
    -webkit-app-region:no-drag;
}      
在無邊框視窗中,拖動行為可能與選擇文本沖突,為了防止該操作,需要在可拖拽區域内禁用文本選擇。

.titebar{
    -webkit-use-select:none;
    -webkit-app-region:drag;
}      
  1. 在渲染程序中引入 ipc通信 ipcRenderer
const { ipcRenderer } = require('electron')      
  1. 在事件中進行消息發送
ipcRenderer.send("監聽名字","消息值")      
  1. 在主程序中進行消息監聽
const { ipcMain } = require('electron')
ipcMain.on('message',(event,tag)=>{
    console.log(tag)
    
    // 4. 主程序給渲染程序回饋消息。
    event.reply('reply',"給message的渲染程序傳回消息");
})      
  1. 渲染程序接收主程序傳回的消息
ipcRenderer.on('reply',(event,tag)=>{
    console.log('渲染程序接收到的主程序消息')
})      

繼續閱讀