electron应用重启,开机自启动(electron开发常用的方法、优化方案)

news2024/11/25 1:20:39

文章目录

  • electron应用重启
  • electron开机自启动
    • To run a local app, execute the following on the command line:
  • electron应用重启 获取应用软件的安装路径
  • electron中屏幕全屏,最大化,最小化,恢复
  • electron启动白屏时间过长优化方案
    • 1. 按需加载模块
    • 2. 窗口先创建后隐藏,初始化后再展示
    • 3. web性能优化
    • 4. 优化主进程(electron.js)

electron应用重启

不会了一定先去参考官网:electron官网
在这里插入图片描述

主进程中监听

  ipcMain.on('window-reset', function () {
    app.relaunch()
    app.exit()
  })

页面中调用

    const restartApp = () => {
      ipcRenderer.send("window-reset");
	}

electron开机自启动

  const ex = process.execPath;
  开机是否自启动
  const isDevelopment = process.env.NODE_ENV !== "production";
  //注意:非开发环境
  if (!isDevelopment){
      if (process.platform === "darwin") {
        app.setLoginItemSettings({
          openAtLogin: true,//是否开机启动
          openAsHidden: true//是否隐藏主窗体,保留托盘位置
        });
      } else {
        app.setLoginItemSettings({
          openAtLogin: true,
          openAsHidden: true,
          path: updateExe,
          args: [
            "--processStart",
            `"${ex}"`,
            "--process-start-args",
            `"--hidden"`
          ]
        });
      }
  }

To run a local app, execute the following on the command line:

如果不启用非开发环境的话,开发者电脑开机会出现:To run a local app, execute the following on the command line: 弹框,解决方法就是开发环境不启用开机自启动,代码如上

electron应用重启 获取应用软件的安装路径

思路:用nodejs去先定时重启应用,在杀死对应软件的进程(一定要定时),不要用setTimeout 这个方法只能linux生效比较麻烦,windows中的timeout不会执行下一条命令

electron.js 主进程中写监听事件

  const ex = process.execPath;//获取应用安装路径(注意开发环境和打包环境)
  ipcMain.on('restart', (event, restart) => {
    console.log(app.getLoginItemSettings())
    if (restart) {
      //主要是这句 ex 调试时是electron路径 打包后才是运行程序路径
      app.setLoginItemSettings({ openAtLogin: true, path: ex, args: [] });
      event.sender.send('restartPath', ex);
    } else {
      app.setLoginItemSettings({ openAtLogin: false, path: ex, args: [] });
    }
  })

页面中写一个重启应用的函数
注意:这里的shelljs我用的shelljs插件,可以用node去执行cmd命令

    const restartApp = () => {
    const isWin = process.platform === 'win32';
    const isLin = process.platform === 'linux';
    const isMac = process.platform === 'darwin';

      if (isWin) {
        // ipcRenderer.send('isFullScreen', 'appQuit');
        ipcRenderer.send('restart', true);
        ipcRenderer.once('restartPath', (a: any, path: any) => {

          console.log("restartPath2:", path);
          shelljs.exec("timeout /T 1 && start " + path, (a: any, b: any, c: any) => { })
          shelljs.exec("taskkill /im BaiyiApp.exe /f", (a: any, b: any, c: any) => { })
        });
      } else if (isLin) {
        ipcRenderer.send('restart', true);
        ipcRenderer.once('restartPath', (a: any, path: any) => {
          shelljs.exec("sleep 1 && " + path, { silent: true }, (a: any, b: any, c: any) => { })
          shelljs.exec(`pkill -9 -f '${path} --enable-crashpad'`, { silent: true }, (a: any, b: any, c: any) => { })
        });

        // shelljs.exec("sleep 1 && /opt/BaiyiApp/baiyiapp", { silent: true }, (a: any, b: any, c: any) => { })
        // shelljs.exec("pkill -9 -f '/opt/BaiyiApp/baiyiapp --enable-crashpad'", { silent: true }, (a: any, b: any, c: any) => { })
      } else {
        ipcRenderer.send('isFullScreen', 'appQuit');
        ipcRenderer.send('restart', true);
        ipcRenderer.once('restartPath', (a: any, path: any) => {
          shelljs.exec("sleep 1 && " + path, { silent: true }, (a: any, b: any, c: any) => { })
          shelljs.exec(`pkill -9 -f '${path} --enable-crashpad'`, { silent: true }, (a: any, b: any, c: any) => { })
        });
      }
    }

electron中屏幕全屏,最大化,最小化,恢复

主进程

  ipcMain.on('isFullScreen', function (event, type) {
    if (type == 'big') {
      mainWindow.setFullScreen(true) //全屏(包括底部的侧边栏)
    } else if (type == 'small') {
      mainWindow.setFullScreen(false) //退出全屏
    } else if (type == 'minimize') {
      mainWindow.minimize()// 最小化
    } else if (type == 'appQuit') {
      app.quit();//退出
    }else if(type == ''){
	   mainWindow.restore();// 将窗口恢复为之前的状态.
	}else if(type == 'max'){
		mainWindow.maximize()//最大化(不包含侧边栏)
	}else if(type == 'unMax'){
       mainWindow.unmaximize()//退出最大化
	}
  });

