vue3集成electron

news2024/11/24 15:00:56

安装说明

vue集成electron时,会用到两个依赖。分别是electron和electron-builder,前者是开发环境下使用,后者是打包部署时使用。安装时,可在线安装也可离线安装。所谓离线安装就是自己下载好用到的包,然后放到指定目录下。其实在线安装时候,也是这个过程,只是它自己去下载包。

本次集成过程,没有开VPN,访问github,基本不通。所以最终安装时候,采用了在线+离线方式安装,因为有些包需要从github上下载。整个安装过程如下。

创建一个vue3项目

创建过程参考vue3官网。执行npm run dev运行项目,浏览器页面展示如下:

安装electron作为开发依赖

用上面创建的vue3项目做测试,开始集成electron。执行如下命令开始安装。

npm install electron --save-dev

通常这一步安装会报如下错误。

这是因为镜像地址问题,有些没有配置,有些无法访问。所以我们直接手动修改镜像地址,改为国内镜像源。

说明一下,npm的配置文件是.npmrc,相当于Maven中的配置文件settings.xml。都是用来管理依赖包的镜像源。文件路径一般在用户目录下,如C:\Users\ZHANGJUN\.npmrc。

我们也可以用命令查找下

npm config get userconfig

现在我们执行如下命令,修改配置文件,将electron镜像源添加进去。我这里用的华为镜像源,用其他的都行。只要能正常访问即可。

npm config set ELECTRON_MIRROR https://repo.huaweicloud.com/electron/

如果因为权限问题或其他问题,导致上面命令报错,添加失败。我们也可以直接打开配置文件,手动修改。

可以直接到文件目录下,打开文件,如C:\Users\ZHANGJUN\.npmrc。也可以通过命令打开。执行如下命令后,会弹出npmrc页面,然后将上面地址添加进去。

npm config edit

修改完后,再次执行npm install electron --save-dev。又出现如下错误,后面排查是版本问题。所以安装命令带上版本号。

npm install electron@29.1.1 --save-dev

可以看到,在带上版本后,安装成功。我们也可以在package.json和node_modules中看到添加的electron内容。

添加electron配置文件

在项目跟目录下创建electron目录,然后新增main.js、preload.js等

main.js代码

const { app, BrowserWindow, Menu, session, globalShortcut } = require('electron')
const { join } = require('path')
const path = require('path')
//const preloadPath = app.isPackaged ? "../../preload.js" : "../preload.js";
const preloadPath = './preload.js'
const renderProcessApi = path.resolve(__dirname, preloadPath)
// process.env.DIST = join(process.env.DIST_ELECTRON, "../dist");
// const indexHtml = join(process.env.DIST, "index.html");
process.env['ELECTRON_DISABLE_SECURITY_WARNINGS'] = true
const createWindow = async () => {
  Menu.setApplicationMenu(null)
  const win = new BrowserWindow({
    // width: 1024,
    // height: 768,
    width: 1040,
    height: 807,
    fullscreen: true, //全屏
    title: 'electron测试项目',
    // frame: false, //直接去除导航头部
    show: true,
    webPreferences: {
      webSecurity: false,
      nodeIntegration: true,
      enableRemoteModule: true,
      contextIsolation: false,
      preload: renderProcessApi
    }
  })
  // win.loadFile(join(__dirname, "../dist/index.html"));

  const env = app.isPackaged ? 'production' : 'development'
  console.log('env ' + env)
  console.log('process.env.NODE_ENV ' + process.env.VITE_APP_ENV)
  const indexHtml = {
    development: 'http://localhost:5173', // 开发环境
    // development: join(__dirname, "../dist/index.html"), // 开发环境
    production: join(__dirname, '../dist/index.html') // 生产环境
  }

  if (app.isPackaged) {
    win.loadFile(indexHtml[env])
  } else {
    win.loadURL(indexHtml[env])
  }
  globalShortcut.register('Ctrl + Shift + i', function () {
    win.webContents.openDevTools()
  })
  globalShortcut.register('f11', function () {
    if (win.isFullScreen()) {
      win.setFullScreen(false)
    } else {
      win.setFullScreen(true)
    }
  })
}
app.whenReady().then(async () => {
  // if (!app.isPackaged) {
  //   await session.defaultSession.loadExtension(
  //     join(__dirname, "../plugins/vuetools6.6.1_0")
  //   );
  // }
  createWindow()
  app.on('activate', () => {
    if (BrowserWindow.getAllWindows().length === 0) createWindow()
  })
})
app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') app.quit()
})

