Electron

1.簡介

先來段代碼感受下~~

const electron = require('electron');

const app = electron.app;

const BrowserWindow = electron.BrowserWindow;

varwindow =null;

app.on('ready',function() {

window =newBrowserWindow({width: 800, height: 600});

window.loadURL('https://web.itiger.com');

});

看起來像個普通的nodejs腳本。

官網介紹:僅僅使用JavaScript,HTML,CSS搭建跨平臺桌面應用。

使用Chromium和Node.js。相當于一個瀏覽器的殼,所以你能把它看作成一個被 JavaScript 控制的,精簡版的 Chromium 瀏覽器。所以可以隨意的使用JavaScript,HTML,CSS開發。

跨平臺:Windows,OS X,Linux....

2.主進程和渲染進程

2.1 主進程

在 Electron 里,運行package.json里main腳本的進程被稱為主進程。在主進程運行的腳本可以創建 web 頁面的形式展示 GUI。

2.2 渲染進程

由于 Electron 使用 Chromium 來展示頁面,所以 Chromium 的多進程結構也被充分利用。每個 Electron 的頁面都在運行著自己的進程,這樣的進程我們稱之為渲染進程。

2.3 主進程與渲染進程的區別

主進程使用 BrowserWindow 實例創建網頁。每個 BrowserWindow 實例都在自己的渲染進程里運行著一個網頁。當一個 BrowserWindow 實例被銷毀后,相應的渲染進程也會被終止。

主進程管理所有頁面和與之對應的渲染進程。每個渲染進程都是相互獨立的,并且只關心他們自己的網頁。

由于在網頁里管理原生 GUI 資源是非常危險而且容易造成資源泄露,所以在網頁面調用 GUI 相關的 APIs 是不被允許的。如果你想在網頁里使用 GUI 操作,其對應的渲染進程必須與主進程進行通訊,請求主進程進行相關的 GUI 操作。

2.4 主進程與渲染進程通信

使用IPC模塊

一個例子,在主進程和渲染進程之間發送和處理消息:

//主進程

const ipcMain = require('electron').ipcMain;

ipcMain.on('asynchronous-message',function(event, arg) {

console.log(arg);//? "pilipala"

event.sender.send('asynchronous-reply','hahahhaha');

});

// 渲染進程

const ipcRenderer = require('electron').ipcRenderer;

console.log(ipcRenderer.sendSync('synchronous-message','pilipala'));

ipcRenderer.on('asynchronous-reply',function(event, arg) {

console.log(arg);// "hahahhaha"

});

3. Electron API介紹

有些模塊在主進程使用,有的在渲染進程使用,有些在主進程和渲染進程都可以

主進程API模塊

3.1Electron BrowserWindow 模塊

來段代碼感受下~

const BrowserWindow = require('electron').remote.BrowserWindow;

varwin =newBrowserWindow({ width: 800, height: 600, show:false});

win.on('closed',function() { win =null; });

win.loadURL('https://web.itiger.com');

win.show();

new BrowserWindow 時很多參數,設置窗口大小,位置,是否全屏,陰影。title。主題等

參數:https://electron.atom.io/docs/api/browser-window/#new-browserwindowoptions

事件https://electron.atom.io/docs/api/browser-window/#instance-events

3.2 Electron webContents 模塊

它負責渲染并控制網頁,也是BrowserWindow對象的屬性.

來段代碼:

const BrowserWindow = require('electron').BrowserWindow;

varwin =newBrowserWindow({width: 800, height: 1500});

win.loadURL("https://web.itiger.com");

varwebContents = win.webContents;

檢測網頁內容的事件:https://electron.atom.io/docs/api/web-contents/#instance-events

3.3Electron ipcMain 模塊

ipcMain模塊是類EventEmitter(node 事件監聽類)的實例.當在主進程中使用它的時候,它控制著由渲染進程(web page)發送過來的異步或同步消息.從渲染進程發送過來的消息將觸發事件.

3.4Electron dialog 模塊

來段代碼:

const {dialog} = require('electron')

dialog.showOpenDialog({

properties:

['openFile','openDirectory','multiSelections']

})

支持不同的彈窗

方法:https://electron.atom.io/docs/api/dialog/#methods

實現效果:

3.5Electron menu 模塊

menu類可以用來創建原生菜單,它可用作應用菜單和context 菜單.

來段代碼:

const { app, Menu } = require('electron')

const template = [{

label: app.getName(),

submenu: [{

role:'reload'

}, {

type:'separator'

}, {

role:'hide'

}, {

role:'hideothers'

}, {

type:'separator'

}, {

role:'quit'

}]

}]

const menu = Menu.buildFromTemplate(template)

Menu.setApplicationMenu(menu)

例子:

https://electron.atom.io/docs/api/menu/#examples

3.6Electron global-shortcut 模塊

global-shortcut模塊可以自定義操作的快捷鍵。注冊的快捷鍵是系統全局的。

渲染進程模塊

3.7 Electron ipcRenderer 模塊

ipcRenderer模塊是一個EventEmitter類的實例。你可以從渲染進程向主進程發送同步或異步消息. 也可以收到主進程的相應.

兩個進程都可用的模塊

3.8Electron crashReporter 模塊

crash-reporter模塊開啟發送應用崩潰報告.

來段代碼~~自動提交崩潰報告給服務器 :

const crashReporter = require('electron').crashReporter;

crashReporter.start({

productName:'YourName',

companyName:'YourCompany',

submitURL:'https://your-domain.com/url-to-submit',

autoSubmit:true});

4. tigertrade-desktop-app 項目介紹

4.1 目錄結構

app ---? 打包給用戶的目錄

build --- 構建目錄 包括需要用到的證書,logo等

dist ----- 打包后

Two-Package Structure

兩個package.json文件,原因:分離開發依賴和生成環境依賴

4.2 代碼介紹

......

4.3 打包

electron-packager和electron-builder的選擇

electron-builder是基于 electron-packager 實現的,并在此基礎上做了 Two-Package.json Structure 的約定,以及自動更新等等功能。

擴展:

eletron和nw.js的區別

NW.js 原名 node-webkit

Electron 的原名是 Atom Shell

1. 應用的入口

在 NW.js 中,一個應用的主入口是一個頁面。你在package.json中指定一個主頁面,它會作為應用的主窗口被打開。

在 Electron 中,入口是一個 JavaScript 腳本。不同于直接提供一個URL,你需要手動創建一個瀏覽器窗口,然后通過 API 加載 HTML 文件。你還可以監聽窗口事件,決定何時讓應用退出。

2. Electron 的工作方式更像 Node.js 運行時。 Electron 的 APIs 更加底層

相關資源:

https://electron.atom.io/

https://electron.org.cn/

https://juejin.im/entry/5a0256a951882541157040d7

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,197評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,415評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,104評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,884評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,647評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,130評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,208評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,366評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,887評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,737評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,939評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,478評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,174評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,586評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,827評論 1 283
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,608評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,914評論 2 372

推薦閱讀更多精彩內容