Electron開發(fā)筆記

參考并擴展自

Creating a markdown app with Electron and React

簡介

Electron是一個使用js來開發(fā)跨平臺桌面端軟件的一個框架。
比較著名的產(chǎn)品包括:

  1. VS code
  2. skype
  3. atom
  4. 釘釘
  5. SwitchHosts!

重點

  1. electron的原理是把chromium的v8引擎和node的運行時結(jié)合到了一起。
  2. 架構(gòu)還是前后端分離
  3. 前端按照web開發(fā)的方式正常開發(fā)
  4. 通信原理:每一個前端窗口是一個進程,后端單獨是一個進程半等。electron提供前后端進程間通信的接口带欢。

開發(fā)流程

前提條件

有一個可以跑通的web項目念颈,比如用create-react-app創(chuàng)建的項目汗销。

安裝electron

npm install electron --save-dev
在package.json的script中添加
"electron-start": "electron ."
在package.json的頂層添加
"main": "public/main.js"
此時的package.json看起來是這樣的

{
  "name": "mook",
  "version": "0.1.0",
  "main": "public/main.js",
  "private": true,
  "dependencies": {
    "react": "^15.6.1",
    "react-dom": "^15.6.1",
    "react-scripts": "1.0.13"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test --env=jsdom",
    "eject": "react-scripts eject",
    "electron-start": "electron ."
  },
  "devDependencies": {
    "electron": "^1.7.6"
  }
}

main.js文件是后端主進程的執(zhí)行入口,內(nèi)容如下:

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

let mainWindow;

function createWindow() {
  mainWindow = new BrowserWindow({width: 900, height: 680});
  mainWindow.loadURL('http://localhost:3000');

  app.setAboutPanelOptions({
    applicationName: "Mook",
    applicationVersion: "0.0.1",
  })

  mainWindow.on('closed', () => mainWindow = null);
}

app.on('ready', createWindow);

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit();
  }
});

app.on('activate', () => {
  if (mainWindow === null) {
    createWindow();
  }
});

其中mainWindow.loadURL('http://localhost:3000');這行為加載的前端頁面的地址抬吟。
此時,先執(zhí)行npm run start啟動前端頁面统抬,再執(zhí)行npm run electron-start啟動electron火本。

簡化開發(fā)啟動

每次啟動都需要執(zhí)行兩個命令,比較麻煩聪建,因此钙畔,可以通過安裝幾個包來解決這個問題。
npm install wait-on concurrently --save-dev
然后再package.json文件的script中添加
"electron-dev": "concurrently \"npm start\" \"wait-on http://localhost:8080 && electron .\"",
這樣金麸,就可以通過執(zhí)行npm run electron-dev一個命令啟動了擎析。

創(chuàng)建打包腳本

  1. 首先需要安裝打包工具
    npm install electron-builder --save-dev
  2. 添加打包配置
    然后再package.json文件的script中添加
    "preelectron-pack": "npm run build"
    以及
    "electron-pack": "build -c.extraMetadata.main=build/main.js"
    preelectron-pack命令會在執(zhí)行npm run electron-pack之前自動執(zhí)行,也就是會先打包前端的代碼挥下,生成一個html文件揍魂。
    需要注意的是桨醋,build/main.js就是剛剛package.json文件中的public/main.js。只不過在打包前端代碼的時候一并打包入了build目錄中现斋。如果你用的不是create-react-app喜最,那么需要注意把這個文件一起打包進去。
    在package.json中庄蹋,需要增加一個build塊和homepage屬性瞬内,build用來告訴electron-pack如何打包,而homepage則指明了js和css文件的位置限书。配置如下:
"homepage": "./",
"build": {
  "appId": "com.mook",
  "files": [
    "build/**/*",
    "node_modules/**/*"
  ],
  "directories": {
    "buildResources": "assets"
  }
}
  1. 修改main.js
    之前的main.js是加載了http://localhost:3000的方式進行的虫蝶。打包后不能繼續(xù)使用這種方法。需要安裝一個包
    npm install electron-is-dev --save
    這個包用來判斷當前執(zhí)行的環(huán)境蔗包。
    之后修改public/main.js
const isDev = require('electron-is-dev');
const path = require('path');

將原來的

mainWindow.loadURL('http://localhost:3000');

改為

mainWindow.loadURL(isDev ? 'http://localhost:3000' : `file://${path.join(__dirname, '../build/index.html')}`);
  1. 打包
    執(zhí)行npm run electron-pack就會生成dmg文件秉扑。

至此整個項目的架子基本就已經(jīng)搭完了。

前后端通信

electron提供了ipcMainipcRenderer兩個類進行通信调限。
前端發(fā)送請求

const {ipcRenderer} = window.require('electron')
ipcRenderer.send(channel, data)

其中 channel可以理解為調(diào)用的方法名舟陆,需要后端對該方法進行監(jiān)聽。
后端接受請求

const { ipcMain } = electron
ipcMain.on(channel, (event, arg) => {
  # do something here  
})

反過來
后端發(fā)送請求

mainWindow.webContents.send(channel, data)

其中mainWindow為項目啟動時創(chuàng)建的窗口耻矮,如果創(chuàng)建了多個窗口秦躯,可以向指定的窗口發(fā)送請求。
前端監(jiān)聽請求

const {ipcRenderer} = window.require('electron')
ipcRenderer.on(channel, (event, arg) => {
  # do something here
})

小結(jié)

以上是開發(fā)工程中遇到的比較費時間的一些事情的整理裆装。electron用來開發(fā)一些小工具還是一個不錯的選擇踱承。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市哨免,隨后出現(xiàn)的幾起案子茎活,更是在濱河造成了極大的恐慌,老刑警劉巖琢唾,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件载荔,死亡現(xiàn)場離奇詭異,居然都是意外死亡采桃,警方通過查閱死者的電腦和手機懒熙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來普办,“玉大人工扎,你說我怎么就攤上這事∠味祝” “怎么了肢娘?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我蔬浙,道長猪落,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任畴博,我火速辦了婚禮笨忌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘俱病。我一直安慰自己官疲,他們只是感情好,可當我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布亮隙。 她就那樣靜靜地躺著途凫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪溢吻。 梳的紋絲不亂的頭發(fā)上维费,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機與錄音促王,去河邊找鬼犀盟。 笑死,一個胖子當著我的面吹牛蝇狼,可吹牛的內(nèi)容都是我干的阅畴。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼迅耘,長吁一口氣:“原來是場噩夢啊……” “哼贱枣!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起颤专,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤纽哥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后栖秕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體昵仅,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年累魔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片够滑。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡垦写,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出彰触,到底是詐尸還是另有隱情梯投,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站分蓖,受9級特大地震影響尔艇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜么鹤,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一终娃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蒸甜,春花似錦棠耕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至恨憎,卻和暖如春蕊退,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背憔恳。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工瓤荔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人喇嘱。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓茉贡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親者铜。 傳聞我的和親對象是個殘疾皇子腔丧,可洞房花燭夜當晚...
    茶點故事閱讀 42,834評論 2 345

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