桌面端跨平台解決方案之Electron簡介與快速上手


 

本文涉及到的概念會很多,為了控制篇幅,這里更多的是拋磚引玉,更多資料需要大家到參考資料中自行補充相關知識概念。

Electron簡介

Electron(最初名為Atom Shell)是GitHub開發的一個開源框架。它允許使用Node.js(作為后端)和Chromium[^chromium](作為前端)完成桌面GUI應用程序的開發。Electron現已被多個開源Web應用程序用於前端與后端的開發,著名項目包括GitHub的Atom和微軟的Visual Studio Code。

Electron是一個由GitHub開發的開源庫,通過將Chromium和Node.js組合並使用HTML,CSS和JavaScript進行構建Mac,Windows,和Linux跨平台桌面應用程序.

這不意味着 Electron 是綁定了 GUI 庫的 JavaScript。相反,Electron 使用 web 頁面作為它的 GUI,所以你可以把它看作成一個被 JavaScript 控制的,精簡版的 Chromium 瀏覽器。

Chromium

  • 楓樹瀏覽器是一個基於Chromium的Windows/Linux瀏覽器。新增了部分功能,如鼠標手勢,鏈接拖動及IE標簽。(最后一次更新於2013-08-29,基帶版本27.0.1453.110[11])
  • 世界之窗瀏覽器極速版(TheWorld Chrome版)
  • 搜狗高速瀏覽器:基於Chromium開發,同時加入了IE內核引擎。
  • 360瀏覽器極速版:基於Chromium開發,同時加入了IE內核引擎。
  • 獵豹瀏覽器:基於Chromium開發,同時加入了IE內核引擎。
  • 傲游瀏覽器:基於Chromium開發,同時加入了IE內核引擎。
  • 七星瀏覽器:基於Chromium開發,同時加入了IE核心引擎。外觀和楓樹瀏覽器類似。
  • QQ瀏覽器:基於Chromium開發,針對IE內核優化。
  • 百度瀏覽器:基於Chromium開發。

Node.js

Node.js 是一個基於 Chrome V8 引擎的 JavaScript 運行環境。

Node.js 使用了一個事件驅動、非阻塞式 I/O 的模型,使其輕量又高效。

Node.js 的包管理器 npm,是全球最大的開源庫生態系統。

為什么選擇 Electron

Electron提供了一個Nodejs的運行時,專注於構建桌面應用,同時使用web頁面來作為應用的GUI,你可以將其看作是一個由JavaScript控制的迷你版的Chromium瀏覽器。

夠火(5w+ star)。Electron 的作者和 NW.js(原 node-webkit)是同一人,大家可以去知乎圍觀維護一個大型開源項目是怎樣的體驗?這個問題下作者的回答。官方也有 Electron 和 NW.js 的對比

作者先是在Intel工作開發維護node-webkit(后改名NW.js),之后加入GitHub開發Atom編輯器,編寫了一個新的桌面應用框架,當時的名稱叫做atom-shell,之后開源,而后改名Electron


Electron基礎概念

主進程和渲染進程

Electron 中,入口是一個 js 文件,運行這個入口文件(通常會是 package.json 里的 main 腳本)的進程稱作主進程,在主進程使用 BrowserWindow 模塊可以創建並管理 web 頁面,也就是應用的 GUI。

const {BrowserWindow} = require('electron')
// 主進程創建web頁面
let someWindow = new BrowserWindow(winOpts)
// 加載本地的文件
someWindow.loadURL('file://' + __dirname + '/index.html')

在主進程創建的一個個web頁面也都運行着自己的進程,即渲染進程,渲染進程各自獨立,各自管理自己的頁面,可以想象是瀏覽器一個個的 tab。

    • 主進程
      • 整體控制
      • 全局快捷鍵
      • 屏幕
      • 窗口
      • 菜單項
      • 系統托盤
      • 從主進程到渲染進程的異步通信
      • 創建和控制視圖
      • 等等

  • 渲染進程
    • 頁面渲染
    • webview標簽
    • 渲染進程與主進程通信
    • 從渲染進程到主進程的異步通信
    • 子窗口
    • 捕獲桌面資源

進程間通信

