electron自動(dòng)更新

最終效果

在開始之前, 先讓我們看一下最終效果: 在打開軟件的時(shí)候, 會(huì)自動(dòng)判斷當(dāng)前是否為最新版(和文件服務(wù)器上的最新版本進(jìn)行對(duì)比), 如果不是最新版, 則會(huì)自動(dòng)下載安裝并打開新版

自動(dòng)更新過程.gif



在看過最終自動(dòng)檢測(cè)更新的效果之后, 讓我們從頭開始配置

初始化vue-cli3項(xiàng)目

vue-cli3初始化項(xiàng)目已經(jīng)去掉了vue.config.js, 這里需要自己新增文件進(jìn)行配置

安裝與配置electron-updater

//安裝
npm install electron-updater --save
  • 安裝好后, 會(huì)在package.json中生成一些script腳本, 另外electron-builder的配置項(xiàng)需要寫在vue.config.js中, 因?yàn)?/em>vue-cli3.0已不再支持package.json中配置config和build, 否則會(huì)報(bào)下述錯(cuò)誤*
error: 'build' in the application package.json is not supported since 3.0 anymore

打開vue.config.js

pluginOptions:{
    ...
    electronBuilder: {
      nodeIntegration: true,
      contextIsolation: false,
      builderOptions: {
        productName: "vue-config-package",
        appId: "123",
        //注意, 只有在配置了publish路徑時(shí), build之后才會(huì)生成latest.yml文件
        publish: [
          {
            "provider": "generic",
            "url": "http://127.0.0.1:8000/"
          }
        ]
      }
    }
}

搭建文件服務(wù)器

在本地搭建文件服務(wù)器, 用于存放最新的安裝包和latest.yml文件

  • latest.yml文件是自動(dòng)更新的重要依據(jù), 里面記錄了版本號(hào), 安裝exe路徑, 打包release時(shí)間等
npm i -g simplehttpserver
//進(jìn)入根目錄, 執(zhí)行下列代碼
simplehttpserver
//默認(rèn)8000端口, 也可以自定義端口:  simplehttpserver -p 8080



前期準(zhǔn)備和安裝工作已經(jīng)完成, 接下來要編寫update.js腳本(主進(jìn)程), 以及渲染頁面中的監(jiān)聽和后續(xù)操作

主進(jìn)程update.js

在background.js同級(jí)目錄新增update.js, 用于封裝主進(jìn)程的electron-update的事件回調(diào)

import {
    autoUpdater
} from 'electron-updater'
 
import {
    ipcMain
} from 'electron'
let mainWindow = null;
export function updateHandle(window, feedUrl) {
    debugger
    mainWindow = window;
    let message = {
        error: '檢查更新出錯(cuò)',
        checking: '正在檢查更新……',
        updateAva: '檢測(cè)到新版本,正在下載……',
        updateNotAva: '現(xiàn)在使用的就是最新版本鲸拥,不用更新',
    };
    //設(shè)置更新包的地址
    autoUpdater.setFeedURL(feedUrl);
    //監(jiān)聽升級(jí)失敗事件
    autoUpdater.on('error', function (error) {
        sendUpdateMessage({
            cmd: 'error',
            message: error
        })
    });
    //監(jiān)聽開始檢測(cè)更新事件
    autoUpdater.on('checking-for-update', function (message) {
        sendUpdateMessage({
            cmd: 'checking-for-update',
            message: message
        })
    });
    //監(jiān)聽發(fā)現(xiàn)可用更新事件
    autoUpdater.on('update-available', function (message) {
        sendUpdateMessage({
            cmd: 'update-available',
            message: message
        })
    });
    //監(jiān)聽沒有可用更新事件
    autoUpdater.on('update-not-available', function (message) {
        sendUpdateMessage({
            cmd: 'update-not-available',
            message: message
        })
    });
 
    // 更新下載進(jìn)度事件
    autoUpdater.on('download-progress', function (progressObj) {
        sendUpdateMessage({
            cmd: 'download-progress',
            message: progressObj
        })
    });
    //監(jiān)聽下載完成事件
    autoUpdater.on('update-downloaded', function (event, releaseNotes, releaseName, releaseDate, updateUrl) {
        sendUpdateMessage({
            cmd: 'update-downloaded',
            message: {
                releaseNotes,
                releaseName,
                releaseDate,
                updateUrl
            }
        })
        //退出并安裝更新包
        autoUpdater.quitAndInstall();
    });
 
    //接收渲染進(jìn)程消息皆尔,開始檢查更新
    ipcMain.on("checkForUpdate", (e, arg) => {
        //執(zhí)行自動(dòng)更新檢查
        // sendUpdateMessage({cmd:'checkForUpdate',message:arg})
        autoUpdater.checkForUpdates();
    })
}
//給渲染進(jìn)程發(fā)送消息
function sendUpdateMessage(text) {
    mainWindow.webContents.send('message', text)
}

