electron应用实现热更新

之前介绍过在electron-builder打包基础下怎么使用electron-updater实现应用自动监测版本以及更新的,现在来记录一下怎么实现 热更新

electron应用热更新具体实现流程图
image.png

正常执行electron-builder进行打包,打包完成后将win-ia32-unpacked\resources下的文件压缩成latest.zip文件(注意:压缩时需要选中三个文件压缩,而非压缩三个文件的上级文件夹,推荐使用mac电脑压缩),上传到服务器;客户端每次重启执行一次检测更新,比较本地与远程服务器的版本,如有最新版本,则下载zip包,通过Node fs模块写入本地,解压覆盖到本地resources下文件,重启app完成更新;

image.png
image.png
electron应用热更新具体实现步骤

1、 在渲染进程引入ipcRenderer,监听从主进程传过来的更新事件,应用启动后在渲染进程调用接口比对服务器最新资源版本和本地资源版本是否一致,若不一致则向主进程触发资源热更新函数。

ipcRenderer.send('upgrading', url + 'latest.zip') // 用来触发热更新函数

2、 在主进程模块下添加 upgrade.js主要处理更新资源的下载和替换,并将资源更新进度发送给渲染进程进行渲染,让进度可视化。

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)  // 通知渲染进程更新资源下载进度
    } 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') // 通知渲染进程更新资源下载完成
      } catch (err) {
        errorFn('AdmZip', err)
        global.mainWindow.webContents.send('hot-updata-error') // 通知渲染进程更新资源下载错误
      }
    } else if (state === 'error') {
      errorFn('hot-updata-downloadFile', 'stream error' + data)
      global.mainWindow.webContents.send('hot-updata-error')
    }
  })
}
/*
 * url 网络文件地址
 * dest 文件存储位置
 * cb 回调函数
 */
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
    }
    // 进度
    const len = parseInt(res.headers['content-length']) // 文件总长度
    let cur = 0
    const total = (len / 1048576).toFixed(2) // 转为M 1048576 - bytes in  1Megabyte
    res.on('data', function (chunk) {
      cur += chunk.length
      const progress = (100.0 * cur / len).toFixed(2) // 当前下载进度百分比
      const currProgress = (cur / 1048576).toFixed(2) // 当前下载大小
      console.log(progress, currProgress, total)
      cb('progress', progress)
    })
    res.on('end', () => {
      cb('Download completed')
    })
    // 超时,结束等
    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、 在主进程main.js文件中引入 ipcMain,监听资源热更新函数upgrading,触发upgrade.js中的upgradeFn函数

 // 监听热更新
  ipcMain.on('upgrading', (evt, url) => {
    upgradeFn(url)
  })

4、在渲染进程中添加热更新事件的监听,获取资源下载进度,在这一步实现可视化效果

if (isElectron()) {
    // 热更新下载进度
    ipcRenderer.on('hotDownloadProgress', (event, percent) => {
    })
   // 资源替换完成,重启app完成更新
    ipcRenderer.on('isUpdateHotNow', (event) => {
      ipcRenderer.send('appRelaunch')  
    })
    // 热更新失败
    ipcRenderer.on('hot-updata-error', (event) => {
    })
  }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容