preload.js代码

// 所有的 Node.js API接口 都可以在 preload 进程中被调用.
// 它拥有与Chrome扩展一样的沙盒。
window.addEventListener('DOMContentLoaded', () => {
  const replaceText = (selector, text) => {
    const element = document.getElementById(selector)
    if (element) element.innerText = text
  }

  for (const dependency of ['chrome', 'node', 'electron']) {
    replaceText(`${dependency}-version`, process.versions[dependency])
  }
})

这里简单解释下main.js和preload.js。

main.js

  1. 任何 Electron 应用程序的入口都是 main 文件。 这个文件控制了主进程,它运行在一个完整的Node.js环境中,负责控制应用的生命周期。
  2. 在此脚本中,使用 Electron 的 app 和 BrowserWindow 模块来创建一个浏览器窗口,在一个单独的进程(渲染器)中显示网页内容。

preload.js

  1. 预加载脚本,在electron网页页面加载前执行,可以做一些初始化工作。
  2. 暴露 Node.js 功能给渲染进程。通过在 preload.js 中使用 exposeInMainWorld 方法,开发者可以将 Node.js 的模块或 Electron 的功能安全地暴露给渲染进程的页面。这样,渲染进程就可以像使用前端库一样使用这些功能,而不需要直接操作 Electron 的远程对象。
  3. 提供安全的上下文环境:preload.js 运行在一个特殊的上下文中,它与页面的普通 JavaScript 环境是隔离的。这样可以防止页面脚本直接访问 Node.js 的某些敏感功能,增强了应用的安全性。
  4. 模块化管理:preload.js 可以作为模块化管理的入口,将一些通用的逻辑或工具函数预先加载到渲染进程中,以便在不同的页面或组件中复用。

main.js主要用来创建一个window窗口,调用api设置窗口大小、样式等。并设置开发环境和生产环境下访问地址。

而preload.js主要用来进行一些初始化工作,比如读取配置文件,全局初始化等。

添加完上面两个js后,还有一个配置要修改。那就是package.json。将type改为commonjs,main改为electron/main.js。然后在scripts中新增一条语句:"start": "vite | electron ."

到此配置工作结束,运行项目,看能否正常显示。执行

npm run start

页面以window窗口形式运行,里面页面展示和浏览器展示效果一样。至此,vue3开发环境集成electron就基本结束了。

electron打包构建

项目最终还是要打包部署,这里使用electron-builder。执行命令安装

npm install electron-builder -D
 或 
npm install electron-builder@24.13.3 -D

修改package.json,添加打包信息。

在scripts标签中新增命令:"electron:build": "vite build && electron-builder"。后续执行npm run electron:build 即可完成打包。

新增build字段,添加如下内容:

"build": {
    "productName": "electronDemo",
    "appId": "electronDemo",
    "asar": true,
    "directories": {
      "output": "dist-electron/${version}"
    },
    "files": [
      "dist",
      "electron"
    ],
    "nsis": {
      "oneClick": false,
      "allowToChangeInstallationDirectory": true,
      "installerIcon": "./electron/icon.ico",
      "uninstallerIcon": "./electron/icon.ico",
      "installerHeaderIcon": "./electron/icon.ico",
      "createDesktopShortcut": true,
      "createStartMenuShortcut": true,
      "shortcutName": "electron系统"
    },
    "mac": {
      "category": "your.app.category.type"
    },
    "win": {
      "icon": "./electron/icon.ico",
      "target": [
        {
          "target": "nsis",
          "arch": [
            "ia32"
          ]
        }
      ]
    },
    "linux": {}
  }

其中:

  • productName:项目名,也是生成的安装文件名
  • appId:软件的ID,用来上架各平台
  • nsis:软件安装包的交互行为,配置稍多
  • win.icon: 应用图标
  • win.target.arch:建议设置ia32,适配windows大部分版本
  • "asar": false, 打包时不进行加密

修改完后,执行命令。开始打包

npm run electron:build

