摘要:目前類似的工具有,等。在渲染進程中,直接調(diào)用原生的接口是十分危險的。這里介紹一種,通過和對象,以消息的方式進行通信。主進程獲得消息后,通過返回信息。另外,還提供了一種同步的消息傳遞方式。打包完成功能代碼后,我們需要將代碼打成可運行的包。
介紹
目前,使用前端技術開發(fā)桌面應用已經(jīng)越來越成熟,這使得前端同學也可以參與桌面應用的開發(fā)。目前類似的工具有electron,NW.js等。這里我們著重介紹下electron。
electron開發(fā)electron是基于Node.js和Chromium做的一個工具。electron是的可以使用前端技術實現(xiàn)桌面開發(fā),并且支持多平臺運行。下面來講下如何使用electron開發(fā)桌面app。
hello world一個最簡單的electron項目包含三個文件, package.json, index.html, main.js。
package.json是Node.js項目的配置文件,index.html是桌面應用的界面頁面,main.js是應用的啟動入口文件。其中,核心的文件是inde.html和main.js,下面來講下這兩個文件的細節(jié)。
index.html是應用的展示界面,代碼如下:
Hello World! Hello World!
We are using node , Chrome , and Electron .
main.js是electron應用的入口文件。主要用戶啟動electron的界面。可以通過以下代碼來啟動electron界面。
const electron = require("electron"); const { app } = electron; const { BrowserWindow } = electron; let win; function createWindow() { // 創(chuàng)建窗口并加載頁面 win = new BrowserWindow({width: 800, height: 600}); win.loadURL(`file://${__dirname}/index.html`); // 打開窗口的調(diào)試工具 win.webContents.openDevTools(); // 窗口關閉的監(jiān)聽 win.on("closed", () => { win = null; }); } app.on("ready", createWindow); app.on("window-all-closed", () => { if (process.platform !== "darwin") { app.quit(); } }); app.on("activate", () => { if (win === null) { createWindow(); } });
上面的代碼就實現(xiàn)了一個hello world的electron應用。代碼寫完后,需要運行代碼看看效果,這個時候需要使用electron-prubuilt來運行代碼。
首先,我們需要安裝electron-prubuilt包。可以通過命令npm install --saved-dev electron-prebuilt進行安裝。安裝完成后,項目本地就可以使用electron命令,直接運行命令electron .就可以看到hello world的效果。或者可以在package.json中設置scripts,方便項目的運行。
具體代碼可以去這里獲取。
electron中,由package.json中的main.js運行出來的進程為主進程(Main Process)。主進程用于創(chuàng)建GUI界面以便web頁面的展示。electron由Chromium負責頁面的顯示,所以當創(chuàng)建一個頁面時,就會對應的創(chuàng)建渲染進程(Renderer Process)。
主進程通過創(chuàng)建BrowserWindow對象來創(chuàng)建web顯示頁面,BrowserWindow運行在他自己的渲染進程中。當BrowserWindow被銷毀時,對應的渲染進程也會終止。
在渲染進程中,直接調(diào)用原生的GUI接口是十分危險的。如果你想在渲染進程中使用原生的GUI的功能,需要讓渲染進程與主進程進行通信,再由主進程去調(diào)用對應接口。那么主進程和渲染進程是如何進行通信的呢?
electron中,主進程與渲染進程的通信存在多種方法。這里介紹一種,通過ipcMain和ipcRenderer對象,以消息的方式進行通信。
先來看下主進程如何向渲染進程發(fā)信息。
首先,渲染進程通過接口ipcRenderer.on()來監(jiān)聽主進程的消息信息。主進程通過接口BrowserWindow.webContents.send()向所有渲染進程發(fā)送消息。相關代碼如下:
// renderer.js // 引入ipcRenderer對象 const electron = require("electron"); const ipcRenderer = electron.ipcRenderer; // 設置監(jiān)聽 ipcRenderer.on("main-process-messages", (event, message) => { console.log("message from Main Process: " , message); // Prints Main Process Message. }); // main.js // 當頁面加載完成時,會觸發(fā)`did-finish-load`事件。 win.webContents.on("did-finish-load", () => { win.webContents.send("main-process-messages", "webContents event "did-finish-load" called"); });
那么渲染進程需要給主進程發(fā)生消息該如何做呢?
// renderer.js ipcRenderer.on("asynchronous-reply", (event, arg) => { console.log("asynchronous-reply: %O %O", event, arg); }); ipcRenderer.send("asynchronous-message", "hello"); // main.js ipcMain.on("asynchronous-message", (event, arg) => { // 返回消息 event.sender.send("asynchronous-reply", "ok"); });
上面的代碼是異步監(jiān)聽過程。 主進程設置好監(jiān)聽,渲染進程通過ipcRenderer.send()發(fā)送消息。主進程獲得消息后,通過event.sender.send()返回信息。返回信息也是異步的,所以渲染進程也設置了監(jiān)聽。
另外,electron還提供了一種同步的消息傳遞方式。代碼如下:
// renderer.js console.log("synchronous-message: ", ipcRenderer.sendSync("synchronous-message", "hello")); // main.js ipcMain.on("synchronous-message", (event, arg) => { event.returnValue = "ok"; });
主進程與渲染進程相互傳遞數(shù)據(jù)的例子可以去這里獲取。
調(diào)試一個app的開發(fā)過程,會用到代碼調(diào)試,那么electron應該如何進行調(diào)試呢?
electron中,渲染進程因為是Chromium的頁面,所以可以使用DevTools進行調(diào)試。啟動DevTools的方式是:在main.js中,創(chuàng)建好BrowserWindow后,通過接口BrowserWindow.webContents.openDevTools();來打開頁面的DevTools調(diào)試工具,進行頁面調(diào)試,具體的調(diào)試方法和使用Chrome進行調(diào)試一致。
主進程是基于Node.js的,所以electron的調(diào)試和Node.js類似。這里說下在VS Code中如何進行electron主進程的調(diào)試。
第一步,設置VS Code的tasks,用于啟動electron。相關配置如下:
{ // See https://go.microsoft.com/fwlink/?LinkId=733558 // for the documentation about the tasks.json format "version": "0.1.0", "command": "electron", "isShellCommand": true, "showOutput": "always", "suppressTaskName": true, "args": ["--debug=5858", "."] }
其中,--debug=5858是用于調(diào)試Node.js的端口。
第二步,設置VS Code項目的調(diào)試配置。可以生成launch.json,內(nèi)容如下:
{ "version": "0.2.0", "configurations": [ { "name": "Attach", "type": "node", "address": "localhost", "port": 5858, "request": "attach" } ] }
其中的port:5858的端口信息需要和上面的--debug=5858端口保持一致。
配置完成后,便可以開始調(diào)試主進程。
首先啟動electron項目。
因為上面配置了task,所以可以使用VS Code的task進行啟動。按下快捷鍵shift + command + p可以啟動命令,輸入task electron命令,回車,就可以運行electron的task進行項目的啟動。
項目啟動后,再開始設置主進程代碼的斷點。在VS Code的調(diào)試界面中設置斷點,并點擊運行。這個時候,操作啟動的electron應用,當運行到斷點所在代碼時,就可以觸發(fā)斷點調(diào)試。
electron除了使用前端技術實現(xiàn)界面展示的功能外,還提供了大量的桌面環(huán)境接口。比如支持Notification,Jump List, dock menu等。具體支持哪些桌面接口以及如何使用,可以去http://electron.atom.io/docs/... 了解。
打包完成功能代碼后,我們需要將代碼打成可運行的包。可以使用electron-packager來進行應用打包,electron-packager支持windows, Mac, linux等系統(tǒng)。具體介紹可以去https://github.com/electron-u... 了解。
打包的步驟很簡單,只需要兩步:
全局安裝Node.js模塊electron-packager。
運行命令: electron-packager
需要注意,打包后,代碼中的所有路徑都必須使用絕對路徑,通過${__dirname}獲得app的根路徑,然后拼接成絕對路徑。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/91650.html
摘要:首發(fā)于酷家樂前端博客標題是我以第一視角基于開發(fā)客戶端產(chǎn)品的體驗,我將在之后分一系列文章向有興趣的朋友一步一步介紹我是怎么從玩玩具的心態(tài)開始接觸到去開發(fā)客戶端產(chǎn)品,最后隨著業(yè)務和功能的復雜度提升再不斷地優(yōu)化客戶端。 首發(fā)于酷家樂前端博客 標題是我以第一視角基于 Electron 開發(fā)客戶端產(chǎn)品的體驗,我將在之后分一系列文章向有興趣的朋友一步一步介紹我是怎么從玩玩具的心態(tài)開始接觸 Ele...
摘要:快速入門提供了豐富的本地操作系統(tǒng)的,使你能夠使用純來創(chuàng)建桌面應用程序。這并不意味著是一個綁定圖形用戶界面的庫。每個頁面在里是運行在自己的進程里,這些進程被稱為渲染進程。有些只能在該事件發(fā)生后才能被使用。 快速入門 Electron提供了豐富的本地(操作系統(tǒng))的API,使你能夠使用純JavaScript來創(chuàng)建桌面應用程序。與其它各種的Node.js運行時不同的是Electron專注于桌面...
摘要:本文主要講解的入門。可以幫助我們管理包的下載依賴部署發(fā)布等。可以認為是中的。后續(xù)使用中,全部替換為即可。命令根據(jù)它,自動下載所需模塊用于創(chuàng)建窗口和處理系統(tǒng)事件安裝包的位置。 Electron是什么 可以認為Electron是一種運行環(huán)境庫,我們可以基于此,用HTML、JS和CSS寫桌面應用。PC端的UI交互,主要有web應用和桌面應用。具體采用哪種方式,主要看系統(tǒng)的應用場景,哪個更合適...
摘要:本節(jié)目標你可以在分鐘內(nèi)開始運行一個最簡單。是一個能幫你用來寫桌面程序的項目。原先是為打造的,后來直接演化成兄弟項目。現(xiàn)在已經(jīng)有很多大廠也開始使用來寫桌面了。全局安裝,因為我們要用到它的命令行。完美天才第一步,達成 本節(jié)目標:你可以在10分鐘內(nèi)開始運行一個最簡單electron app。不要考慮太多的概念,直接復制粘貼開始吧。 Electron是一個能幫你用JS來寫桌面程序的node項目...
摘要:當一個實例被銷毀后,相應的渲染進程也會被終止。之所以命名為,主要是為了與主進程這個概念對應。部分在事件觸發(fā)后才能使用。當全部窗口關閉時退出。主進程接收到消息并處理之后,會返回處理結(jié)果。 簡介 Electron 是一個可以使用 Web 技術如 JavaScript、HTML 和 CSS 來創(chuàng)建跨平臺原生桌面應用的框架。借助 Electron,我們可以使用純 JavaScript 來調(diào)用豐...
閱讀 2252·2021-11-22 09:34
閱讀 2021·2021-09-22 15:22
閱讀 2021·2019-08-29 15:05
閱讀 2110·2019-08-26 10:43
閱讀 3411·2019-08-26 10:26
閱讀 886·2019-08-23 18:29
閱讀 3521·2019-08-23 16:42
閱讀 2001·2019-08-23 14:46