Web 頁面因為安全限制,不能直接訪問原生的GUI資源(比如dialog、電源監控),Electron 中也是一樣,渲染進程如果想要進行原生的GUI操作,就必須和主進程通訊,請求相應的GUI操作

  • ipcMain和ipcRenderer
    // 渲染進程中 const {ipcRenderer} = require('electron') ipcRender.send('somemsg', data); ipcRender.on('replaymsg', (evt, otherData) => { console.log(otherData) }) // 主進程中 const {ipcMain} = require('electron') ipcMain.on('somemsg', (evt, data) => { console.log(data) evt.sender.send('replymsg', otherData); });
  • 直接在渲染進程使用remote模塊,remote 模塊可以直接獲取主進程中的模塊。這種方式其實是第一種方式的簡化。
    // 在渲染進程打開提示對話框 const {dialog} = require('electron').remote dialog.showMessageBox({ opts });
  • 主進程向渲染進程發送消息
    this.webviewWindow.webContents.send('ping');
  • 渲染進程之間的通信
    如果數據不需要實時性,只是渲染進程之間數據的共享,那么使用官方的建議即可:How to share data between web pages?。如果要求實時性,需要配合前幾種種方式實現。
    // 主進程 // 兩個窗口互相獲取對方的窗口 id, 並發送給渲染進程 win1.webContents.send('distributeIds',{ win2Id : win2.id }); win2.webContents.send('distributeIds',{ win1Id : win1.id }); // 渲染進程 // 通過 id 得到窗口 remote.BrowserWindow.fromId(win2Id).webContents.send('someMsg', 'someThing');
  • Vue event bus
    src/renderer/bus.js
    ``` import Vue from 'vue'
    export default new Vue() ```
    src/renderer/tray.js
    ``` import bus from './bus' import { remote } from 'electron'
    const tray = new remote.Tray(remote.clipboard.readImage()) const menu = remote.Menu.buildFromTemplate([ { label: 'ping', click () { // Send event to Vue bus.$emit('ping') } } ])
    tray.setToolTip('hello world') tray.setContextMenu(menu) ```
    SomeComponent.vue
    import bus from '@/bus' /* ... */ mounted () { bus.$on('ping', () => { // event logic console.log('pong') }) } /* ... */

簡要總結下 Electron 的優缺點:

優點:

  • 可以用 Web 前端技術開發跨平台的桌面客戶端
  • 可以從 Node 的生態獲得極大的助力
  • 文檔豐富,社區活躍

缺點:

  • 包大,因為集成了 chromium
  • 不支持xp

Electron Quick Start

git clone https://github.com/electron/electron-quick-start
cd electron-quick-start
npm install
npm start

打包發布

  • mac
    electron-packager ./ --platform=mas --arch=x64

Electron & Vue全家桶 快速搭建

# 安裝 vue-cli 和 腳手架樣板代碼
npm install -g vue-cli
vue init simulatedgreg/electron-vue my-project

# 安裝依賴並運行你的程序
cd my-project
yarn # 或者 npm install
yarn run dev # 或者 npm run dev

vue-electron模板


技術棧

Vue

Vue (讀音 /vjuː/,類似於 view) 是一套用於構建用戶界面的漸進式框架。與其它大型框架不同的是,Vue 被設計為可以自底向上逐層應用。Vue 的核心庫只關注視圖層,不僅易於上手,還便於與第三方庫或既有項目整合。另一方面,當與現代化的工具鏈以及各種支持類庫結合使用時,Vue 也完全能夠為復雜的單頁應用提供驅動。

  • 生命周期圖示

 

vuex

Vuex 是一個專為 Vue.js 應用程序開發的狀態管理模式。它采用集中式存儲管理應用的所有組件的狀態,並以相應的規則保證狀態以一種可預測的方式發生變化。Vuex 也集成到 Vue 的官方調試工具 devtools extension,提供了諸如零配置的 time-travel 調試、狀態快照導入導出等高級調試功能。

axios

axios 是一個基於Promise 用於瀏覽器和 nodejs 的 HTTP 客戶端


Demo演示

運用Electron和一些開源Api做了一個簡單的demo,可以查看幣市行情,體驗堪比原生般順滑。

 

參考資料


備注

[^chromium]: Chromium是一個由Google主導開發的網頁瀏覽器,以BSD許可證等多重自由版權發行並開放源代碼。是Google為發展自家的瀏覽器Google Chrome而打開的項目,所以Chromium相當於Google Chrome的工程版或實驗版(盡管Google Chrome本身也有β版),新功能會率先在Chromium上開放,待驗證后才會應用在Google Chrome上,故Google Chrome的功能會相對落后但較穩定。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM