精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

手擼 Electron 自動更新,再繁瑣也要搞懂它

開發 前端
Electron 的自動更新不會像 React Native 一樣直接下載 Web 代碼靜默更新,因為它還有主進程(Node.js)代碼,因此需要走安裝流程。

大家好,我是楊成功。

Electron 的自動更新不會像 React Native 一樣直接下載 Web 代碼靜默更新,因為它還有主進程(Node.js)代碼,因此需要走安裝流程。

在 Electron 中,使用第三方包 electron-updater 來實現自動更新的功能。

為什么不用 autoUpdater?

如果細看 Electron 文檔,會發現官方提供了一個 autoUpdater 功能來實現自動更新,如圖:

圖片

相比 autoUpdater,第三方包 electron-updater 有以下優勢:

  • 不需要搭建專門的更新服務(如 Hazel、Nuts 等)。
  • 同時支持 macOS 和 Windows 簽名。
  • 支持獲取下載進度,等等。

最主要的優勢還是支持自定義更新服務。將新包上傳到自己的靜態服務器,比專門搭建一個更新服務更方便。

當然獲取下載進度也很重要,否則用戶干等著,體驗非常差。后面我們會實現下載進度提示。

接入 electron-updater

安裝 electron-updater,命令如下:

$ yarn add electron-updater

新建 update.js 文件,在該文件中編寫更新邏輯。

定義一個 checkUpdate() 方法,在該方法中執行 checkForUpdatesAndNotify() 來檢測是否有新版本。

當更新完成后,執行 quitAndInstall() 方法來安裝更新后的應用包。代碼如下:

const { autoUpdater } = require('electron-updater');
var mainWin = null;

const checkUpdate = (win, ipcMain) => {
  autoUpdater.autoDownload = true; // 自動下載
  autoUpdater.autoInstallOnAppQuit = true; // 應用退出后自動安裝
  mainWin = win;
  // 檢測是否有更新包并通知
  autoUpdater.checkForUpdatesAndNotify().catch();
  // 監聽渲染進程的 install 事件,觸發退出應用并安裝
  ipcMain.handle('install', () => autoUpdater.quitAndInstall());
};

module.exports = checkUpdate;

上方代碼中,我們通過監聽渲染進程的 install 事件來安裝新包。目的是在下載完新包后先提醒用戶是否安裝,用戶確認安裝后才執行安裝,強制安裝會影響用戶使用。

在主進程中檢測更新,并通知用戶。

檢測更新是在主進程中執行的,因此在主進程中調用 checkUpdate() 方法。

checkUpdate() 方法接收兩個參數,分別是渲染進程實例和主進程 IPC。主進程代碼如下:

const { app, BrowserWindow, ipcMain } = require('electron');
const path = require('path');
const preload = path.join(__dirname, './preload.js');
const checkUpdate = require('./update.js');

app.whenReady().then(() => {
  // 創建瀏覽器窗口(渲染進程)
  let win = new BrowserWindow({
    width: 600,
    height: 600,
    webPreferences: {
      contextIsolation: false,
      preload,
    },
  });
  checkUpdate(win, ipcMain);
});

上方代碼中創建了一個瀏覽器窗口,并綁定了預加載腳本(preload.js)。預加載腳本負責主進程與渲染進程之間的通信。

現在,客戶檢測更新的邏輯已經基本實現了。但是有新版本的判斷依據是什么呢?又從哪里下載新版本呢?

下面我們編寫服務器的邏輯。

客戶端打包,上傳服務器

檢測更新的原理,一定是本地應用版本和線上版本的對比,因此需要將應用打包并上傳到服務器。

應用打包使用 electron-builder 實現。

安裝 electron-builder 模塊:

$ yarn add electron-builder

根目錄下創建 electron-builder.json5 配置文件:

{
  ...
  "publish": [
    {
      "provider": "generic",
      "url": "https://xxx/updater/ele-app"
    }
  ]
}

配置文件的可選項有很多,publish 選項是自動更新配置。

其中 url 屬性最重要,是線上版本和安裝包的地址,檢測更新就是通過這個地址檢測。

打包之后,我們就要將新的安裝包和配置上傳到服務器,并通過這個地址訪問。

應用打包,生成安裝包和版本配置。

應用的版本號取自 package.json 文件中的 version 選項。

假設當前版本號是 0.1.7,我們首先更新版本號為 0.1.8,然后使用以下命令打包:

$ electron-builder --win --x64  # 打包 Windows
$ electron-builder --mac --universal # 打包 Mac Intel
$ electron-builder --mac --arm64 # 打包 Mac M1

