如何用Web前端技術(shù)就能開發(fā)出桌面應(yīng)用程序?

Web前端技術(shù)開發(fā)桌面應(yīng)用的方式

  • CEF:用 Chromium&Webkit 來呈現(xiàn) web 頁面矛缨,是客戶端里面嵌瀏覽器颗胡,瀏覽器里面跑網(wǎng)頁。
  • heX:基于CEF萄焦,內(nèi)部整合了開源項(xiàng)目 Chromium 及 node.js
  • nw:基于Chromium 和 node.js,利用 web 方式開發(fā)跨平臺(tái)桌面應(yīng)用的平臺(tái)技術(shù)拂封。
  • electron:底層也是基于Chromium 和 node.js茬射。
  • 等等。冒签。在抛。

案例實(shí)操~electron

electron 是 github 開發(fā)的,用來開發(fā)桌面應(yīng)用的一款前端框架

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-gHQ4XC8M-1601368852810)(https://imgkr.cn-bj.ufileos.com/5dcb1686-18db-41c0-9ce1-064c21afe33f.png)]

開發(fā)環(huán)境

安裝 node.js

nodejs下載地址

為了避免網(wǎng)絡(luò)問題對(duì) Node 工作時(shí)的影響萧恕,我們安裝國內(nèi)的 node 鏡像 cnpm刚梭。

npm install -g cnpm --registry=https://registry.npm.taobao.org

安裝 electron

npm install --save-dev electron

或者全局安裝

npm install -g electron

開發(fā)工具

VSCode

其實(shí) vscode 就是 electron 開發(fā)的

開發(fā)一個(gè)簡(jiǎn)易的 electron

Electron 應(yīng)用使用 JavaScript 開發(fā),其工作原理和方法與 Node.js 開發(fā)相同票唆。 electron 模塊包含了 Electron 提供的所有 API 和功能朴读,引入方法和普通 Node.js 模塊一樣:

const electron = require('electron')

electron 模塊所提供的功能都是通過命名空間暴露出來的。 比如說: electron.app負(fù)責(zé)管理 Electron 應(yīng)用程序的生命周期走趋, electron.BrowserWindow類負(fù)責(zé)創(chuàng)建窗口衅金。下面是一個(gè)簡(jiǎn)單的main.js文件,它將在應(yīng)用程序準(zhǔn)備就緒后打開一個(gè)窗口:

const { app, BrowserWindow } = require('electron')

function createWindow () {   
  // 創(chuàng)建瀏覽器窗口
  let win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      nodeIntegration: true
    }
  })

  // 加載index.html文件
  win.loadFile('index.html')
}

app.whenReady().then(createWindow)

創(chuàng)建你想展示的 index.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Hello World!</title>
    <!-- https://electronjs.org/docs/tutorial/security#csp-meta-tag -->
    <meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline';" />
  </head>
  <body>
    <h1>Hello World!</h1>
    We are using node <script>document.write(process.versions.node)</script>,
    Chrome <script>document.write(process.versions.chrome)</script>,
    and Electron <script>document.write(process.versions.electron)</script>.
  </body>
</html>

啟動(dòng)

我們?cè)?code>package.json中已經(jīng)寫好了啟動(dòng)命令簿煌,所以這里直接用 node 啟動(dòng)命令npm start就可以了氮唯,如果沒有配,也可以用electron .命令啟動(dòng)啦吧。

主進(jìn)程和渲染進(jìn)程

我們可以理解package.json中定義的入口文件就是主進(jìn)程您觉,那一般一個(gè)程序只有一個(gè)主進(jìn)程拙寡,而我們可以利用一個(gè)主進(jìn)程授滓,打開多個(gè)子窗口。

由于 Electron 使用了 Chromium 來展示 web 頁面肆糕,所以 Chromium 的多進(jìn)程架構(gòu)也被使用到般堆。每個(gè) Electron 中的 web 頁面運(yùn)行在它自己的渲染進(jìn)程中,也就是我們說的渲染進(jìn)程诚啃。

也就是說主進(jìn)程控制渲染進(jìn)程淮摔,一個(gè)主進(jìn)程可以控制多個(gè)渲染進(jìn)程。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-Ve9EmdUW-1601368852812)(https://imgkr.cn-bj.ufileos.com/5dcb1686-18db-41c0-9ce1-064c21afe33f.png)]

您應(yīng)當(dāng)在 main.js 中創(chuàng)建窗口始赎,并處理程序中可能遇到的所有系統(tǒng)事件和橙。下面我們將完善上述例子,添加以下功能:打開開發(fā)者工具造垛、處理窗口關(guān)閉事件魔招、在 macOS 用戶點(diǎn)擊 dock 上圖標(biāo)時(shí)重建窗口,添加后五辽,main. js 就像下面這樣:

const { app, BrowserWindow } = require('electron')

function createWindow () {   
  // 創(chuàng)建瀏覽器窗口
  const win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      nodeIntegration: true
    }
  })

  // 并且為你的應(yīng)用加載index.html
  win.loadFile('index.html')

  // 打開開發(fā)者工具
  win.webContents.openDevTools()
}