构建过程中,会从github上下载三个包,分别是winCodeSign-2.6.0.7z、nsis-3.0.4.1.7z、nsis-resources-3.4.1.7z。前文已经说过,github基本访问不通,所以我这里下载肯定失败。报错如下:

前文也说过,npm在线下载过程也是从远程服务器上把安装包下载到本地。所以这里我就手动把这三个包都下载下来。然后放到对应的electron缓存目录下。至于electron缓存目录及执行过程详细情况,大家仔细百度(基本就是首次将包下载到缓存中,以后直接从缓存中获取)。

electron缓存目录路径为:C:\Users\zjun\AppData\Local

可以看到有两个,electron开发环境时用到,也就是在我们执行npm install electron@29.1.1 --save-dev时,它会把包下载到electron/Cache下。同理,如果这个命令也下载不了,我们也可以先把包下载下来,然后放到这个缓存目录下。包名就是electron-v29.1.1-win32-ia32.zip。

这是electron/Cache下内容

这是electron-builder/Cache下内容。只需将三个安装包放到对应目录下,然后解压即可。

三个包都添加完后,再次执行打包命令:npm run electron:build。不出意外下,打包成功,如下图:

target显示的就是打包后的名称及路径。到这个目录下,双击exe安装。

安装成功后,桌面会有exe的快捷方式。运行看是否正常。

至此。electron的集成和打包基本结束。

至于某些博主提到的热更新:npm install nodemon -D和命令行合并工具:npm install npm-run-all -D。我发现项目已经有了这些功能,所以就不再安装。需要测试的话,可自行安装测试。

参考文档:

  1. https://blog.csdn.net/weixin_45687201/article/details/136424017
  2. 使用electron创建桌面应用及常见打包错误解决_wincodesign-2.6.0.7z-CSDN博客
  3. vite+vue3+electron项目搭建教程_electron vue3 vite配置-CSDN博客
  4. https://blog.csdn.net/qq_39124701/article/details/128299948
  5. 简介 | Electron
  6. 全网详解 .npmrc 配置文件:比如.npmrc的优先级、命令行,如何配置.npmrc以及npm常用命令等-CSDN博客

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

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

相关文章

Spring Boot知识管理系统:安全与合规性

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式,是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示: 图4-1系统工作原理…

HI3516DV500 相机部分架构初探

Hi3516DV500 是一颗面向视觉行业推出的高清智能 Soc。该芯片最高支持 2 路 sensor 输入,支持最高 5M30fps 的 ISP 图像处理能力,支持 2F WDR、多级降噪、六轴防 抖、多光谱融合等多种传统图像增强和处理算法,支持通过 AI 算法对输入图像进行实…

Mysql(3)—数据库相关概念及工作原理

一、数据库相关概念 ​ 数据库(Database, DB) : 数据库是一个以某种有组织的方式存储的数据集合。它通常包括一个或多个不同的主题领域或用途的数据表。 数据库管理系统(Database Management System, DBMS) &#xf…

树莓派应用--AI项目实战篇来啦-15.SSD Mobilenet V3目标检测

