electron + nodejs (热更新)

  1. package.json
    	"build": {
    		"appId": "com.***.app",
    		"productName": "****",
    		"directories": {
    			"output": "build"
    		},
    		"dmg": {
    			"contents": [
    				{
    					"x": 410,
    					"y": 150,
    					"type": "link",
    					"path": "/Applications"
    				},
    				{
    					"x": 130,
    					"y": 150,
    					"type": "file"
    				}
    			]
    		},
    		"mac": {
    			"icon": "./assets/icons/mac.icns",
    			"target": [
    				"zip",
    				"dmg"
    			],
    			"publish": [
    				{
    					"provider": "generic",
    					"url": "http://*********/win"
    				}
    			]
    		},
    		"win": {
    			"icon": "./assets/icons/win.ico",
    			"target": [
    				"nsis",
    				"zip"
    			],
    			"publish": [
    				{
    					"provider": "generic",
    					"url": "http://**********/win"
    				}
    			]
    		},
    		"linux": {
    			"icon": "./assets/icons"
    		},
    		"nsis": {
    			"oneClick": false,
    			"allowToChangeInstallationDirectory": true,
    			"perMachine": true,
    			"artifactName": "${productName}-setup-${version}.${ext}"
    		}
    	}

     

  2. 主进程
     const { app, BrowserWindow, ipcMain} = require('electron');
     const { autoUpdater } = require('electron-updater');
     // path是node 内置模块 拼接路径
     const path = require('path');
    
     let win, webContents;
    // 创建窗口
     // 自定义方法
     function ml_createrWindwo () {
        // 创建窗口
       win = new BrowserWindow({
        webPreferences:{
            nodeIntegration: true,
        },
        titleBarStyle: 'hidden',
        frame: false,
        resizable: false,
        show: false,
        width:880,
        height:540,
       });
    //    win.maximize();
       // 加载内容
       // 加载远程地址
       // win.loadURL('http://www.baidu.com/')
       // 加载本地
       // __dirname :当前JS文件所在文件路径,绝对路径
       //  相对路径
       win.loadURL(path.join(__dirname,'./index.html'))
       // max 系统的 :win.loadURL(path.join('file://',__dirname,'./index.html'))
    
       webContents = win.webContents;
        win.once('ready-to-show', () => {
            win.show()
        })
       // 关闭窗口
       win.on('close',function () {
           //TODO: 关闭窗口前想做的事
    
           win = null;
       })
    
       //监听窗口最大化
       win.on('maximize', () => {
            win.webContents.send('maximize');
        })
        //监听窗口最小化
       win.on('unmaximize', () => {
            win.webContents.send('unmaximize');
       })
       ml_updateHandle();
    }
    
    
    //检查更新
    const uploadUrl='http://********/win'; // 安装包latest.yml所在服务器地址
    // 检测更新,在你想要检查更新的时候执行,renderer事件触发后的操作自行编写
    function ml_updateHandle () {
     let message = {
       error: {status: -1, msg: '检测更新查询异常'},
       checking: {status: 0, msg: '正在检查更新...'},
       updateAva: {status: 1, msg: '检测到新版本,正在下载,请稍后'},
       updateNotAva: {status: 2, msg: '您现在使用的版本为最新版本,无需更新!'},
     }
     let versionInfo = '';
     autoUpdater.setFeedURL(uploadUrl)
    // 检测更新查询异常
     autoUpdater.on('error', function (error) {
       sendUpdateMessage(message.error)
     })
    // 当开始检查更新的时候触发
     autoUpdater.on('checking-for-update', function () {
       sendUpdateMessage(message.checking)
     })
    // 当发现有可用更新的时候触发,更新包下载会自动开始
     autoUpdater.on('update-available', function (info) {
       sendUpdateMessage(message.updateAva)
     })
    // 当发现版本为最新版本触发
     autoUpdater.on('update-not-available', function (info) {
       sendUpdateMessage(message.updateNotAva)
     })
     // 更新下载进度事件
     autoUpdater.on('download-progress', function (progressObj) {
       webContents.send('downloadProgress', progressObj)
     })
    // 包下载成功时触发
     autoUpdater.on('update-downloaded', function (event, releaseNotes, releaseName, releaseDate, updateUrl, quitAndUpdate) {
    // 收到renderer进程确认更新
       ipcMain.on('updateNow', (e, arg) => {
         console.log('开始更新')
         autoUpdater.quitAndInstall() // 包下载完成后,重启当前的应用并且安装更新
       })
    // 主进程向renderer进程发送是否确认更新
       webContents.send('isUpdateNow', versionInfo)
     })
    
    ipcMain.on('checkForUpdate', () => {
       // 收到renderer进程的检查通知后,执行自动更新检查
       // autoUpdater.checkForUpdates()
       let checkInfo = autoUpdater.checkForUpdates()
       checkInfo.then(function (data) {
         versionInfo = data.versionInfo; // 获取更新包版本等信息
       })
     })
    }
    
    // 通过main进程发送事件给renderer进程,提示更新信息
    function sendUpdateMessage (text) {
     webContents.send('message', text)
    }
    

    页面

           const { ipcRenderer: ipc } = require('electron');      
           mounted () {
                let vm = this;
            
                ipc.send('checkForUpdate');
                
                vm.version = package.version;
                ipc.on('unmaximize', (event) => {
                    this.full = false;
                });
                ipc.on('maximize', (event) => {
                    this.full = true;
                });
                ipc.on('message', (event, data) => {
                    console.log('message', data.msg)
                })
                ipc.on('downloadProgress', (event, progressObj) => {
                    this.spinShow = true;
                    this.percent =  parseFloat(progressObj.percent).toFixed(2);
                    // 可自定义下载渲染效果
                })
                ipc.on('isUpdateNow', (e, versionInfo) => {
                    vm.vnew = true;
                    vm.new_version = versionInfo.version;
                    this.spinShow = false;
                    // 自定义选择效果,效果自行编写
                    vm.$Modal.warning({
                        title: '*************',
                        content: '检测到新版本' + versionInfo.version + ',是否立即重启升级?',
                        onOk () {
                            ipc.send('updateNow');
                        }
                    })
                })
                setTimeout(function (){
                    vm.vcont = true;
                },200)
            },
            beforeDestroy () {
                // 移除ipcRenderer所有事件 
                ipc.removeAllListeners()
            },

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值