electron應(yīng)用實(shí)現(xiàn)熱更新

之前介紹過在electron-builder打包基礎(chǔ)下怎么使用electron-updater實(shí)現(xiàn)應(yīng)用自動(dòng)監(jiān)測(cè)版本以及更新的拙吉,現(xiàn)在來記錄一下怎么實(shí)現(xiàn) 熱更新

electron應(yīng)用熱更新具體實(shí)現(xiàn)流程圖
image.png

正常執(zhí)行electron-builder進(jìn)行打包耘戚,打包完成后將win-ia32-unpacked\resources下的文件壓縮成latest.zip文件(注意:壓縮時(shí)需要選中三個(gè)文件壓縮蜓萄,而非壓縮三個(gè)文件的上級(jí)文件夾杀餐,推薦使用mac電腦壓縮)裙盾,上傳到服務(wù)器泄鹏;客戶端每次重啟執(zhí)行一次檢測(cè)更新郎任,比較本地與遠(yuǎn)程服務(wù)器的版本,如有最新版本命满,則下載zip包涝滴,通過Node fs模塊寫入本地,解壓覆蓋到本地resources下文件胶台,重啟app完成更新歼疮;

image.png
image.png
electron應(yīng)用熱更新具體實(shí)現(xiàn)步驟

1、 在渲染進(jìn)程引入ipcRenderer诈唬,監(jiān)聽從主進(jìn)程傳過來的更新事件韩脏,應(yīng)用啟動(dòng)后在渲染進(jìn)程調(diào)用接口比對(duì)服務(wù)器最新資源版本和本地資源版本是否一致,若不一致則向主進(jìn)程觸發(fā)資源熱更新函數(shù)铸磅。

ipcRenderer.send('upgrading', url + 'latest.zip') // 用來觸發(fā)熱更新函數(shù)

2赡矢、 在主進(jìn)程模塊下添加 upgrade.js主要處理更新資源的下載和替換杭朱,并將資源更新進(jìn)度發(fā)送給渲染進(jìn)程進(jìn)行渲染,讓進(jìn)度可視化吹散。

const path = require('path')
const http = require('http')
const fs = require('fs')
const dir = path.resolve(__dirname, '../')
var AdmZip = require('adm-zip')
const { beforeWriteAppLog } = require('./export.js')

const upgradeFn = function (appResourcesUrl) {
  var destUrl = `${dir}/latest.zip`
  downloadFile(appResourcesUrl, destUrl, (state, data) => {
    if (state === 'progress') {
      global.mainWindow.webContents.send('hotDownloadProgress', data)  // 通知渲染進(jìn)程更新資源下載進(jìn)度
    } else if (state === 'Download completed') {
    } else if (state === 'finish') {
      try {
        var zip = new AdmZip(destUrl)
        zip.getEntries()
        zip.extractAllTo(dir, true)
        deleteFile(destUrl)
        global.mainWindow.webContents.send('isUpdateHotNow') // 通知渲染進(jìn)程更新資源下載完成
      } catch (err) {
        errorFn('AdmZip', err)
        global.mainWindow.webContents.send('hot-updata-error') // 通知渲染進(jìn)程更新資源下載錯(cuò)誤
      }
    } else if (state === 'error') {
      errorFn('hot-updata-downloadFile', 'stream error' + data)
      global.mainWindow.webContents.send('hot-updata-error')
    }
  })
}
/*
 * url 網(wǎng)絡(luò)文件地址
 * dest 文件存儲(chǔ)位置
 * cb 回調(diào)函數(shù)
 */
const downloadFile = (url, dest, cb = () => {} ) => {
  const stream = fs.createWriteStream(dest)
  http.get(url, (res) => {
    if (res.statusCode !== 200) {
      cb('error', 'response.statusCode error:' + res.statusCode)
      return
    }
    // 進(jìn)度
    const len = parseInt(res.headers['content-length']) // 文件總長(zhǎng)度
    let cur = 0
    const total = (len / 1048576).toFixed(2) // 轉(zhuǎn)為M 1048576 - bytes in  1Megabyte
    res.on('data', function (chunk) {
      cur += chunk.length
      const progress = (100.0 * cur / len).toFixed(2) // 當(dāng)前下載進(jìn)度百分比
      const currProgress = (cur / 1048576).toFixed(2) // 當(dāng)前下載大小
      console.log(progress, currProgress, total)
      cb('progress', progress)
    })
    res.on('end', () => {
      cb('Download completed')
    })
    // 超時(shí),結(jié)束等
    stream.on('finish', () => {
      stream.close(cb('finish'))
    }).on('error', (err) => {
      deleteFile(dest)
      if (cb) cb('error', 'stream error:' + err.message)
    })
    res.pipe(stream)
  })
}
/*
 *  刪除文件
 */
function deleteFile (url) {
  fs.unlink(url, function (err) {
    if (err) {
      errorFn('deleteFile', JSON.stringify(err))
    }
  })
}

3弧械、 在主進(jìn)程main.js文件中引入 ipcMain,監(jiān)聽資源熱更新函數(shù)upgrading空民,觸發(fā)upgrade.js中的upgradeFn函數(shù)

 // 監(jiān)聽熱更新
  ipcMain.on('upgrading', (evt, url) => {
    upgradeFn(url)
  })

4刃唐、在渲染進(jìn)程中添加熱更新事件的監(jiān)聽,獲取資源下載進(jìn)度界轩,在這一步實(shí)現(xiàn)可視化效果

if (isElectron()) {
    // 熱更新下載進(jìn)度
    ipcRenderer.on('hotDownloadProgress', (event, percent) => {
    })
   // 資源替換完成画饥,重啟app完成更新
    ipcRenderer.on('isUpdateHotNow', (event) => {
      ipcRenderer.send('appRelaunch')  
    })
    // 熱更新失敗
    ipcRenderer.on('hot-updata-error', (event) => {
    })
  }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市浊猾,隨后出現(xiàn)的幾起案子抖甘,更是在濱河造成了極大的恐慌,老刑警劉巖葫慎,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件衔彻,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡偷办,警方通過查閱死者的電腦和手機(jī)米奸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來爽篷,“玉大人,你說我怎么就攤上這事慢睡≈鸸ぃ” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵漂辐,是天一觀的道長(zhǎng)泪喊。 經(jīng)常有香客問我,道長(zhǎng)髓涯,這世上最難降的妖魔是什么袒啼? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮纬纪,結(jié)果婚禮上蚓再,老公的妹妹穿的比我還像新娘。我一直安慰自己包各,他們只是感情好摘仅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著问畅,像睡著了一般娃属。 火紅的嫁衣襯著肌膚如雪六荒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天矾端,我揣著相機(jī)與錄音掏击,去河邊找鬼。 笑死秩铆,一個(gè)胖子當(dāng)著我的面吹牛砚亭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播豺旬,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼钠惩,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了族阅?” 一聲冷哼從身側(cè)響起篓跛,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎坦刀,沒想到半個(gè)月后愧沟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鲤遥,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年沐寺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盖奈。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡混坞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出钢坦,到底是詐尸還是另有隱情究孕,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布爹凹,位于F島的核電站厨诸,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏禾酱。R本人自食惡果不足惜微酬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望颤陶。 院中可真熱鬧颗管,春花似錦、人聲如沸滓走。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)闲坎。三九已至疫粥,卻和暖如春茬斧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背梗逮。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工项秉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人慷彤。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓娄蔼,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親底哗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子岁诉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容