electron启动白屏时间过长优化方案

1. 按需加载模块

把不需要马上用到的模块推迟到要用时候引入,避免头部文件一次性引入过多依赖,页面加载过于臃肿(比如ui组件库,和一些js插件)

2. 窗口先创建后隐藏,初始化后再展示

有点类似于障眼法,没有从根本上去优化速度

const options = {
    width: 500,
    height: 890,
    center: true,
    title: '桌面开发App',
    icon: path.join(__dirname, 'icon.png'),

    webPreferences: {
      preload: path.join(__dirname, 'preload.js'),
      nodeIntegration: true,
      // enableRemoteModule:true,
      contextIsolation: false,
      nodeIntegrationInWorker: true,
      enableRemoteModule: true,
      webSecurity: false,
      // 允许使用webview
      //   webviewTag: true
    },

	//优化速度重点在这里
    show: false, // newBrowserWindow创建后先隐藏

  }
  // Create the browser window.
  const mainWindow = new BrowserWindow(
    options
  );

  globalShortcut.register('Control+Shift+i', function () {
    mainWindow.webContents.openDevTools()
  })

  mainWindow.on('focus', () => {
    globalShortcut.register('CommandOrControl+F', function () {
      if (mainWindow && mainWindow.webContents) {
        mainWindow.webContents.send('on-find', '')
      }
    })
  })
  mainWindow.on('blur', () => {
    globalShortcut.unregister('CommandOrControl+F')
  })
	
	//优化速度重点在这里
  mainWindow.on('ready-to-show', () => {
    mainWindow.show() // 初始化后再显示
  })

3. web性能优化

electron客户端是基于h5页面开发,优雅简洁高性能代码加快启动速度

4. 优化主进程(electron.js)

使用node.js子进程,优化主进程负担,也可以new 一个Worker做线程上的处理,不过不可以和页面dom做交互,适用于用户频繁操作与缓存对比等场景

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/721158.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

web测试需要注意几个非常重要的测试点

微软语言标准: 全角字符和半角字符都要使用一个空格分开 英文和数字直接要有空页面分辨率: 通常是计算机的默认分辨率,但是还是会有一些老式电脑存在1024*768的情况 浏览器的兼容性: 目前市场上的主流浏览器:IE8.0-…

Kubernetes入门实战课-k8s的基本架构

Kubernetes入门实战课-k8s的基本架构 文章目录 Kubernetes入门实战课-k8s的基本架构Kubernetes 的基本架构标准工作语言 YAML学习经验总结 Kubernetes 的基本架构 Kubernetes 扮演的角色就如同一个“大师级别”的系统管理员,具有丰富的集群运维经验,独创…

Java多线程基础-10:代码案例之定时器

定时器就是一个闹钟。它可以设定一个时间,当时间到,就可以执行某个指定的代码。 定时器是实际开发中的一种非常常用的组件。比如网络通信中,如果对方 500ms 内没有返回数据,则要求断开连接尝试重连;又比如一个 Map&…

华为OD机试真题 Python 实现【网上商城优惠活动(一)】【2022 Q4 100分】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描述四、补充说明五、Python算法源码六、效果展示1、输入2、输出3、说明 一、题目描述 某网上商城举办优惠活动,发布了满减、打折、无门槛3种优惠券,分别为: 1.每满100元优惠10元,无使用数…

测试开发 —— 快速定位问题

写在前面 这两天工作实在是有点小忙,感觉好久没更新了,但是平时也是有感而发的比较多,今天遇到一个问题,感觉挺有意思,处理过程也非常有意义,希望能给大家一个借鉴吧。 测试平台又又又出问题了 今天一位…

ARM_cortex-A7核UART总线

实验一:键盘输入一个字符a,串口工具显示b‘ 实验二:实现现象:键盘输入一个字符串,串口工具回显输入的字符串 uart4.h #ifndef __UART4_H__ #define __UART4_H__#include "stm32mp1xx_gpio.h" #include "stm32m…

vue+relation-graph绘制关系图实用组件

先在终端执行命令 vue create relationgraph创建一个vue2的项目 然后在编辑器中打开新创建的项目 在终端中执行命令 npm install relation-graph --save引入依赖 这样 我们relation-graph就进来了 然后 我们在需要使用的组件中编写代码如下 <template><div>&…

【HTML5+Springboot】农产品质量溯源大数据管理系统源码

一、前言 1.技术框架说明 开发工具&#xff1a;idea或eclipse前端框架&#xff1a;easyui &#xff0c;开发语言&#xff1a;java后端框架&#xff1a;spring bootmybatismysql数 据 库&#xff1a;mysql移 动 端&#xff1a;h5(扫码溯源)技术架构&#xff1a;spring bootmyb…