app.whenReady().then(createWindow)

// 當(dāng)所有窗口都關(guān)閉時(shí)觸發(fā)此事件.
app.on('window-all-closed', () => {
  // 在 macOS 上办斑,除非用戶用 Cmd + Q 確定地退出,
  // 否則絕大部分應(yīng)用及其菜單欄會(huì)保持激活。
  if (process.platform !== 'darwin') {
    app.quit()
  }
})

app.on('activate', () => {
  // 在macOS上乡翅,當(dāng)單擊dock圖標(biāo)并且沒有其他窗口打開時(shí)鳞疲,
  // 通常在應(yīng)用程序中重新創(chuàng)建一個(gè)窗口。
  if (BrowserWindow.getAllWindows().length === 0) {
    createWindow()
  }
})

// In this file you can include the rest of your app's specific main process
// code. 也可以拆分成幾個(gè)文件蠕蚜,然后用 require 導(dǎo)入尚洽。

git 上面的 demo 示例

# 克隆這倉庫
git clone https://github.com/electron/electron-quick-start
# 進(jìn)入倉庫
cd electron-quick-start
# 安裝依賴庫
npm install
# 運(yùn)行應(yīng)用
npm start

electron-forge 構(gòu)建項(xiàng)目

# 全局安裝electron-forge
npm install electron-forge -g

#用electron-forge初始化一個(gè)項(xiàng)目
electron-forge init demo02

# 進(jìn)入到項(xiàng)目目錄
cd demo02

#啟動(dòng)項(xiàng)目
npm start

擴(kuò)展~開發(fā)桌面百度

主進(jìn)程代碼

我們創(chuàng)建了主進(jìn)程對(duì)象 win 后,讓它直接加載百度的地址靶累。

const { app, BrowserWindow } = require('electron')

function createWindow () {   
  // 創(chuàng)建瀏覽器窗口
  let win = new BrowserWindow({
    width: 800,
    height: 800,
    webPreferences: {
      nodeIntegration: true
    }
  })

  // 加載index.html文件
//   win.loadFile('index.html')
  win.loadURL("http://www.baidu.com")
}

app.whenReady().then(createWindow)

打包發(fā)布

我們希望使用electron-packager對(duì)應(yīng)用進(jìn)行打包發(fā)布翎朱,electron-packager的安裝方式如下:

#下載electron-packager打包插件
npm install electron-packager -g
#開始打包
electron-packager ./ demo01 --win --out ./ --arch=x64 --app-version=0.0.1 --electron-version=8.2.5

我們還可以進(jìn)一步打包成可執(zhí)行文件

#下載windows系統(tǒng)可執(zhí)行文件打包插件
npm install -g electron-installer-windows
#開始打包
electron-installer-windows --src demo01-win32-x64 --dest ./
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市尺铣,隨后出現(xiàn)的幾起案子拴曲,更是在濱河造成了極大的恐慌,老刑警劉巖凛忿,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件澈灼,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡店溢,警方通過查閱死者的電腦和手機(jī)叁熔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來床牧,“玉大人荣回,你說我怎么就攤上這事「昕龋” “怎么了心软?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長著蛙。 經(jīng)常有香客問我删铃,道長,這世上最難降的妖魔是什么踏堡? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任猎唁,我火速辦了婚禮,結(jié)果婚禮上顷蟆,老公的妹妹穿的比我還像新娘诫隅。我一直安慰自己,他們只是感情好帐偎,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布逐纬。 她就那樣靜靜地躺著,像睡著了一般肮街。 火紅的嫁衣襯著肌膚如雪风题。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音沛硅,去河邊找鬼眼刃。 笑死,一個(gè)胖子當(dāng)著我的面吹牛摇肌,可吹牛的內(nèi)容都是我干的擂红。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼围小,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼昵骤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起肯适,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤变秦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后框舔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蹦玫,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年刘绣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了樱溉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡纬凤,死狀恐怖福贞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情停士,我是刑警寧澤挖帘,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站向瓷,受9級(jí)特大地震影響肠套,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜猖任,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瓷耙。 院中可真熱鬧朱躺,春花似錦、人聲如沸搁痛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鸡典。三九已至源请,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谁尸。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國打工舅踪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人良蛮。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓抽碌,卻偏偏與公主長得像,于是被迫代替她去往敵國和親决瞳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子货徙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354