一、配置主进程文件electron.js
该主进程文件(electron.js)在前端打好的dist包中创建
const {app, BrowserWindow,ipcMain,dialog} =require('electron');
const isDev = require('electron-is-dev');
const {autoUpdater} = require('electron-updater');
const path=require("path");
const electron = require('electron');
/*获取electron窗体的菜单栏*/
const Menu = electron.Menu;
/*隐藏electron创建的菜单栏*/
Menu.setApplicationMenu(null);
let mainWindow,webContents;
function createWindow () { //创建一个新窗口
mainWindow = new BrowserWindow({
show: false,
webPreferences: {
nodeIntegration: true,
//preload: __dirname + '/preload.js'
},
icon:"./123.ico"
});
webContents=mainWindow.webContents;
mainWindow.maximize(); //窗口最大化
mainWindow.on('closed', function () { //窗口关闭方法
mainWindow = null
});
//自动更新提示
autoUpdater.setFeedURL("http://localhost:8888/update");
setInterval(() => {
autoUpdater.checkForUpdates()
}, 6000);
autoUpdater.on('update-downloaded', (event, releaseNotes, releaseName) => {
const dialogOpts = {
type: 'info',
buttons: ['重新启动并更新', '稍后更新'],
title: '系统更新',
message: process.platform === 'win32' ? releaseNotes : releaseName,
detail: '有一个新版本需要下载. 请重启软件进行更新.'
};
dialog.showMessageBox(dialogOpts).then((returnValue) => {
if (returnValue.response === 0) autoUpdater.quitAndInstall()
})
});
autoUpdater.on('error', message => {
console.error('下载更新失败');
console.error(message)
});
mainWindow.loadURL(`file://${__dirname}/index.html`); //窗口主文件地址
}
//渲染进程通知关闭APP
ipcMain.on('closeApp', function (event, args) {
app.quit();
});
//渲染进程通知最大化
ipcMain.on('maxApp', function (event, args) {
mainWindow.maximize(); //窗口最大化
});
//渲染进程通知最小化
ipcMain.on('minApp', function (event, args) {
mainWindow.minimize(); //窗口最小化
});
//以下就是类似于app的生命周期的方法
app.on('ready', () => {
createWindow();
});
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') {
app.quit();
}
});
app.on('activate', () => {
if (mainWindow === null) {
createWindow();
}
});
二、配置package.json
该文件也是在dist包目录下,通过npm init创建
{
"name": "electron_test",
"version": "1.0.2",
"description": "",
"main": "electron.js",
"homepage": ".",
"scripts": {
"electron-start": "electron .",
"dist": "electron-builder"
},
"devDependencies": {
"electron": "^8.2.0",
"electron-builder": "^22.4.1"
},
"dependencies": {
"electron-is-dev": "^1.1.0",
"electron-updater": "^4.2.5"
},
"author": "liushxin",
"license": "ISC",
"build": {
"win": {
"icon": "./123.ico"
},
"nsis": {
//是否一键安装,建议为 false,可以让用户点击下一步、下一步、下一步的形式安装程
"oneClick": false,
//允许修改安装目录,建议为 true,是否允许用户改变安装目录,默认是不允许
"perMachine": true,
"allowElevation": true,
"allowToChangeInstallationDirectory": true,
//创建桌面图标
"createDesktopShortcut": true,
//创建开始菜单图标
"createStartMenuShortcut": true,
//安装时头部图标
"installerHeaderIcon": "./123.ico",
"runAfterFinish": true,
//安装图标
"installerIcon": "./123.ico",
//卸载图标
"uninstallerIcon": "./123.ico"
},
"productName": "测试自动更新1.0.2",
"appId": "lsx",
"directories": {
"output": "distBuild"
},
"publish": [
{
"provider": "generic",
"url": "http://localhost:8888/update"
}
],
"asar": true
}
}
运行npm run dist打包成功后会生成如下文件夹
三、利用Node+express搭建一个简易的本地更新服务
新建一个空的node项目
app.js
const express = require("express");
const app = express();
app.get("/", (req, res) => {
res.send("Hello world");
});
app.all("*", function (req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With");
res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
res.header("X-Powered-By", " 3.2.1");
res.header("Content-Type", "application/json;charset=utf-8");
next();
});
app.use("/update", express.static("./update"));
app.listen(8888, (req, res) => {
console.log(res);
console.log("Server is running at http://localhost:8888");
});
进行新版本更替时需要修改package.json中的version
然后将打包好的如下几个文件扔到node服务的update文件夹下,就会检测到自动更新了。