React Dva项目引入antd UI框架

上文 React 搭建DvaJS开发环境中我们大家了一个Dva的开发环境 那么 下面 我们就用dva项目引入一下antd 我们平时做react开发 主要也都会选择它 我们直接在项目终端执行 npm install antd^4.24.2 babel-plugin-import --save这样 我们的依赖包就进来了 babel-plugin-import是…

【精致的美少女-InsCode Stable Diffusion 美图活动一期】

&#x1f4a7; 【精致的美少女 − I n s C o d e S t a b l e D i f f u s i o n 美图活动一期】 \color{#FF1493}{【精致的美少女-InsCode Stable Diffusion 美图活动一期】} 【精致的美少女−InsCodeStableDiffusion美图活动一期】&#x1f4a7; &#x1f337; 仰望…

青岛大学_王卓老师【数据结构与算法】Week04_07_双向链表的删除_学习笔记

本文是个人学习笔记&#xff0c;素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享&#xff0c;另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权&#xff0c;请留言作删文处理。 课程视频链接&#xff1a; 数据结构与算法基础–…

Standalone是什么?Standalone集群的三类进程

Standalone是什么 Standalone模式是Spark自带的一种集群模式&#xff0c;不同于前面本地模式启动多个进程来模拟集群的环境&#xff0c;Standalone模式是真实地在多个机器之间搭建Spark集群的环境&#xff0c;完全可以利用该模式搭建多机器集群&#xff0c;用于实际的大数据处…

面向订单交付的ETO项目管理数字化解决方案︱高远科技PMO副总经理董方好

北京高远华信科技有限公司PMO副总经理董方好先生受邀为由PMO评论主办的2023第十二届中国PMO大会演讲嘉宾&#xff0c;演讲议题&#xff1a;面向订单交付的ETO项目管理数字化解决方案。大会将于8月12-13日在北京举办&#xff0c;敬请关注&#xff01; 议题简要&#xff1a; 订单…

机器学习洞察 | JAX,机器学习领域的“新面孔”

在之前的《机器学习洞察》系列文章中&#xff0c;我们分别针对于多模态机器学习和分布式训练、无服务器推理进行了解读&#xff0c;本文将为您重点介绍 JAX 的发展并剖析其演变和动机。下面&#xff0c;就让我们来认识一下 JAX 这一新崛起的深度学习框架—— 亚马逊云科技开发…

threejs课程笔记-20 向量点乘、叉乘

向量点乘dot 点乘是向量的一种运算规则&#xff0c;点乘也有其它称呼&#xff0c;比如点积、数量积、标量积。 threejs三维向量Vector3封装了一个点乘相关的方法.dot()&#xff0c;本节课主要目的就是让大家能够灵活应用点乘方法.dot() 已知向量a和向量b 已知两个向量a和b&…

设计模式3:单例模式:静态内部类模式是怎么保证单例且线程安全的?

上篇文章&#xff1a;设计模式3&#xff1a;单例模式&#xff1a;静态内部类单例模式简单测试了静态内部类单例模式&#xff0c;确实只生成了一个实例。我们继续深入理解。 静态变量什么时候被初始化&#xff1f; public class Manager {private static class ManagerHolder …

探索 Jetson Nano 为 myCobot 280 机械臂提供的强大功能

探索 Jetson Nano 为 myCobot 280 提供的强大功能&#xff0c;机器人技术的一个有前途的组合 介绍 近年来&#xff0c;科学技术的发展给我们的生活带来了许多新的产品和服务&#xff0c;包括机器人在各个领域的集成。机器人已经成为我们生活中必不可少的一部分&#xff0c;从…

C语言求鸡兔同笼问题案例讲解

前言&#xff1a; 作者本人在今年4月份参加了一个C语言考试&#xff0c;编程大题里有一道鸡兔同笼问题&#xff1b;本来以为简简单单&#xff0c;几分钟搞定&#xff0c;拿个满分&#xff1b;结果翻车了&#xff0c;因为我在考场的时候想着&#xff0c;母鸡到底有几只脚呢&…

FlinkCDC第二部分-搭建Flink单机服务,ctrl就完事~

Flink版本&#xff1a;1.16 环境&#xff1a;Linux CentOS 7.0、jdk1.8 基础文件&#xff1a;flink-1.16.2-bin-scala_2.12.tgz、flink-connector-jdbc-3.0.0-1.16.jar、flink-sql-connector-mysql-cdc-2.3.0.jar 1. 在目录/home/flink下解压flink-1.16.2-bin-scala_2.12.tg…

基于 R 对卫星图像进行无监督 kMeans 分类

一、前言 本文将向您展示如何使用 R 对卫星图像执行非常基本的 kMeans 无监督分类。我们将在 Sentinel-2 图像的一小部分上执行此操作。 Sentinel-2 是由欧洲航天局发射的一颗卫星&#xff0c;其数据可在此处免费访问。 我要使用的图像显示了 Neusiedl 湖的北部&#xff08;奥地…