Electron
Electron是由Github開發(fā)弥鹦,用HTML惶凝,CSS和JavaScript來(lái)構(gòu)建跨平臺(tái)桌面應(yīng)用程序的一個(gè)開源庫(kù)。 Electron通過(guò)將Chromium和Node.js合并到同一個(gè)運(yùn)行時(shí)環(huán)境中,并將其打包為Mac玷犹,Windows和Linux系統(tǒng)下的應(yīng)用來(lái)實(shí)現(xiàn)這一目的歹颓。
特點(diǎn):
- 上手簡(jiǎn)單:只要會(huì)前端的知識(shí)就可以做桌面應(yīng)用
- 跨平臺(tái):Mac,Linux领跛,Windows
- 自動(dòng)更新
創(chuàng)建項(xiàng)目
全局安裝 electron
npm install -g electron
// 推薦使用 cnpm 進(jìn)行安裝
cnpm install -g electron
創(chuàng)建項(xiàng)目的三種方式
通過(guò) git 克隆項(xiàng)目
- 克隆這倉(cāng)庫(kù)
git clone https://github.com/electron/electron-quick-start
- 進(jìn)入倉(cāng)庫(kù)
cd electron-quick-start
- 安裝依賴庫(kù)
npm install
- 運(yùn)行應(yīng)用
npm start
通過(guò) electron-forge 創(chuàng)建項(xiàng)目
electron-forge 相當(dāng)于 electron 的一個(gè)腳手架吠昭,可以讓我們更方便的創(chuàng)建矢棚、運(yùn)行和打包 electron 項(xiàng)目府喳。
- 全局安裝 electron-forge
npm install -g electron-forge
- 創(chuàng)建項(xiàng)目
electron-forge init my-app
- 進(jìn)入項(xiàng)目文件
cd my-app
- 運(yùn)行項(xiàng)目
npm start
手動(dòng)創(chuàng)建項(xiàng)目
- 新建一個(gè)文件夾
- 新建一個(gè) index.html 和 index.js
- npm init 生成一個(gè) package.json, 注意的是 package.json 里面配置的 main 必須是入口 js (主進(jìn)程)
- 執(zhí)行 electron . 運(yùn)行項(xiàng)目
// main.js 主進(jìn)程文件
const electron = require('electron')
const app = electron.app
const BrowserWindow = electron.BrowserWindow
const path = require("path")
// 變量 保存對(duì)應(yīng)窗口的引用
let mainWindow;
app.on('ready', function() {
// 創(chuàng)建 BrowserWindow 的實(shí)例钝满,賦值給 mainWindow 打開窗口
// 軟件默認(rèn)打開的寬度和高度 { width: 800, height: 600 }
mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
// 重要:該屬性讓渲染進(jìn)程也擁有使用 node 的能力
nodeIntegration: true
}
})
// 開啟渲染進(jìn)程中的調(diào)試模式
mainWindow.webContents.openDevTools()
// 把 index.html 加載到窗口里面
// mainWindow.loadFile('index.html')
mainWindow.loadURL(path.join('file:', __dirname, 'index.html'))
mainWindow.on('closed', () => {
mainWindow = null
})
})
Electron 主進(jìn)程和渲染進(jìn)程
主進(jìn)程里面可以直接拿到的東西耕腾,在渲染進(jìn)程中需從 remote 中獲取
// 例如:需要獲取到 net
// 主進(jìn)程
const { new } = require("electron")
// 渲染進(jìn)程
const { new } = require("electron").remote
Electron 運(yùn)行 package.json 的 main 腳本的進(jìn)程被稱為主進(jìn)程距糖。在主進(jìn)程中運(yùn)行的腳本通過(guò)創(chuàng)建 web 頁(yè)面來(lái)展示用戶界面悍引。一個(gè) Electron 應(yīng)用總是有且只有一個(gè)主進(jìn)程趣斤。
由于 Electron 使用了 chromium(谷歌瀏覽器)來(lái)展示 web 頁(yè)面,所以 Chromium 的多進(jìn)程架構(gòu)也被使用到了浓领,每個(gè) Electron 中的 web 頁(yè)面運(yùn)行在他自己的渲染進(jìn)程中。
主進(jìn)程使用 BrowserWindow 實(shí)例創(chuàng)建頁(yè)面漫仆。每個(gè) BrowserWindow 實(shí)例都是在自己的渲染進(jìn)程里運(yùn)行頁(yè)面盲厌。當(dāng)一個(gè) BrowserWindow 實(shí)例被銷毀后祸泪,響應(yīng)的渲染進(jìn)程也會(huì)被終止。
進(jìn)程:進(jìn)程(Process)是計(jì)算機(jī)中的程序關(guān)于某數(shù)據(jù)集合上的一次運(yùn)行活動(dòng)懂扼,是系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位阀湿,是操作系統(tǒng)結(jié)構(gòu)的基礎(chǔ)品嚣。
線程:在一個(gè)程序里的一個(gè)執(zhí)行路程就叫做線程(thread)。更準(zhǔn)確的定義是:線程是 “一個(gè)進(jìn)程內(nèi)部的控制序列”罩旋。
Electron 渲染進(jìn)程中通過(guò) Node.js 讀取本地文件
在普通的瀏覽器中涨醋,web 頁(yè)面通常在一個(gè)沙盒環(huán)境中運(yùn)行浴骂,不被允許去接觸原生的資源宪潮。然而 Electron 的用戶在 Node.js 的 API 支持下可以在頁(yè)面中和操作系統(tǒng)進(jìn)行一些底層交互。
Node.js 在主進(jìn)程和渲染進(jìn)程中都可以使用梯轻。渲染進(jìn)程因?yàn)榘踩拗圃簦荒苤苯硬僮髟?GUI。雖然如此单绑,因此集成了 Node.js搂橙,渲染進(jìn)程也有了操作系統(tǒng)底層 API 的能力,Node.js 中常用的 path份氧、fs弯屈、crypto 等模塊在 Electron 可以直接使用资厉,方便我們處理鏈接蔬顾、路徑诀豁、文件、MD5等娩践,同時(shí) npm 還有成千上萬(wàn)的模塊供我們選擇翻伺。
const fs = require('fs')
const content = document.getElementById('content')
const button = document.getElementById('button')
button.addEventListener('click', (e) => {
fs.readFile('package.json', 'utf8', (e) => {
content.textContent = data;
})
})
常用事件
app 常用事件
- ready:當(dāng) Electron 完成初始化時(shí)被觸發(fā)
- window-all-closed:所有窗口被關(guān)閉時(shí)觸發(fā)
- before-quit:在應(yīng)用程序開始關(guān)閉窗口之前觸發(fā)
- will-quit:當(dāng)所有窗口都已經(jīng)關(guān)閉并且應(yīng)用程序?qū)⑼顺鰰r(shí)觸發(fā)
- quit:在應(yīng)用程序退出時(shí)觸發(fā)
webContent 常用事件
- did-finish-load:導(dǎo)航完成時(shí)觸發(fā)吨岭,即選項(xiàng)卡的旋轉(zhuǎn)器將停止旋轉(zhuǎn)峦树,并派發(fā) onload 事件后魁巩。
- dom-ready:一個(gè)框架中的文本加載完成后觸發(fā)該事件