以 Window 平臺為例,打包后會生成多個文件,以下兩個需要上傳:

  • xxx_0.1.8.exe(安裝包)
  • latest.yml(版本配置)

上傳到服務器后,需要通過 publish 中配置的地址訪問到,最終訪問地址如下:

  • https://xxx/updater/ele-app/xxx_0.1.8.exe:下載安裝包。
  • https://xxx/updater/ele-app/latest.yml:檢測版本更新。

可見,latest.yml 文件用于檢測更新,發現有更新后才會下載對應的安裝包。

配置 nginx 使訪問地址生效。

我們將上一步的兩個文件上傳到服務器的 /data/updater/ele-app 目錄下,然后在 nginx 配置中添加一個 location 如下:

location /updater {
   add_header Access-Control-Allow-Origin *;
   add_header Access-Control-Allow-Credentials true;
   add_header Access-Control-Allow-Methods GET,POST;
   alias /data/updater;
   sendfile on;
   autoindex on;
}

使用 "nginx -s reload" 重新加載配置,訪問文件的地址便生效了。

將下載進度通知給用戶

在客戶端的 update.js 文件中,我們觸發了檢測更新,可以添加事件監聽檢測結果,如下:

autoUpdater.on('update-available', (info) => {
  console.log('有新版本需要更新');
});
autoUpdater.on('update-not-available', (info) => {
  console.log('無需更新');
});

當有新版本時,應用后臺會自動下載(因為我們配置了 autoDownload = true),此時監聽下載進度并傳給渲染進程,用于將其展示到用戶界面上。代碼如下:

autoUpdater.on('download-progress', (prog) => {
  mainWin.webContents.send('update', {
    speed: Math.ceil(prog.bytesPerSecond / 1000), // 網速
    percent: Math.ceil(prog.percent), // 百分比
  });
});
autoUpdater.on('update-downloaded', (info) => {
  mainWin.webContents.send('downloaded');
  // 下載完成后強制用戶安裝,不推薦
  // autoUpdater.quitAndInstall();
});

上面代碼中,主進程向渲染進程發送了 update 和 downloaded 事件,這些事件需要經過預加載腳本轉發。渲染進程發送的 install 事件同理。

因此,在預加載腳本 preload.js 中添加代碼如下:

const { ipcRenderer } = require('electron');

window.elecAPI = {
  toInstall: () => ipcRenderer.invoke('install'),
  onUpdate: (callback) => ipcRenderer.on('update', callback),
  onDownloaded: (callback) => ipcRenderer.on('downloaded', callback),
};

現在,在瀏覽器窗口加載的 HTML 頁面中,我們可以直接使用上述代碼中的三個方法。

注意:在預加載腳本中使用 window.elecAPI 的前提是禁用上下文隔離,即配置 contextIsolation: false,否則會報錯。

顯示下載進度,完成后提示安裝

在 JavaScript 中調用預加載腳本中的定義方法,即可獲取到安裝進度,并主動觸發安裝。

var update_info = null; // 更新信息

window.elecAPI.onUpdate((_event, info) => {
  update_info = info;
});
window.elecAPI.onDownloaded(() => {
  update_info = null;
  let res = confirm('新版本已下載,是否立即安裝?');
  if (res) {
    window.elecAPI.toInstall();
  }
});

如果你使用 Vue 或 React 框架,直接將 update_info 定義為狀態,即可在頁面中以任意方式顯示新應用的下載進度了。

比如下圖,是我的更新提醒頁面:

圖片

下載完成后會彈框詢問是否安裝,確認后應用會退出并安裝;如果取消,下一次打開應用后還會繼續詢問,直到用戶安裝。

圖片

總結

經過上述的好幾個步驟,現在要發布新版本,只需要執行 2 個步驟。

  • 更新版本號,打包。
  • 上傳到服務器。

現在用戶重新打開應用程序,新包就會自動下載,并看到下載進度啦!

責任編輯:姜華 來源: 程序員成功
相關推薦

2025-05-29 05:59:56

2023-12-04 07:13:13

Electron自定義接口

2015-03-30 14:15:55

自動更新Android

2018-04-15 16:01:12

Windows 10微軟windows更新

2021-11-08 22:24:04

Windows 10Windows微軟

2017-10-20 12:13:11

數據庫PostgreSQL時間戳

2010-01-08 13:20:52

ibmdwWeb

2025-02-10 00:14:00

2012-04-16 14:55:29

MacChrome

