[开发心得]Electron应用自动升级 autoUpdater的使用。

2023-11-07

前言:

博主主攻后端,对于electron自动升级也是费了非常多的事儿,github、gitee也下载了很多源码。发现案例可能好用,但是很难融入公司的项目。

要注意的点如下:

1.Electron版本问题。

2.Electron-Vue版本问题。(我手里的项目使用的electron-vue版本为"vue-electron": "^1.0.6",对应的electron是 "electron": "^2.0.4",当前最新版是13+了)

3.electron-builder 版本问题。

步骤1:如果您使用的也是低版本的vue-electron,请先手动升级electron版本,至于5、8+、12这几个版本升级废弃的配置,以及对既有项目的影响,还是要注意。我这里例举几个

(1) 单实例启动的变化

const shouldQuit = app.makeSingleInstance(() => {
   if (mainWindow) {
     mainWindow.setSkipTaskbar(false);
     if (mainWindow.isMinimized()) {
       mainWindow.restore();
     } else {
       mainWindow.show();
     }
   }
 });

变更为如下类似的写法

if (!gotTheLock) {
  app.quit();
} else {
  app.on('ready', () => {
    createWindow();
    if (process.platform !== 'darwin') {
      createTray();
    }
    mainWindow.webContents.openDevTools();
  });

ES写法:

src/main下新建一个update.js(其他位置也行,回头我贴个完整的开源案例出来)
 

import { dialog } from 'electron';
import { autoUpdater } from 'electron-updater';
import http from 'http';

// see https://www.electron.build/auto-update#events
autoUpdater.on('update-downloaded', (info) => {
  if (process.env.NODE_ENV === 'production') {
  // https://electronjs.org/docs/api/auto-updater#autoupdaterquitandinstall
  // 这里先拉取更新信息,在对话框中显示版本的更新内容
    const req = http.request('http://localhost:8000/info.txt', (req) => {
      let detail1 = '';
      req.setEncoding('utf-8');
      req.on('data', (chunk) => {
        detail1 += chunk.toString();
      });
      req.on('end', () => {
        dialog.showMessageBox(
          {
            icon: '/static/ico.ico',
            type: 'info',
            title: '软件更新',
            message: `已更新到最新版本(${info.version})请重启应用。`,
            detail: detail1,
            buttons: ['确定'],
          },
          (idx) => {
            // 点击确定的时候执行更新
            if (idx === 0) {
              autoUpdater.quitAndInstall();
            }
          },
        );
      });
    });
    req.end();
  }
});
export default autoUpdater;

index.js里引入:

import autoUpdater from './update';

然后再createWindow的时候,最后一个位置加入(生产环境下才可检查升级)

if (process.env.NODE_ENV === 'production') {
    autoUpdater.checkForUpdates();
  }

electron版本升级5+之后,默认关于nodejs相关的如下选项不开启。

mainWindow = new BrowserWindow({
    height: 900,
    width: 1500,
    fullscreenWindowTitle: true,
    fullscreenable: true,
    autoHideMenuBar: true,
    webPreferences: {
      nodeIntegration: true, // 在网页中集成Node
      nodeIntegrationInWorker: true,
      contextIsolation: false,
      enableRemoteModule: true,
    },
  });

要注意12版本之后,需要开启enableRemoteModule,webPerferences中的这几个选项,在5+版本之后,最好都打开,具体的含义自行阅读文档。解决的问题如下:

1.白屏(白屏的原因很多,大多都是因为5版本之后没有开启那几个选项造成的)

2.报错 

Uncaught ReferenceError: require is not defined

Module ....

甚至是require

我是怎么定位解决这个问题的呢,因为打包的情况下,默认是不开启F12的开发者控制台的,开启打包后开发者控制台选项。

或者按照如下修复:

对于github上给出的解决办法,我在此做出整理。

找到.electron-vue文件目录下的webpack.renderer.config.js文件,修改plugins中的new HtmlWebpackPlugin()为如下代码
new HtmlWebpackPlugin({
      filename: 'index.html',
      template: path.resolve(__dirname, '../src/index.ejs'),
      minify: {
        collapseWhitespace: true,
        removeAttributeQuotes: true,
        removeComments: true
      },
      isBrowser: false,
      isDevelopment: process.env.NODE_ENV !== 'production',
      nodeModules: process.env.NODE_ENV !== 'production'
        ? path.resolve(__dirname, '../node_modules')
        : false
    }),

修改src文件夹下的index.ejs文件为下述代码
<div id="app"></div>
<!-- Set `__static` path to static files in production -->
<% if (!htmlWebpackPlugin.options.isBrowser && !htmlWebpackPlugin.options.isDevelopment) { %>
  <script>
    window.__static = require('path').join(__dirname, '/static').replace(/\\/g, '\\\\')
  </script>
<% } %>

向src/main/index.js中加入配置选项
function createWindow () {
  // add the webPreferences property passed to BrowserWindow
  mainWindow = new BrowserWindow({
    height: 563,
    useContentSize: true,
    width: 1000,
    webPreferences: {
      nodeIntegration: true,
      nodeIntegrationInWorker: true
    }
  })
}

配置完成,打开electron-vue,成功。

原文作者:https://blog.csdn.net/liu19721018/article/details/109090522

感谢!

在dependency中加入只有在devDependency才有的electron-devtools-installer,electron-debug

 "electron-devtools-installer": "^2.2.4",

  "electron-debug": "^1.5.0", 

然后index.js中加入

 mainWindow.webContents.openDevTools();

 3.mainWindow.webContents.setlayoutZoomLevelLimits缩放相关的配置已经废弃了。

mainWindow.webContents.on('did-finish-load', () => {
    mainWindow.webContents.setZoomFactor(1);
    mainWindow.webContents.setVisualZoomLevelLimits(1, 1);
    // 8.0 以后已经移除
    // mainWindow.webContents.setLayoutZoomLevelLimits(0, 0);
  });

最重要的就是这个配置,这个是发布必须的:(可以在vue.config,package.json,或者backend.js中配置,有哪个就在哪个配置,别犹豫,这个地址是升级包路径,不需要写具体的名称)

"publish": {
      "provider": "generic",
      "url": "http://localhost:8000/"
 },

然后打包所需(这个跟自动升级没关系哈):

 "nsis": {
    "oneClick": true,
    "perMachine": true,
    "allowElevation": true,
    "allowToChangeInstallationDirectory": true,
    "createDesktopShortcut": true,
    "runAfterFinish": true,
    "installerIcon": "./build/icon.ico",
    "uninstallerIcon": "./build/icon.ico"
  },

然后就是网上遍地飞的了。

注意打包,注意升级服务器等。深夜了,先写这些。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[开发心得]Electron应用自动升级 autoUpdater的使用。 的相关文章

  • Windows下安装CUDA并配置cuDNN教程

    Windows下安装CUDA并配置cuDNN教程 一 查看电脑的显卡驱动版本 1 键盘点击Windows R或者在搜索栏输入cmd 进入命令提示符 2 在命令提示符下 输入nvidia smi 查看显卡驱动版本 本电脑显卡驱动版本为 456

随机推荐

  • React中引入百度地图API 避坑

    BMap is not defined 原因 React脚手架中全局变量都要用window去访问 解决 BMap改成window BMap访问 或者将BMap从window中解构出来 BMap前加了window 页面还是一片空白 原因 没有
  • QT中文输入法状态下获取键盘输入事件

    QT在中文输入法下 获取键盘的输入消息时 始终获取不到 但是在英文输入状态下是可以获取的 具体看代码 bool mytest eventFilter QObject obj QEvent ev if QEvent KeyPress ev g
  • 诚之和:自嗨锅能颠覆海底捞吗?

    为了避免独自外出就食的尴尬 实现独乐乐的满足感 催生了 一人食经济 2015年 自热火锅横空出世 一经面世就迅速在自热方便类食品中占据一席之地 特别受到年轻人的青睐 九成以上的消费者年龄在40岁以下 自热火锅以其新潮 便利等优势备受消费者欢
  • python实现螺旋矩阵

    import numpy 使用递归解决 def helixMatrix matrix x cur y cur number n if n 0 print matrix return 0 if n 1 matrix x cur y cur n
  • Python 程序设计-系统登录页面设计

    Python 程序设计 系统登录页面设计 目录 Python 程序设计 系统登录页面设计 1 需求分析 2 总体设计 3 详细设计 4 程序运行结果测试与分析 5 完整源代码 1 需求分析 系统要有管理员登录 普通用户登录和退出三个选项可供
  • Modbus协议简易入门教程

    背景 介绍modbus rtu之前 我们可以了解到 Modbus是施耐德电气公司 于1979年发明的 是全球第一个真正用于工业现场的总线协议 四十多年过去了 现在仍然被广泛使用在各个工业控制领域 除了这个协议很稳定的原因之外 1 免费 2
  • 【机会约束、鲁棒优化】机会约束和鲁棒优化研究优化【ccDCOPF】研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 随机规划的三个分支分别为期望值模型 机会约
  • 用一个变量控制线程里面的资源问题,线程可见性问题

    线程资源不可见原因 1 CPU高速缓存造成极短时间内数据的不可见 2 指令重排导致不可见 不可见测试 由上图可知 当我们改变eatFlag为true时 并没有输出我们预想的数据 例如 线程中资源正在运行 解决办法 1 线程休眠 sleep
  • Shell脚本基础

    1 变量 匹配规则 懒惰模式最短匹配 从头开始匹配 最短删除 root liudongyi var1 l love you but you love he root liudongyi var2 var1 ve root liudongyi
  • System Error Codes

    From http msdn microsoft com en us library windows desktop ms681382 28v vs 85 29 aspx Applies to desktop apps only Note
  • 如何开通TikTok广告账户?

    如何开通TikTok广告账户 大家好 我是项柚 一个专注于讨论TikTok玩法的跨境电商自媒体人 每天不断输出干货给需要的朋友 希望大家能少走弯路 TikTok Ads是TikTok广告投放的管理后台 汇集多款海外流量产品 覆盖 150 多
  • 数据库单表数据过亿_最受欢迎的三大数据库,你用过吗?

    随着市场的多元化 需求场景多样化 数据库也层出不穷 来适应不同的业务场景 今天小编就给大家总结一下目前下面来总结下目前最受欢迎的三大数据库 快来看看你有没有用过吧 1 MySQL MySQL是一种关系型数据库管理系统 关系数据库将数据保存在
  • C#和.NET FrameWork概述

    NET FrameWork是什么 NET FrameWork是由微软开发的一种面相对象的环境框架 特点如下 多平台 可在各种计算机 服务器 手机上运行 标准化通讯协议 如XML HTTP JSON等 安全性 CLR检查并确保参数及数据对象的
  • imx6之camera mipi

    1 IPU imx6qp有2个IPU 每个IPU有2个CSI 这个CSI并不是MIPI CSI 是内部的功能模块 static struct mipi csi2 platform data mipi csi2 pdata chans 4 m
  • js计算大额数据当中丢失精度以及消除科学计数法解决方案—decimal.js的使用

    目录 decimal js使用场景 decimal js介绍 decimal js使用 1 安装依赖 2 引入并使用 decimal js函数封装 decimal js使用场景 js有精度问题 对于一些金额的计算就总是与偶莫名其妙的问题 d
  • Java实战系列(1):SpringBoot+ShardingSphere实现多数据源切换

    主要组件版本信息 SpringBoot 2 2 8 RELEASE MyBatis Plus 3 3 2 ShardingSphere 4 0 0 RC2 需求说明 在企业开发中 如果业务数据分布在不同的数据源 那么我们就希望在访问业务数据
  • Linux查看进程和线程的CPU使用率、内存占用情况(找出那个捣蛋鬼)

    查看 cpu 占用率高的线程 ps H eo user pid ppid tid time cpu cmd sort cpu 例如 2 查看占用内存最多的程序 ps aux head 1 ps aux grep v PID sort rn
  • column in where clause is ambiguous MySQL异常

    在多表连接查询中 若连接条件字段在多个表中同名 却没有使用全限定名称 如 logicdeleteFlag 执行时会报这个异常 MySQL没办法识别 这个字段指的是哪个表的字段 必须使用全限定名称 如 tableName logicdelet
  • 尽量以const、enum、inline替换 #define——条款02

    这个条款或许改为 宁可以编译器替换预处理器 比较好 因为或许 define 不能被视为语言的一部分 一 比如定义一个宏 define ASPECT RATIO 1 653 这个ASPECT RATIO也许从未被编译器看见 也许在编译器开始处
  • [开发心得]Electron应用自动升级 autoUpdater的使用。

    前言 博主主攻后端 对于electron自动升级也是费了非常多的事儿 github gitee也下载了很多源码 发现案例可能好用 但是很难融入公司的项目 要注意的点如下 1 Electron版本问题 2 Electron Vue版本问题 我