electron-updater

前提备份:

安装一下更新插件

复制代码
npm install electron-updater --save 

app | Electron (electronjs.org)更多配置参考app | Electron (electronjs.org)

自动更新 electron-updater

1、安装依赖 yarn add electron-updater

2、自定义更新的文件 handleUpdate.js

注: 打包完会生成一个latest.yml文件,把这个文件和生成的.exe文件放在服务器上,会自动检测版本

自定义更新的文件 handleUpdate.js-版本1:

复制代码
import {
	autoUpdater
} from 'electron-updater'

import {
	ipcMain,dialog
} from 'electron'
let mainWindow = null;
export function handleUpdate(window, feedUrl) {
	mainWindow = window;
	let message = {
		error: '检查更新出错',
		checking: '正在检查更新......',
		updateAva: '检测到新版本,正在下载......',
		updateNotAva: '现在使用的就是最新版本,不用更新',
	};

`autoUpdater.autoDownload = false;` //取消自动下载
	//设置更新包的地址
	autoUpdater.setFeedURL(feedUrl);
	//监听升级失败事件
	autoUpdater.on('error', function(error) {
		sendUpdateMessage({
			cmd: 'error',
			message: error
		})
	});
	//监听开始检测更新事件
	autoUpdater.on('checking-for-update', function(message) {
		sendUpdateMessage({
			cmd: 'checking-for-update',
			message: message
		})
	});
	//监听发现可用更新事件
	autoUpdater.on('update-available', function(message) {
		sendUpdateMessage({
			cmd: 'update-available',
			message: message
		})
		//新加内容
	/**	`const options = {
			type: 'info',
			buttons: ['确定', '取消'],
			title: '更新提示',
			message: '发现有新版本,是否更新?',
			cancelId: 1
		}
		dialog.showMessageBox(options).then(res => {
			if (res.response === 0) {
				sendUpdateMessage({
					cmd: 'confimUpdate',
					message: message
				})
				autoUpdater.downloadUpdate()
			} else {
				return;
			}
		})`*/




	});
	//监听没有可用更新事件
	autoUpdater.on('update-not-available', function(message) {
		sendUpdateMessage({
			cmd: 'update-not-available',
			message: message
		})
	});

	// 更新下载进度事件
	autoUpdater.on('download-progress', function(progressObj) {
		sendUpdateMessage({
			cmd: 'download-progress',
			message: progressObj
		})
	});
	//监听下载完成事件
	autoUpdater.on('update-downloaded', function(event, releaseNotes, releaseName, releaseDate, updateUrl) {
		sendUpdateMessage({
			cmd: 'update-downloaded',
			message: {
				releaseNotes,
				releaseName,
				releaseDate,
				updateUrl
			}
		})
		//退出并安装更新包
		//autoUpdater.quitAndInstall();
	});
	//新增
	ipcMain.on("quit-install", (e, arg) => {
		autoUpdater.quitAndInstall();
	})
	//接收渲染进程消息,开始检查更新
	ipcMain.on("checkForUpdate", (e, arg) => {
		//执行自动更新检查
		// sendUpdateMessage({cmd:'checkForUpdate',message:arg})
		autoUpdater.checkForUpdates();
	})
}
//给渲染进程发送消息
function sendUpdateMessage(text) {
	mainWindow.webContents.send('message', text)
}

版本2:

复制代码
 const { ipcMain } = require('electron')
 const { autoUpdater } = require("electron-updater")
 const { build } = require("../../../package.json")
 
  
 // 用户反馈立即更新
 ipcMain.on('ev-update-now', () => {
     console.log('ev-update-now::: 用户同意更新,开始更新') 
  
     autoUpdater.quitAndInstall()
 })
  
 // 用户也可以通过点击按钮去检测更新
 ipcMain.on('ev-check-for-update', () => {
     console.log('ev-check-for-update::: 执行自动更新检查') 
  
     autoUpdater.checkForUpdates()
 })
  
 function handleUpdate(mainWindow) {
     const message = {
         error: '检查更新出错',
         checking: '正在检查更新......',
         updateAva: '检测到新版本,正在下载......',
         updateNotAva: '现在使用的就是最新版本,不用更新'
     }
  
     autoUpdater.setFeedURL(build.publish[0].url) // 设置下载地址
  
     // 检查更新出错
     autoUpdater.on('error', () => {
         console.log('autoUpdater-error:::', arguments)
  
         sendUpdateMessage(message.error)
     })
  
     // 检查是否有版本更新
     autoUpdater.on('checking-for-update', () => {
         console.log('checking-for-update:::', arguments)
  
         sendUpdateMessage(message.checking)
     })
  
     // 检测到有版本更新
     autoUpdater.on('update-available', () => {
         console.log('update-available:::', arguments)
  
         sendUpdateMessage(message.updateAva)
     })
  
     // 未发现有新版本
     autoUpdater.on('update-not-available', () => {
         console.log('update-not-available:::', arguments)
  
         sendUpdateMessage(message.updateNotAva)
     })
  
     // 更新下载进度事件
     autoUpdater.on('download-progress', progressObj => {
         console.log('download-progress:::', progressObj)
         
         mainWindow.setProgressBar(progressObj.percent / 100)
     })
  
     // 下载完成,询问用户是否更新
     autoUpdater.on('update-downloaded', (event, releaseNotes, releaseName, releaseDate, updateUrl, quitAndUpdate) => {
         console.log('update-downloaded::: 下载完成,询问用户是否更新') 
         
         mainWindow.webContents.send('ev-should-update', {
             event,
             releaseNotes,
             releaseName,
             releaseDate,
             updateUrl,
             quitAndUpdate
         })
     })
  
     function sendUpdateMessage(text) {
         mainWindow.webContents.send('ev-message', text)
     }
 }
  
 module.exports = {
     handleUpdate
 }

3、在主进程文件main.js里面引用 handleUpdate.js

复制代码
const {
	handleUpdate
} = require('./handleUpdate.js') //根据自己路径引入 我跟main.js同级放的    

使用:

复制代码
  mainWindow.on('closed', () => {
    mainWindow = null
  })
 
  //自动更新函数
  handleUpdate(mainWindow) // 在这里执行,并把mainWindow传入
相关推荐
大模型码小白3 分钟前
数据可视化:AI 生成 HTML5 动态交互式数据图表
前端·数据库·人工智能·深度学习·机器学习·信息可视化·html5
八荒启·交互动画4 分钟前
Web特效01—什么是渲染
前端·javascript·网页特效·八荒启-交互动画
小肥君8 分钟前
前端测试websocket
前端·websocket·状态模式
南京兴帝文化传媒有限公司29 分钟前
基于地图平台的本地商户信息优化:药店夜间服务标注与客户转化实操
前端·javascript·数据库·人工智能·geo 优化·geo优化避坑·ai搜索获客
八荒启·交互动画29 分钟前
Web特效04——GPUvs CPU,为什么图形计算要交给GPU,什么是“并行计算”
前端
呃呃呃呃ex1 小时前
2026年古法编程的末法时代,如何评估自己完成迅速转行
前端·后端
南京兴帝文化传媒有限公司1 小时前
地图SEO与AI搜索优化结合实践:宁国摄影工作室本地获客案例分析
大数据·前端·人工智能·geo 优化·geo优化避坑
用户921080262861 小时前
前端 Vue 专栏 07:模板编译、虚拟 DOM、Diff 与 key
前端
八荒启_交互动画1 小时前
Web特效03——像素VS顶点:图形处理的的两种基本单位
javascript
光影少年1 小时前
react navite process.nextTick 和 Promise.then 的执行顺序
前端·react native·react.js