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