1. Mobilenet 介绍 Mobilenet 是一种专为移动和嵌入式视觉应用而设计的卷积神经网络。它们不使用标准的卷积层,而是基于使用深度可分离卷积的简化架构,使用这种架构,我们可以为移动和嵌入式设备(例如:树莓派&#xff0…

Navicat 关于SQLserver的连接问题

1、如果出以下问题,就需要安装驱动程序,如下图: 2、在Navicat的根目录下有一个驱动安装文件,安装后就可以连接上了.

Cisco ACI常见问题FAQ科普

这里有个思科的官方链接,不过里面很多是商务说辞,也就是吹牛,仅做为参考。 https://www.cisco.com/c/dam/global/en_sg/solutions/data-center-virtualization/application-centric-infrastructure/insieme_faq.pdf 下面是我自己的理解 0 …

Windows 安装Redis(图文详解)

Windows 安装Redis(图文详解) Redis是什么数据库? Remote Dictionary Server(Redis) 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语…

CleanMyMac X4.15.9破解版激活码许可证

CleanMyMac X:你的Mac电脑的“私人健身教练” ### 一键瘦身,轻松给Mac电脑“减减肥” 🏋️‍♂️ 大家有没有觉得,自己的Mac电脑用久了,就变得越来越“胖”,越来越慢呢?别怕,今天我要…

Qt获取磁盘信息+表格显示

效果展示 主要代码 获取磁盘相关数据 获取磁盘数据 Qt 没有提供相关的接口,需要使用 Windows API。接口解释如下: BOOL GetDiskFreeSpaceExW([in, optional] LPCWSTR lpDirectoryName,[out, optional] PULARGE_INTEGER lpFreeBytesAvailable…

chattts一步步的记录,先跑起来。

0.下载git工具 Git - Downloads (git-scm.com)https://git-scm.com/downloads Download – TortoiseGit – Windows Shell Interface to Githttps://tortoisegit.org/download/ 1.安装 随意,可以安汉化,也可不安。无所谓 2.建个目录,我的上…

Prometheus+Grafana 监控 K8S Ingress-Ningx Controller

文章目录 一、prometheus中添加ingress-nginx的服务发现配置二、ingress-nginx controller的service添加端口暴露监控指标三、grafana添加ingress-nginx controller的监控模版 ingress-nginx默认是没有开启监控指标的,需要我们在ingress-nginx controller的svc里面开…

K8S配置MySQL主从自动水平扩展

前提环境 操作系统Ubuntu 22.04 K8S 1.28.2集群(1个master2个node) MySQL 5.7.44部署在K8S的主从集群 metrics-server v0.6.4 概念简介 在K8s中扩缩容分为两种 ●Node层面:对K8s物理节点扩容和缩容,根据业务规模实现物理节点自动扩…

数字媒体技术基础:色度子采样(4:4:4、4:2:2 、4:2:0)

在数字视频处理中,色度子采样 Chroma Subsampling可以用于压缩视频文件的大小,同时在大多数情况下保持较高的视觉质量,它的原理基于人类视觉系统对亮度 Luminance比对色度 Chrominance更加敏感这一特点。 一、 采样格式的表示方法 色度子采样…

一个技巧实现在SharePoint中使用Copilot

前几天写了在onedrive中使用copilot对单个文件进行提问汇总分析与对多个文件进行比较汇总提问等: Copilot重磅更新!OneDrive全新功能炸裂 很多小伙伴表示特别受用。 于是他们在纷纷尝试了一段时间后,开始把目光转向SharePoint和teams文件&a…

tkinter库的应用小示例:文本编辑器

tkinter库的应用小示例:文本编辑器 要 求: 创建一个文本编辑器,功能包括,创建、打开、编辑、保存文件。一个Button小组件,命名为btn_open,用于打开要编辑的文件,一个Button小组件,命名为btn_s…

Dockerfile 详解

Dockerfile是自定义Docker镜像的一套规则,由多条指令构成,每条指令都会对应于Docker镜像中的每一层,因为Docker是分层存储的。以下是Dockerfile中各个参数的详解及演示解析: 1. FROM 功能:指定待扩展的父级镜像&#…

JavaScript 访问者模式:打造高扩展性的对象结构

一. 前言 在面向对象编程中,访问者模式(Visitor Pattern)是一种行为设计模式,它允许我们向现有的类结构添加新的操作,而无需修改这些类。这对于需要对类层次结构中的元素进行复杂算法处理的场景非常有用。 本文将详细…

【硬件模块】HC-08蓝牙模块

蓝牙模块型号 HC-08蓝牙模块实物图 HC-08蓝牙模块引脚介绍 STATE:状态输出引脚。未连接时,则为低电平。连接成功时,则为高电平。可以在程序中作指示引脚使用; RXD:串口接收引脚。接单片机的 TX 引脚(如…

多线程(三):线程等待获取线程引用线程休眠线程状态

目录 1、等待一个线程:join 1.1 join() 1.2 join(long millis)——"超时时间" 1.3 join(long millis,int nanos) 2、获取当前线程的引用:currentThread 3、休眠当前进程:sleep 3.1 实际休眠时间 3.2 sleep的特殊…

Canvas:AI协作的新维度

在人工智能的浪潮中,OpenAI的最新力作Canvas,不仅是一款新工具,它标志着人工智能协作方式的一次革命性飞跃。Canvas为写作和编程提供了一个全新的交互界面,让用户能够与ChatGPT进行更紧密、更直观的协作。 ​​​​​​​ Canvas的…