2015-09-15 15:25:36

更新配置Windows 10

2010-12-13 13:33:47

Windows 7驅動

2020-08-03 08:10:52

UDPTCP通信

2021-07-26 16:23:13

Windows 10Windows微軟

2017-01-12 21:02:29

Windows 10系統更新

2011-08-02 18:30:32

iOS 應用程序 屬性

2016-10-21 10:40:06

Windows 10Updata禁用

2015-07-27 14:48:16

Windows 10更新

2010-06-02 19:54:48

SVN自動更新

2024-11-19 15:43:22

2015-07-21 10:20:00

Windows 10更新微軟
點贊
收藏

51CTO技術棧公眾號

欧美色倩网站大全免费| 国产自产高清不卡| 亚洲人成自拍网站| 亚洲欧美日本一区二区三区| 日日夜夜天天综合入口| 99久久精品国产毛片| 国产精品欧美日韩一区二区| 亚洲熟女www一区二区三区| 第四色在线一区二区| 欧美性色综合网| 日本a在线天堂| av在线播放国产| 香蕉免费一区二区三区在线观看| 亚洲一区二区欧美激情| 久久国产精品-国产精品| 国产精品51麻豆cm传媒| 亚洲欧美综合国产精品一区| 成人在线免费观看视频| 在线观看不卡一区| 日产精品久久久久久久蜜臀| 日韩亚洲视频| 免费看的av网站| 欧洲精品一区二区三区| 亚洲午夜久久久久| 一区二区三区|亚洲午夜| 色视频精品视频在线观看| 国产乱淫av一区二区三区| 国产精品99久久久久久久久| 日本五十路女优| 午夜精品毛片| 国产一区二区三区三区在线观看 | 阿v视频在线| 国产精品理论在线观看| 欧美日韩三区四区| 日日躁夜夜躁白天躁晚上躁91| 激情另类小说区图片区视频区| 欧美裸身视频免费观看| 欧美xxxooo| 日韩在线理论| 中文字幕免费精品一区| 亚洲一区视频在线播放| 香蕉久久精品日日躁夜夜躁| 亚洲第一天堂无码专区| 波多野结衣三级视频| 97久久精品一区二区三区的观看方式| 色噜噜狠狠一区二区三区果冻| 欧美日韩一道本| www.51av欧美视频| 亚欧色一区w666天堂| 久久av高潮av| 久草在线资源站资源站| 亚洲一本大道在线| 日韩精品在线视频免费观看| 岛国毛片av在线| 午夜不卡av免费| 131美女爱做视频| 成人一级福利| 日韩欧美一区二区三区| 日本www在线播放| 欧美片第一页| 欧美日韩中文国产| 亚洲理论中文字幕| 视频精品一区二区三区| 亚洲缚视频在线观看| 日本三级日本三级日本三级极| 国产精品白丝av嫩草影院| 亚洲成在人线av| 欧美亚一区二区三区| 国产aⅴ精品一区二区三区久久| 国产午夜精品全部视频播放| 亚洲av无码一区二区三区人| 日韩一区二区三区免费播放| 久久久久www| 国产无套内射又大又猛又粗又爽| 最新日韩欧美| 国产激情综合五月久久| 国产精品欧美亚洲| 成人国产精品免费网站| 日韩精品第一页| 国产在线激情| 黄色精品在线看| 能在线观看的av网站| 亚洲在线资源| 亚洲变态欧美另类捆绑| 美女爆乳18禁www久久久久久| 国产精品国产三级国产在线观看| 欧美日韩国产va另类| 欧美日韩精品区| 麻豆91精品视频| 激情五月综合色婷婷一区二区| 精品99又大又爽又硬少妇毛片| 1区2区3区国产精品| 日本xxxxxxxxxx75| 成人免费网站www网站高清| 欧美一区二区三区人| 亚洲黄色在线网站| 97精品一区二区| 2019中文字幕在线免费观看| 国产精品无码天天爽视频| 97成人超碰视| 蜜臀av.com| 日本不卡一二三| 日韩你懂的在线观看| 少妇无套高潮一二三区| 国产精品黄色| 国产色视频一区| 青青草娱乐在线| 一区2区3区在线看| 亚洲精品自拍网| 欧美sss在线视频| 欧美精品免费在线| 波多野结衣在线观看一区| 国产成人免费av在线| 亚洲蜜桃在线| 一级毛片久久久| 精品成人在线观看| 日韩国产第一页| 日本中文在线一区| 久久偷看各类wc女厕嘘嘘偷窃| h网站久久久| 欧美视频日韩视频在线观看| 变态另类丨国产精品| 国产一区日韩欧美| 川上优av一区二区线观看| 韩国福利在线| 一本一道综合狠狠老| 荫蒂被男人添免费视频| 亚洲一区色图| 91久久精品美女高潮| av中文字幕在线| 色欧美片视频在线观看在线视频| 稀缺小u女呦精品呦| 中文字幕av亚洲精品一部二部| 国产精品www| 看电影就来5566av视频在线播放| 欧美午夜女人视频在线| 亚洲天堂2024| 中文精品视频| 国精产品99永久一区一区| 欧美人与禽猛交乱配| 日韩欧美www| 波多野结衣亚洲色图| 国产在线精品视频| 欧美a级黄色大片| 日韩中文字幕在线一区| 欧美精品第一页在线播放| jlzzjlzzjlzz亚洲人| 亚洲精品中文字幕乱码三区| 午夜免费视频网站| 欧美不卡视频| 国产91精品入口17c| 91色在线看| 日韩精品视频免费| 日韩在线视频不卡| 国产欧美一区二区三区鸳鸯浴| 男女视频一区二区三区| 精品国产美女| 成人在线视频福利| 成人直播在线| 精品国产乱子伦一区| 日韩av一二三区| 久久综合999| 中文字幕第21页| 五月激情综合| 国产精品一区二区av| 三妻四妾的电影电视剧在线观看| 亚洲美女激情视频| 亚洲图片中文字幕| 亚洲美女在线国产| xxxx黄色片| 日韩精品亚洲一区| 中文字幕一区二区三区在线乱码| 久久69av| 欧美亚洲在线视频| 95在线视频| 欧美成人福利视频| 国产免费一级视频| 亚洲欧美日韩中文字幕一区二区三区 | 日韩成人免费在线| 日本丰满少妇黄大片在线观看| 91精品久久久久久综合五月天 | 在线观看 中文字幕| 久久精品免费在线观看| 中文字幕线观看| 亚洲国产裸拍裸体视频在线观看乱了中文| 久久婷婷国产综合尤物精品| 日本黄色成人| 91精品国产91久久久久久| 99青草视频在线播放视| 精品粉嫩aⅴ一区二区三区四区| 无码人妻av免费一区二区三区 | 久久视频在线播放| 少妇喷水在线观看| 欧美日韩国产综合视频在线观看| 国产在线一二区| 欧美国产亚洲另类动漫| 97中文字幕在线观看| 久久九九国产| h无码动漫在线观看| 成人av资源电影网站| 高清不卡一区二区三区| 99riav视频一区二区| 国精产品一区一区三区有限在线| 在线国产情侣| 亚洲精品午夜精品| 亚洲成人久久精品| 欧美狂野另类xxxxoooo| 狠狠人妻久久久久久| 一区二区三区在线免费视频| 国产三级短视频| 99精品视频在线免费观看| 亚洲视频在线不卡| 免费欧美日韩国产三级电影| 99re在线视频免费观看| 黄色亚洲精品| 97在线免费视频观看| 色88久久久久高潮综合影院| 久久天堂国产精品| 久久精品国产亚洲5555| 91高跟黑色丝袜呻吟在线观看| 国产成人精品一区二区三区免费| 欧美亚洲一区在线| 成人观看网址| 久久久久久久久久久91| av网站免费在线观看| 色吧影院999| 国产区在线视频| 亚洲日本中文字幕| 欧美18xxxxx| 亚洲精品之草原avav久久| 黄色美女一级片| 精品久久久久久综合日本欧美| 国产精品-色哟哟| 在线播放国产精品二区一二区四区| 日日夜夜操视频| 欧美小视频在线| 婷婷激情五月网| 狠狠色香婷婷久久亚洲精品| 国产亚洲欧美久久久久| 亚洲一级不卡视频| 日韩xxxxxxxxx| 精品久久久久久中文字幕| 国产精品成人aaaa在线| 午夜精品在线看| 日本网站在线免费观看| 精品美女久久久久久免费| 日韩aaaaaa| 天天操天天干天天综合网| 欧美日韩一二三四区| 欧美午夜激情小视频| 国产一级一级国产| 欧美性视频一区二区三区| 一区二区三区在线免费观看视频 | 欧美一区二区大胆人体摄影专业网站| 不卡专区在线| 欧洲亚洲免费在线| 国产精品第一国产精品| 成人夜晚看av| 国产精品极品| 欧美激情www| 成人在线免费视频观看| 欧美性受黑人性爽| 精品69视频一区二区三区Q| 国产精品又粗又长| 日韩在线播放一区二区| 日本不卡一区在线| 国产乱人伦偷精品视频不卡| 日本一区二区免费视频| 97久久精品人人做人人爽50路| www.色天使| 国产精品麻豆久久久| 久操视频免费在线观看| 欧美日韩另类视频| 懂色av蜜臀av粉嫩av喷吹| 欧美久久高跟鞋激| 婷婷在线免费视频| 一色桃子一区二区| 日本电影在线观看| 日韩美女视频中文字幕| 一区在线不卡| 国产精品久久久久久久久久久久午夜片 | 日韩一区二区三区在线免费观看| 国产日韩在线视频| 老司机aⅴ在线精品导航| 日韩av图片| 欧美视频导航| 中文字幕第21页| 国产成人在线免费| 亚洲午夜久久久久久久国产| 亚洲黄色片在线观看| 久久久久久久久久成人| 欧美一区二区三区白人 | 日韩在线观看免费高清| 99riav视频在线观看| 国产免费观看久久黄| 欧美一区自拍| 欧美在线观看视频免费| 日韩精品亚洲专区| 中文成人无字幕乱码精品区| 国产精品国产成人国产三级| 成人午夜视频在线播放| 日韩欧美国产系列| 在线免费av电影| 91成品人片a无限观看| 国产一区二区三区免费观看在线| 免费精品视频一区二区三区| 欧美日本不卡| 日本黄大片一区二区三区| 99re这里只有精品6| 欧美日韩色视频| 欧美亚洲综合一区| 天天在线女人的天堂视频| 欧美日韩电影在线观看| 四虎国产精品成人免费影视| 日韩成人av网站| 一区二区三区导航| 一级黄色片毛片| 一区二区三区免费观看| 国产精品久久久久久免费| 国产一区av在线| 小视频免费在线观看| 国产成人成网站在线播放青青| 91亚洲国产成人久久精品| 日日摸天天爽天天爽视频| av在线不卡观看免费观看| 国产av无码专区亚洲av毛网站| 欧美日韩免费一区二区三区 | 亚洲人妖av一区二区| 亚洲中文无码av在线| 亚洲一区999| 天堂久久午夜av| 日本一区美女| 西西人体一区二区| a级一a一级在线观看| 亚洲高清不卡在线观看| 亚洲av无码一区二区乱子伦| 美女av一区二区| 色悠久久久久综合先锋影音下载| 四虎4hu永久免费入口| 国内一区二区在线| 小泽玛利亚一区| 欧美精选在线播放| 成人午夜在线影视| 成人看片在线| 国产综合色产| 久久久午夜精品福利内容| 亚洲成人综合在线| 性插视频在线观看| 欧美最猛性xxxx| 国产伦精品一区二区三区千人斩| 毛片毛片毛片毛片毛片毛片毛片毛片毛片 | 国内精品久久久久久久影视蜜臀| 亚洲欧美高清在线| 天天免费综合色| 国产福利第一视频在线播放| 国产精品影院在线观看| 99精品综合| 免费黄色av网址| 狠狠色噜噜狠狠狠狠97| 成人三级黄色免费网站| 国产日韩在线视频| 极品少妇一区二区三区| 国产在线观看无码免费视频| 欧美在线观看你懂的| 黄色网址在线免费播放| 国产高清一区视频| 香蕉成人久久| 一二三四在线观看视频| 日韩一级二级三级| 久久久男人天堂| 亚洲一区二三| 高清国产一区二区| 日韩美一区二区| 久久精品91久久久久久再现| 99ri日韩精品视频| 欧美国产日韩在线播放| 成人欧美一区二区三区1314| 熟妇高潮一区二区三区| 国产精品成av人在线视午夜片| 五月天综合网站| 亚洲成年人av| 欧美在线观看视频一区二区三区| 最爽无遮挡行房视频在线| 黄色91av| 黑人巨大精品欧美黑白配亚洲| 国产 日韩 欧美 成人| 亚洲视频欧洲视频| 中文字幕视频精品一区二区三区| 免费无码国产v片在线观看| 自拍偷拍欧美精品| 手机看片福利在线观看| 91欧美视频网站| 免费看亚洲片| 欧美日韩在线观看成人| 亚洲视频在线视频| 久久99国产精品久久99大师| 亚欧激情乱码久久久久久久久| 天天色综合天天| 国产三级在线播放| 日韩欧美一区二区视频在线播放|