摘要:當(dāng)一個(gè)實(shí)例被銷毀后,相應(yīng)的渲染進(jìn)程也會(huì)被終止。之所以命名為,主要是為了與主進(jìn)程這個(gè)概念對應(yīng)。部分在事件觸發(fā)后才能使用。當(dāng)全部窗口關(guān)閉時(shí)退出。主進(jìn)程接收到消息并處理之后,會(huì)返回處理結(jié)果。
簡介
Electron 是一個(gè)可以使用 Web 技術(shù)如 JavaScript、HTML 和 CSS 來創(chuàng)建跨平臺(tái)原生桌面應(yīng)用的框架。借助 Electron,我們可以使用純 JavaScript 來調(diào)用豐富的原生 APIs。
Electron用 web 頁面作為它的 GUI,而不是綁定了 GUI 庫的 JavaScript。它結(jié)合了 Chromium、Node.js 和用于調(diào)用操作系統(tǒng)本地功能的 APIs(如打開文件窗口、通知、圖標(biāo)等)。
現(xiàn)在已經(jīng)有很多由 Electron 開發(fā)應(yīng)用,比如 Atom、Insomnia、Visual Studio Code 等。查看更多使用 Electron 構(gòu)建的項(xiàng)目可以訪問 [Apps Built on Electron
](https://electron.atom.io/apps/)
安裝 electron 之前,需要安裝 Node.js。如果沒有安裝,推薦使用 nvm 等 Node.js 版本管理工具進(jìn)行安裝/
然后建議修改 electron 的源為國內(nèi)源:
$ export ELECTRON_MIRROR="https://npm.taobao.org/mirrors/electron/"
不然會(huì)出現(xiàn)如下錯(cuò)誤:
Error: connect ETIMEDOUT 54.231.50.42:443 at Object.exports._errnoException (util.js:1016:11) at exports._exceptionWithHostPort (util.js:1039:20) at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1138:14)
安裝 electron:
$ npm install electron -g進(jìn)程
Electron 的進(jìn)程分為主進(jìn)程和渲染進(jìn)程。
主進(jìn)程在 electron 里面,運(yùn)行 package.json 里面 main 腳本的進(jìn)程成為主進(jìn)程。主進(jìn)程控制整個(gè)應(yīng)用的生命周期,在主進(jìn)程中可以創(chuàng)建 Web 形式的 GUI,而且整個(gè) Node API 是內(nèi)置其中。
渲染進(jìn)程每個(gè) electron 的頁面都運(yùn)行著自己的進(jìn)程,稱為渲染進(jìn)程。
主進(jìn)程與渲染進(jìn)程的聯(lián)系及區(qū)別主進(jìn)程使用 BrowserWindow 實(shí)例創(chuàng)建頁面。每個(gè) BrowserWindow 實(shí)例都在自己的渲染進(jìn)程里運(yùn)行頁面。當(dāng)一個(gè) BrowserWindow 實(shí)例被銷毀后,相應(yīng)的渲染進(jìn)程也會(huì)被終止。
主進(jìn)程管理所有頁面和與之對應(yīng)的渲染進(jìn)程。每個(gè)渲染進(jìn)程都是相互獨(dú)立的,并且只關(guān)心他們自己的頁面。
在 electron 中,頁面不直接調(diào)用底層 APIs,而是通過主進(jìn)程進(jìn)行調(diào)用。所以如果你想在網(wǎng)頁里使用 GUI 操作,其對應(yīng)的渲染進(jìn)程必須與主進(jìn)程進(jìn)行通訊,請求主進(jìn)程進(jìn)行相關(guān)的 GUI 操作。
在 electron 中,主進(jìn)程和渲染進(jìn)程的通信主要有以下幾種方式:
ipcMain、ipcRender
Remote 模塊
進(jìn)程通信將稍后詳細(xì)介紹。
打造第一個(gè) Electron 應(yīng)用以下所有代碼可以在 https://github.com/nodejh/electron-quick-start 找到。
一個(gè)最簡單的 electron 應(yīng)用目錄結(jié)構(gòu)如下:
electron-demo/ ├── package.json ├── main.js └── index.html
package.json 與 Node.js 的完全一致,所以我們可以使用 npm init 來生成。然后將 "main": "index.js" 修改為 "main": "main.js"。之所以命名為 main.js,主要是為了與主進(jìn)程這個(gè)概念對應(yīng)。
main.js創(chuàng)建 main.js 文件并添加如下代碼:
const electron = require("electron"); const { app, // 控制應(yīng)用生命周期的模塊 BrowserWindow, // 創(chuàng)建原生瀏覽器窗口的模塊 } = electron; // 保持一個(gè)對于 window 對象的全局引用,如果不這樣做, // 當(dāng) JavaScript 對象被垃圾回收, window 會(huì)被自動(dòng)地關(guān)閉 let mainWindow; function createWindow() { // 創(chuàng)建瀏覽器窗口。 mainWindow = new BrowserWindow({width: 800, height: 600}); // 加載應(yīng)用的 index.html。 // 這里使用的是 file 協(xié)議,加載當(dāng)前目錄下的 index.html 文件。 // 也可以使用 http 協(xié)議,如 mainWindow.loadURL("http://nodejh.com")。 mainWindow.loadURL(`file://${__dirname}/index.html`); // 啟用開發(fā)工具。 mainWindow.webContents.openDevTools(); // 當(dāng) window 被關(guān)閉,這個(gè)事件會(huì)被觸發(fā)。 mainWindow.on("closed", () => { // 取消引用 window 對象,如果你的應(yīng)用支持多窗口的話, // 通常會(huì)把多個(gè) window 對象存放在一個(gè)數(shù)組里面, // 與此同時(shí),你應(yīng)該刪除相應(yīng)的元素。 mainWindow = null; }); } // Electron 會(huì)在初始化后并準(zhǔn)備 // 創(chuàng)建瀏覽器窗口時(shí),調(diào)用這個(gè)函數(shù)。 // 部分 API 在 ready 事件觸發(fā)后才能使用。 app.on("ready", createWindow); // 當(dāng)全部窗口關(guān)閉時(shí)退出。 app.on("window-all-closed", () => { // 在 macOS 上,除非用戶用 Cmd + Q 確定地退出, // 否則絕大部分應(yīng)用及其菜單欄會(huì)保持激活。 if (process.platform !== "darwin") { app.quit(); } }); app.on("activate", () => { // 在 macOS 上,當(dāng)點(diǎn)擊 dock 圖標(biāo)并且該應(yīng)用沒有打開的窗口時(shí), // 絕大部分應(yīng)用會(huì)重新創(chuàng)建一個(gè)窗口。 if (mainWindow === null) { createWindow(); } });
關(guān)于 app 和 BrowserWindow 對象和實(shí)例的更多用法可參考 electron 的文檔:
app
BrowserWindow
index.html然后編輯需要展示的 index.html:
Hello World! Hello World!
We are using Node.js and Electron
在這個(gè)例子中,我們顯示出了 electron 使用的 Node.js 版本和 electron 的版本。index.html 跟網(wǎng)頁的 HTML 一摸一樣,只是多了一些 electron 的全局對象。
運(yùn)行因?yàn)榍懊嬉呀?jīng)全局安裝了 electron,所以我們可以使用 electron 命令來運(yùn)行項(xiàng)目。在 electron-demo/ 目錄里面運(yùn)行下面的命令:
$ electron .
然后會(huì)彈出一個(gè) electron 應(yīng)用客戶端,如圖所示:
因?yàn)樵谥鬟M(jìn)程中啟用了開發(fā)模式 mainWindow.webContents.openDevTools(),所以默認(rèn)啟動(dòng)開發(fā)者工具。
如果是局部安裝的 electron,即 npm install --save electron,則可以運(yùn)行下面的命令來啟動(dòng)應(yīng)用:
$ ./node_modules/.bin/electron .進(jìn)行通信
對于 electron 來說,主進(jìn)程和渲染進(jìn)程直接的通信是必不可少的。
前面提到過 electron 進(jìn)程間的通信的方式主要有兩種,一種是用于發(fā)送消息的 ipcMain 和 ipcRenderer 模塊,一種用于 RPC 的 remote 模塊。
現(xiàn)在假設(shè)一個(gè)業(yè)務(wù)場景,用戶在頁面中輸入文本消息,渲染進(jìn)程將消息發(fā)送給主進(jìn)程,主進(jìn)程處理后將處理結(jié)果返回給頁面。為了方便起見,主進(jìn)程的處理就假設(shè)為翻轉(zhuǎn)文本。當(dāng)然,這個(gè)功能在前端完全可以實(shí)現(xiàn),這里只是為了演示進(jìn)程通信。
ipcMain 和 ipcRenderer首先在渲染進(jìn)程中添加一個(gè)輸入框和一個(gè)按鈕,并實(shí)現(xiàn)點(diǎn)擊按鈕獲取輸入框的內(nèi)容。然后使用 ipcRenderer 發(fā)送消息。主進(jìn)程接收到消息并處理之后,會(huì)返回處理結(jié)果。所以渲染進(jìn)程中還需要接收主進(jìn)程的消息。
修改 index.html,添加下面的代碼:
接下來在主進(jìn)程中接收渲染進(jìn)程的消息,并進(jìn)行處理(翻轉(zhuǎn)字符串),然后將處理結(jié)果發(fā)送給主進(jìn)程。修改 main.js 如下:
//... // 監(jiān)聽渲染進(jìn)程發(fā)送的消息 ipcMain.on("asynchronous-message", (event, arg) => { const reply = arg.split("").reverse().join(""); console.log("reply: ", reply); // 發(fā)送消息到主進(jìn)程 event.sender.send("asynchronous-reply", reply); });
然后重新運(yùn)行項(xiàng)目。在頁面的輸入框內(nèi)輸入字符,點(diǎn)擊按鈕,就能彈出如下的彈出框,說明渲染進(jìn)程與主進(jìn)程通信成功:
remoteremote 模塊提供了一種在渲染進(jìn)程(網(wǎng)頁)和主進(jìn)程之間進(jìn)行進(jìn)程間通訊(IPC)的簡便途徑。
使用 remote 模塊,我們可以很方便地調(diào)用主進(jìn)程對象的方法,而不需要發(fā)送消息。
在 index.html 的 標(biāo)簽中添加如下代碼:
// 引入 remote 模塊 var remote = require("electron").remote; // 獲取主進(jìn)程中的 BrowserWindow 對象 var BrowserWindow = remote.BrowserWindow; // 創(chuàng)建一個(gè)渲染進(jìn)程 var win = new BrowserWindow({ width: 200, height: 150 }); win.loadURL("http://nodejh.com");
然后使用 ctr + r 組合鍵刷新應(yīng)用,就會(huì)看到創(chuàng)建出的一個(gè)新窗口。
打包Electron 應(yīng)用開發(fā)完成之后,還需要將其打包成對應(yīng)平臺(tái)的客戶端。常用的打包工具有 electron-packager 和 asar。
這里以 electron-packager 為例。首先全局安裝 electron-packager:
$ npm install electron-packager -g
然后在項(xiàng)目中安裝 electron:
$ npm install electron --save-dev
然后打包:
$ electron-packager . electron-demo總結(jié)
本文首先對 electron 做了簡單的介紹,然后講解了 electron 進(jìn)程的概念,其進(jìn)程包括主進(jìn)程和渲染進(jìn)程。然后創(chuàng)建了一個(gè)簡單的 electron 應(yīng)用,并通過實(shí)現(xiàn)一個(gè)簡單的應(yīng)用場景,對 electron 進(jìn)程間的通信做了實(shí)踐??傮w來說,使用 electron 創(chuàng)建桌面客戶端的開發(fā)體驗(yàn)跟寫 Node.js 和網(wǎng)頁差不多。但本文對內(nèi)置模塊比如 app、ipcMain、ipcRender、remote 等的介紹比較粗淺,涉及到一些內(nèi)置模塊的使用,還需要繼續(xù)查詢 electron 的官方文檔,只有實(shí)踐越多,才能越熟悉。
https://github.com/nodejh/nodejh.github.io/issues/39
--
https://github.com/nodejh/electron-quick-start
electron/electron
electron中文教程
Electron 中文文檔
Electron開發(fā)桌面應(yīng)用
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/83896.html
摘要:快速入門提供了豐富的本地操作系統(tǒng)的,使你能夠使用純來創(chuàng)建桌面應(yīng)用程序。這并不意味著是一個(gè)綁定圖形用戶界面的庫。每個(gè)頁面在里是運(yùn)行在自己的進(jìn)程里,這些進(jìn)程被稱為渲染進(jìn)程。有些只能在該事件發(fā)生后才能被使用。 快速入門 Electron提供了豐富的本地(操作系統(tǒng))的API,使你能夠使用純JavaScript來創(chuàng)建桌面應(yīng)用程序。與其它各種的Node.js運(yùn)行時(shí)不同的是Electron專注于桌面...
electronjs 是什么?可以用javascript寫,windows / mac / linux 界面程序的開發(fā)框架。參看:https://electronjs.org/ https://electronjs.org/docs 快速開始必備的條件: nodejs的安裝 git git clone https://github.com/electron/e...cd electron-q...
electronjs 是什么?可以用javascript寫,windows / mac / linux 界面程序的開發(fā)框架。參看:https://electronjs.org/ https://electronjs.org/docs 快速開始必備的條件: nodejs的安裝 git git clone https://github.com/electron/e...cd electron-q...
摘要:一份開發(fā)者必備的技能清單,請查收。入門查漏補(bǔ)缺深入學(xué)習(xí)查看原圖下載源文件使用快速上手,并了解其中的概念。官方教程入門教程小書文章精讀,問題解答。 一份react開發(fā)者必備的技能清單,請查收。入門、查漏補(bǔ)缺、深入學(xué)習(xí)... showImg(https://segmentfault.com/img/remote/1460000018000950?w=1965&h=3332); 查看原圖 ...
摘要:本文主要講解的入門。可以幫助我們管理包的下載依賴部署發(fā)布等。可以認(rèn)為是中的。后續(xù)使用中,全部替換為即可。命令根據(jù)它,自動(dòng)下載所需模塊用于創(chuàng)建窗口和處理系統(tǒng)事件安裝包的位置。 Electron是什么 可以認(rèn)為Electron是一種運(yùn)行環(huán)境庫,我們可以基于此,用HTML、JS和CSS寫桌面應(yīng)用。PC端的UI交互,主要有web應(yīng)用和桌面應(yīng)用。具體采用哪種方式,主要看系統(tǒng)的應(yīng)用場景,哪個(gè)更合適...
閱讀 1771·2021-09-24 10:38
閱讀 1591·2021-09-22 15:15
閱讀 3149·2021-09-09 09:33
閱讀 970·2019-08-30 11:08
閱讀 716·2019-08-30 10:52
閱讀 1342·2019-08-30 10:52
閱讀 2421·2019-08-28 18:01
閱讀 616·2019-08-28 17:55