美文网首页前端&优化我爱编程
Electron实现在线升级及功能的热更新

Electron实现在线升级及功能的热更新

作者: carymao | 来源:发表于2018-05-21 20:45 被阅读150次

背景:最近采用Electron改造公司的ERP客户端,由于界面功能较多,最终打包的文件有130M,更关键的问题是系统的更新比较频繁基本每月都会有一次版本的迭代更新。Electron虽然提供系统自动更新的功能,但采用的是整个系统文件全部替换的方式,如果更新文件较大,频率高,且用户体量较大的情况下采用Electron自带的系统更新功能显然不是很合适。

思路:Electron分为主进程和渲染进程,主进程的主要功能是使用BrowserWindow 实例创建页面,主进程管理所有的web页面和它们对应的渲染进程。可以这么理解无论我们的系统多么复杂、庞大,实际都是由当个单个独立的web页面组成的,每个页面对应着渲染进程。我们系统的功能的更新主要是针对渲染进程,本质上就是更新功能对应的web页面及其页面包含的图片、样式及实现业务功能的js文件。从主进程和渲染进程的用途着手,主进程主要负责调度各个渲染进程打开关闭,我们可以把这部分的功能进行整合转移通过ipcMain消息的方式把业务逻辑的实现转移到渲染进程中,这样我就能保证主进程的代码是不需要更新的。


实现过程:

1. 在主进程实现系统的热更新,访问远程服务端系统版本信息,返回当前系统的最新版本号及当前版本对应的升级文件和升级说明。服务端采用node.js实现,功能很简单实现返回版本信息及静态文件的下载

var express = require('express');

var app = express();

app.use(express.static('resource'));

var server = app.listen(92, function () {

var host = server.address().address

var port = server.address().port

console.log("应用实例,访问地址为 http://%s:%s", host, port)

})

app.get('/', function (req, res) {

var config = require('./config');

var json = JSON.stringify(config)

res.setHeader("Content-Type", "application/json");

res.write(json);

res.end();

})

配置文件:

var config = {

version: '1.0.0.3', // 版本号

file:['js/background-bundle.js','page/login.html'],

detail:['更新登陆页面']

  };

module.exports = config;

Electron主线程代码:

app.on('ready', async function () {

//获取服务端的版本和本地本部对比,不一致启动热更新

getserverinfo()

})

function getserverinfo() {

settingDB.getItem({ key: 'curversion' }, 'version', (curversion) => {       //从nedb数据库获取本地版本

    commonfun.getHttpData(autoUpdateUrl, (data) => {

        let serverconfig = JSON.parse(data)

        if (curversion != serverconfig.version) {

            //启动自动更新页面

            let updateconfig = {}

            if (curversion == '')

                curversion = '1.0.0'

            Object.assign(updateconfig, { localversion: curversion }, serverconfig)

            hotupdatepage.setup(updateconfig)    //启动更新的页面,实现文件下载,本地替换(这里启动渲染进程,实现更新的进度的可视化,及更新信息的提示)

            settingDB.setItem({ key: 'curversion', value: serverconfig.version }, 'version')

        } else {

            //启动安全验证界面(系统入口页面,约定不会改变系统入口页面)

            //securityvalid.setup()

        }

    }, () => {

        dialog.showMessageBox(null,

            {

                type: 'error', buttons: ['确定'], title: '系统启动失败', message: '系统启动失败,请联系管理员!'

            })

        app.exit()

    })

})

}

2. 改造主进程,通过ipcMain接收渲染进程发送的消息,实现主进程打开,关闭具体的功能页面

//打开页面

ipcMain.on('openpage', ({ sender }, pageconfig) => {

let { x, y, width, height } = pageconfig   //定义页面的打开位置及宽度高度

let pagewindow = new BrowserWindow({

    titleBarStyle: 'hiddenInset',

    autoHideMenuBar: true,

    fullscreenable: false,

    frame: false,

    x,

    y,

    width,

    height,

    defaultEncoding: 'UTF-8'

})

let page = {

    id: (Math.random() * 1000 | 0) + Date.now(),

    browserwin: pagewindow,

    name: pageconfig.name

}  

pages.push(page)  //定义page变量保存当前页面,实现对页面的关闭操作

pagewindow.loadURL(`file://${global.backgroundparam.rootpath}/page/${pageconfig.path}`) 

//pagewindow.webContents.openDevTools()

pagewindow.show()

pagewindow.webContents.on('did-finish-load', () => {

    pagewindow.webContents.send('receivepageID', page.id)

})

})

//根据页面唯一ID关闭页面

ipcMain.on('closepagebyself', ({ sender }, arg) => {

for (var i = 0; i < pages.length; i++) {

    if (pages[i].id === arg) {

        pages[i].browserwin.close()

        pages.splice(i, 1)

        return

    }

}

})

//根据页面名称关闭页面

ipcMain.on('closepagebypagename', ({ sender }, arg) => {

for (var i = 0; i < pages.length; i++) {

    if (pages[i].name == arg) {

        pages[i].browserwin.close()

        pages.splice(i, 1)

        return

    }

}

})

相关文章

  • Electron实现在线升级及功能的热更新

    背景:最近采用Electron改造公司的ERP客户端,由于界面功能较多,最终打包的文件有130M,更关键的问题是系...

  • 【Android】轻松实现 APK 在线升级

    【Android】轻松实现 APK 在线升级 APK 在线升级 APK 在线升级几乎是所有程序必备的功能。 在线升...

  • Electron - 自动升级实战

    1. 概述 本文讲解内容: Electron应用自动升级部分功能的实现机制,包含强制升级,更多内容可以参考自动升级...

  • electron应用实现热更新

    之前介绍过在electron-builder打包基础下怎么使用electron-updater实现应用自动监测版本...

  • Electron热更新

    本文主要简述使用electron-builder配合electron-updater是如何实现自动更新的。 早在节...

  • 2019-04-07 热更新

    热更新简述 热更新 主要是差量更新,避免在apk功能升级之后 需要重新下载整个的apk,避免用户流量损耗。而热更新...

  • 配置electron应用自动更新

    本文介绍了 electron 开发桌面端应用的自动更新升级版本的方法, 以及更新服务器的搭建. electron项...

  • 升级Electron至v5版本

    将electron升级到5.0.8版本,原版本1.7.11。当然,仅仅更新electron环境是不够的,相应的其他...

  • uniapp热更新/在线升级(各个框架及原生通用)

    没做过热更新的,可能感觉很难,但是当你知道逻辑流程后,就非常简单了。 一、下面先给大家介绍一下流程: 1、打一个w...

  • Android热更新集成之Bugly

    Bugly是鹅厂的一个集成异常上报,运营统计,在线升级,热更新的框架; 与传统的热更新相比,这个不需要搭建后台,不...

网友评论

    本文标题:Electron实现在线升级及功能的热更新

    本文链接:https://www.haomeiwen.com/subject/kmnqjftx.html