background.js中:

//自動(dòng)更新腳本
import { updateHandle } from './update.js';

async function createWindow() {
  ...
  //這里是文件服務(wù)器的根路徑地址
  let feedUrl = "http://127.0.0.1:8000/";
  updateHandle(win,feedUrl);
}

渲染進(jìn)程

App.vue

<template>
  <div>
      <p>當(dāng)前版本1.0</p>
      <p v-if="dialogVisible">正在更新新版本,請(qǐng)稍候...</p>
  </div>
</tempalte>
<script>
let ipcRenderer = require("electron").ipcRenderer;
let _this = this;

//接收主進(jìn)程版本更新消息
ipcRenderer.on("message", (event, arg) => {
  // for (var i = 0; i < arg.length; i++) {
  console.log('Appvue:',arg);
  if ("update-available" == arg.cmd) {
    //顯示升級(jí)對(duì)話框
    _this.dialogVisible = true;
  } else if ("download-progress" == arg.cmd) {
    //更新升級(jí)進(jìn)度
    console.log(arg.message.percent);
    let percent = Math.round(parseFloat(arg.message.percent));
    _this.percentage = percent;
  } else if ("error" == arg.cmd) {
    _this.dialogVisible = false;
    alert("更新失敗");
  }
  // }
});
//2秒后開始檢測(cè)新版本
let timeOut = window.setTimeout(() => {
  ipcRenderer.send("checkForUpdate");
}, 2000);
clearTimeout;
//間隔1分鐘檢測(cè)一次
let interval = window.setInterval(() => {
  ipcRenderer.send("checkForUpdate");
}, 60000);

export default {
  data(){
    return{
      dialogVisible: false,
      closeOnClickModal: false,
      closeOnPressEscape: false,
      showClose: false,
      percentage: 0,
      strokeWidth:200
    }
  },
  mounted(){
    _this = this;
  },
  methods:{
    ipcRenderer(keyword){
      this.$electron.ipcRenderer.send(keyword,"123");
    },
  },
  destroyed() {
    window.clearInterval(interval);
    window.clearInterval(timeOut);
  }
}
</script>

測(cè)試步驟

  1. 更改package.json中的version和App.vue中任意內(nèi)容(例如當(dāng)前版本X.X可以看出當(dāng)前版本效果特性的內(nèi)容)
  2. 將最新的安裝包放到simplehttpserver運(yùn)行的本地文件服務(wù)根目錄中
  3. 安裝運(yùn)行舊版本的包, 則會(huì)進(jìn)入并且自動(dòng)更新下載打開新的資源包





參考文檔
1.electron官方文檔:https://www.electronjs.org/docs/tutorial/quick-start
2.electron-builder官方文檔:https://www.electron.build/api/electron-builder
3.electron-builder常用配置中文注釋https://blog.csdn.net/sw7662504/article/details/109241935?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-8&spm=1001.2101.3001.4242
4.vue-cli2.0+electron配置教程https://blog.csdn.net/gsj4719896/article/details/100131840

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末妻献,一起剝皮案震驚了整個(gè)濱河市门岔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌须误,老刑警劉巖畅哑,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件俏险,死亡現(xiàn)場(chǎng)離奇詭異严拒,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)竖独,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門裤唠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人莹痢,你說我怎么就攤上這事种蘸∧垢埃” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵航瞭,是天一觀的道長(zhǎng)诫硕。 經(jīng)常有香客問我,道長(zhǎng)刊侯,這世上最難降的妖魔是什么章办? 我笑而不...
    開封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮滨彻,結(jié)果婚禮上藕届,老公的妹妹穿的比我還像新娘。我一直安慰自己亭饵,他們只是感情好休偶,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著辜羊,像睡著了一般踏兜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上只冻,一...
    開封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天庇麦,我揣著相機(jī)與錄音计技,去河邊找鬼喜德。 笑死,一個(gè)胖子當(dāng)著我的面吹牛垮媒,可吹牛的內(nèi)容都是我干的舍悯。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼睡雇,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼萌衬!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起它抱,我...
    開封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤秕豫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后观蓄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體混移,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年侮穿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了歌径。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡亲茅,死狀恐怖回铛,靈堂內(nèi)的尸體忽然破棺而出狗准,到底是詐尸還是另有隱情,我是刑警寧澤茵肃,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布腔长,位于F島的核電站,受9級(jí)特大地震影響免姿,放射性物質(zhì)發(fā)生泄漏饼酿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一胚膊、第九天 我趴在偏房一處隱蔽的房頂上張望故俐。 院中可真熱鬧,春花似錦紊婉、人聲如沸药版。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽槽片。三九已至,卻和暖如春肢础,著一層夾襖步出監(jiān)牢的瞬間还栓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來泰國打工传轰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留剩盒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓慨蛙,卻偏偏與公主長(zhǎng)得像辽聊,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子期贫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容