electron熱更新與windows下的安裝包

幫朋友公司作了點東西,他說有不少bug,我一看,基本問題都是瀏覽器兼容引發的,而electron內帶Chromium內核,正好一直想嘗試下electron,因此研究了一波。這裏只是簡單的使用electron做爲殼,把本身的項目嵌進去,更多深刻研究之後再來。php

打包本身的項目

這裏沒啥說的本身的項目打包下來,相似下面 1.pnghtml

快速開始electron

上手electron,官方提供了一個很是好的快速上手實例"electron-quick-start"。node

熱更新

  • 由於Chromium的緣故,即便很小的項目打包出來也有120M左右,若是給客戶使用,不可能每次有點改動就讓客戶從新安裝,顯然咱們須要熱更新。
  • 熱更新的原理:每次啓動程序咱們就去拿本地的版本號和服務器上的版本號作對比,若是不一致就去請求資源,下載下來更新本地文件。
  • 首先咱們觀察打包出來的文件,發現原始文件都放在resources/app下面的,也便是說咱們下載下來的文件直接覆蓋到resources/app下就能夠達到更新了。 3.png
  • 這裏我推薦七牛雲,免費的可使用10G內存,咱們把更新資源放上去,須要版本號package.json和更新包dist.zip
  • 而後改寫electron配置main.js,加入檢測更新的代碼
/**
 * 檢測更新
 */
// const baseUrl = "./";
const baseUrl = "./resources/app/";
const fileUrl = "http://pm72qibzx.bkt.clouddn.com/";//這裏須要修改成本身的資源外網
(function () {
  return new Promise((resolve, reject) => {
    request(
      {
        url: `${fileUrl}package.json?v=${new Date().getTime()}`,//請求package.json,與本地對比版本號
      },
      (error, res, body) => {
        try {
          if (error || res.statusCode !== 200) {
            throw '更新版本號失敗,請聯繫管理員';
          }
          const json = JSON.parse(body);
          const { version, description } = json;
          const localVersion = electron.app.getVersion();
          // console.log(version, localVersion)
          if (version != localVersion) {
            mainWindow.webContents.send('updating', '更新中')
            console.log('need update')
            dialog.showMessageBox({
              type: 'info',
              title: '發現新版本',
              message: '請點擊按鈕進行更新,預計持續幾分鐘,期間請不要操做,更新後會自動重啓',
              buttons: ['立刻更新']
            },
              // (index) => {
              //   if (index == 0) {
              //     mainWindow.setProgressBar(0.5)
              //   } else {
              //   }
              // }
            )
            mainWindow.setProgressBar(0.5);
            downLoad()
              .then(() => {
                console.log('update success')
                //重寫版本號到本地
                fs.readFile(`${baseUrl}package.json`, function (err, data) {
                  if (err) {
                    return console.error(err);
                  }
                  let newData = JSON.parse(data);
                  newData.version = version;
                  fs.writeFile(`${baseUrl}package.json`, JSON.stringify(newData), function (err) {
                    if (err) {
                      return console.error(err);
                    }
                    // 重啓
                    app.relaunch({ args: process.argv.slice(1) });
                    app.exit(0);
                  });
                });
              })
          } else {
            console.log('no update')
          }
        } catch (err) {
          reject(err);
        }
      })
  })
})()
/**
 * 更新
 */
const downLoad = () => {
  return new Promise((resolve, reject) => {
    const stream = fs.createWriteStream(`${baseUrl}temp/dist.zip`);
    const url = `${fileUrl}dist.zip?v=${new Date().getTime()}`;
    request(url).pipe(stream).on('close', () => {
      const unzip = new adm_zip(`${baseUrl}temp/dist.zip`);   //下載壓縮更新包
      unzip.extractAllTo(`${baseUrl}`, /*overwrite*/true);   //解壓替換本地文件
      resolve()
    });
  })
}

windows下的安裝包

  • 這裏使用electron-winstaller
  • 配置在build.js
resultPromise = electronInstaller.createWindowsInstaller({
  appDirectory: path.join('./electron/ElectronTest-win32-x64'), //入口
  outputDirectory: path.join('./installer/installer64'),     //出口
  authors: 'yyt',
  exe: 'ElectronTest.exe',        //名稱
  setupIcon: path.join('icon.ico'),//安裝圖標,必須本地
  iconUrl: 'http://pm72qibzx.bkt.clouddn.com/icon.ico',//程序圖標,必須url
  noMsi: true,
});
  • node build.js 打包成win安裝包 4.png

完成

  • 完成安裝後,玩耍吧 5.png

源碼

  • 刪除electron和install,防止老文件
  • 考入本身項目文件到跟目錄,覆蓋index.html
  • cnpm i 或者npm i
  • 修改main.js中fileUrl爲本身的更新包資源地
  • 修改build.js中的安裝包名稱,圖標等
  • npm run packager 打包
  • 注意:須要先進入electron項目,‘好比D:\phpStudy\WWW\others\electron-test\electron\ElectronTest-win32-x64\resources\app’,安裝cnpm i request adm-zip
  • node build.js 打包成win安裝包

最後

你們好,這裏是「 TaoLand 」,這個博客主要用於記錄一個菜鳥程序猿的Growth之路。這也是本身第一次作博客,但願和你們多多交流,一塊兒成長!文章將會在下列地址同步更新…… 我的博客:www.yangyuetao.cn 小程序:TaoLandgit

原文出處:https://www.cnblogs.com/TaoLand/p/10344235.htmlgithub

相關文章
相關標籤/搜索