web前端项目使用electron打包成跨平台桌面端程序(Windows)

文章目录

  • Electron是什么?
  • 快速入门
    • 基本使用要求
    • 从github下载一个开源项目
    • 执行启动脚本运行项目
    • 安装electron依赖包
    • 编写electron入口文件,在package.json中配置入口文件路径和electron执行脚本
    • 启动electron脚本,运行electron应用
  • 应用打包Windows平台
    • 安装electron-builder
    • electron打包配置
    • vue项目编译
    • 修改electron入口文件中窗口渲染网页的路径
    • electron打包
  • 安装应用
  • 执行程序

Electron是什么?

Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建 在Windows上运行的跨平台应用 macOS和Linux——不需要本地开发 经验。

快速入门

基本使用要求

在使用Electron进行开发之前,您需要安装 Node.js。 我们建议您使用最新的LTS版本。
查看本地安装node版本以及npm版本:

node -v
npm -v

在这里插入图片描述
本次打包的前端项目使用vue开发,查看vue版本

vue -V

在这里插入图片描述

从github下载一个开源项目

使用vue开发的PC端web前端项目
(Angular、React、Vue或者纯HTML+CSS+JavaScript都可以)
使用VSCode打开项目,执行npm install下载项目依赖包
在这里插入图片描述

npm install

在这里插入图片描述

执行启动脚本运行项目

查看项目package.json包查看脚本
在这里插入图片描述
执行npm run dev启动项目

npm run dev

启动报错:
在这里插入图片描述

  • 原因:node V17版本发布了OpenSSL3.0对算法和秘钥大小增加了更为严格的限制,node V17(包含)以后的版本会出现这个错误
  • 解决:将SET NODE_OPTIONS=–openssl-legacy-provider 加入到package.json里vue的脚本中,如果只需要启动项目只需要在启动脚本前加即可
    在这里插入图片描述
    再次执行npm run dev
npm run dev

在这里插入图片描述
在这里插入图片描述

安装electron依赖包

安装前:

{"name": "manage-desk","version": "0.1.0","private": true,"scripts": {"dev": "SET NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve","build": "SET NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service build","lint": "SET NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service lint"},"dependencies": {"@jiaminghi/data-view": "^2.3.8","core-js": "^2.6.5","vue": "^2.6.10"},"devDependencies": {"@vue/cli-plugin-babel": "^3.11.0","@vue/cli-plugin-eslint": "^3.11.0","@vue/cli-service": "^3.11.0","@vue/eslint-config-standard": "^4.0.0","babel-eslint": "^10.0.1","eslint": "^5.16.0","eslint-plugin-vue": "^5.0.0","less": "^3.0.4","less-loader": "^5.0.0","vue-template-compiler": "^2.6.10"},"eslintConfig": {"root": true,"env": {"node": true},"extends": ["plugin:vue/essential","@vue/standard"],"rules": {},"parserOptions": {"parser": "babel-eslint"}},"postcss": {"plugins": {"autoprefixer": {}}},"browserslist": ["> 1%","last 2 versions"]
}
npm install --save-dev electron//只需要在开发环境安装即可

在这里插入图片描述

编写electron入口文件,在package.json中配置入口文件路径和electron执行脚本

  • 新建一个electron文件夹,创建main.js文件为入口文件,文件名都可以随意写,在package.json中指定好main字段即可
const { app, BrowserWindow } = require('electron');// 该方法创建一个窗口
const createWindow = () => {// 初始化浏览器窗口设置参数const win = new BrowserWindow({width: 1500,height: 800,minWidth:1200,minHeight:600})// 加载页面win.loadURL('http://localhost:8080');}//在 Electron 中,只有在 app 模块的 ready 事件被激发后才能创建浏览器窗口。您可以通过使用 app.whenReady() API来监听此事件。在whenReady()成功后调用createWindow()。app.whenReady().then(() => {createWindow()// 当 Linux 和 Windows 应用在没有窗口打开时退出了,macOS 应用通常即使在没有打开任何窗口的情况下也继续运行,并且在没有窗口可用的情况下激活应用时会打开新的窗口。// 为了实现这一特性,监听 app 模块的 activate 事件。如果没有任何浏览器窗口是打开的,则调用 createWindow() 方法。// 因为窗口无法在 ready 事件前创建,你应当在你的应用初始化后仅监听 activate 事件。 通过在您现有的 whenReady() 回调中附上您的事件监听器来完成这个操作。app.on('activate', () => {if (BrowserWindow.getAllWindows().length === 0) createWindow()})})
// 窗口全部关闭时执行退出APPapp.on('window-all-closed', () => {// 虽然你现在可以打开一个浏览器窗口,但你还需要一些额外的模板代码使其看起来更像是各平台原生的。 应用程序窗口在每个OS下有不同的行为,Electron将在app中实现这些约定的责任交给开发者们。// 一般而言,你可以使用 进程 全局的 platform 属性来专门为某些操作系统运行代码。// 在Windows和Linux上,关闭所有窗口通常会完全退出一个应用程序。// 为了实现这一点,你需要监听 app 模块的 'window-all-closed' 事件。如果用户不是在 macOS(darwin) 上运行程序,则调用 app.quit()。if (process.platform !== 'darwin') app.quit()console.log("window-all-closed:窗口全部关闭,程序退出!");})

在这里插入图片描述

启动electron脚本,运行electron应用

npm run start

electron打开一个独立的窗口,本质上就是一个浏览器窗口,electron通过渲染进程渲染网页,通过主进程运行main.js,将与本地交互的代码如获取蓝牙设备信息等都交给主进程执行
在这里插入图片描述
前面在监听全部窗口关闭时间里打印了一句话:

在这里插入图片描述
中文乱码解决:修改electron启动脚本

"start": "chcp 65001 && electron ."

在这里插入图片描述

应用打包Windows平台

安装electron-builder

npm install electron-builder  --save-dev

在这里插入图片描述

electron打包配置

在package.json中添加build顶层键配置构建配置

 //electron打包构建配置"build": {"copyright":"Copyright © 2023","directories""output":"./output-electron"//打包输出目录},"win":{//打包win程序包的配置"target": [{"target": "nsis","arch": ["x64" //打包64位包]}]},"nsis":{//打包成安装包的配置"oneClick":false,//设置不允许一键安装"allowToChangeInstallationDirectory":true //允许安装时选择安装目录}}

在这里插入图片描述
在package.json里添加electron-builder的打包脚本

"pack": "electron-builder --dir",
"build-electron": "electron-builder  "

在这里插入图片描述

vue项目编译

在vue.config.js中编写编译配置,vue脚本编译时会自动读取该文件

module.exports = {publicPath: process.env.NODE_ENV === 'production'? './': '/',//编译出来的文件使用相对路径可直接浏览器打开渲染,否则需要放在一个http服务器中解析outputDir:"dist",//打包输出目录assetsDir:"static",//静态资源存放目录}

执行vue编译脚本

npm run build

在这里插入图片描述

在这里插入图片描述

修改electron入口文件中窗口渲染网页的路径

因为打包成桌面可执行程序后不再从网络地址中渲染页面,而是渲染本地html+css+JavaScript资源

 win.loadFile(path.join(__dirname,"../",publicPath,outputDir,"index.html"));//Y因为main.js在electron文件夹中,所以需要../退出一级到根目录下再拼接路径

设置取消默认的菜单目录

const { app, BrowserWindow,Menu } = require('electron');
//取消窗口顶部菜单目录
Menu.setApplicationMenu(null);

在这里插入图片描述

electron打包

执行electron打包脚本

npm run build-electron

在这里插入图片描述

安装应用

在这里插入图片描述
选择安装目录
在这里插入图片描述

执行程序

在这里插入图片描述

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

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

相关文章

1.监控分布式--zabbix

文章目录 监控分布式-zabbix、prometheus概念工作原理功能组件部署zabbix安装Nginx和PHP环境部署数据库编码安装zabbix编译安装zabbix server客户端安装zabbix agent服务 监控分布式-zabbix、prometheus 利用一个优秀的监控软件,我们可以: 通过一个友好的界面进行…

27. 移除元素

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面…

简单爬虫项目练习

爬虫项目练习 前言任务基本爬虫框架URL管理器Html 下载器HTML 解析器数据存储器爬虫调度器效果分析 前言 自学,参考书籍为 Python爬虫开发与项目实战 ,具体参考了该书的第六章。过程中出现两个问题: 在 Pycharm 上实现时发现有些库名更改及…

计算机网络——数据链路层

文章目录 **1 数据链路层的功能****1.1 为网络层提供服务****1.2 链路管理****1.3 帧定界,帧同步与透明传输****1.4 流量控制****1.5 差错控制** **2 组帧****2.1 字符计数法****2.2 字符填充的首尾定界符法****2.3 零比特填充的首尾标志法****2.4 违规编码法** **3…

P5705 【深基2.例7】数字反转

题目描述 输入一个不小于 100100 且小于 10001000,同时包括小数点后一位的一个浮点数,例如 123.4123.4 ,要求把这个数字翻转过来,变成 4.3214.321 并输出。 1.题目分析: 这道题可以从多个角度解题,使用字…

MSP430学习笔记(四)丨I2C通信(MSP430F5529驱动OLED显示屏)

本篇文章包含的内容 一、USCI_B——I2C主模式操作1.1 函数调用顺序说明1.2 不同情况下的函数调用顺序二、I2C通信库函数三、OLED驱动代码​  笔者学习采用单片机型号为MSP430F5529,使用MSP-EXP430F5529LP开发板。 ​  笔者拥有一定的STM32基础,在学习MSP430的过程中,最开…

Ceph 分布式存储之资源池管理

一、资源池 Pool 管理(在admin和node三个节点都可) 1、资源池介绍 上面我们已经完成了 Ceph 集群的部署,但是我们如何向 Ceph 中存储数据呢?首先我们需要在 Ceph 中定义一个 Pool 资源池。Pool 是 Ceph 中存储 Object 对象抽象概…

10.6.5 【Linux】分区命令: split

如果你有文件太大,导致一些携带式设备无法复制的问题,split可以将一个大文件,依据文件大小或行数来分区,可以将大文件分区成为小文件,快速有效。 将文件分区的话,使用-b size来将一个分区的文件限制其大小&…

YOLOv8的目标对象的分类,分割,跟踪和姿态估计的多任务检测实践(Netron模型可视化)

YOLOv8是目前最新版本,在以前YOLO版本基础上建立并加入了一些新的功能,以进一步提高性能和灵活性,是目前最先进的模型。YOLOv8旨在快速,准确,易于使用,使其成为广泛的目标检测和跟踪,实例分割&a…

模拟行走机器人-python

leetcode第874题 链接https://leetcode.cn/problems/walking-robot-simulation 机器人在一个无限大小的 XY 网格平面上行走,从点 (0, 0) 处开始出发,面向北方。该机器人可以接收以下三种类型的命令 commands : -2 :向左转 90 度…

前端晋升答辩-性能优化篇范式

本文力争为你参加晋升答辩时,提供一个论述性能优化相关工作的范式。简单点儿来说,就是按照这个范式文来准备、阐述,就可以博得晋升评委的认可与喜爱。 痴迷写页面UI的前端千篇一律,懂得量化收益的前端万里挑一。 现在已经不是刀…

C++--list简单实现

1.什么是list list是CSTL容器中的一部分,list是带头双向链表,list的作用是它可以存储数据,头删尾删的时间复杂度为O(1),但不支持随机访问。list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前…

vue2与vue3—引入echarts以及使用

安装echarts npm install echarts --save vue2中的引入与使用 main.js中 import { createApp } from vue import * as echarts from echarts //主要代码 import App from ./App.vue const app createApp(App) app.mount(#app) vue组件中 <div id"myChart"…

微信小程序音乐播放功能代码

咱就是话不多说直接上代码&#xff0c;不让亲戚老爷们苦等。 首先&#xff0c;在你的小程序页面的js文件中&#xff0c;定义音乐播放相关的数据和方法&#xff1a; Page({data: {isPlaying: false,audioContext: null},onLoad: function () {// 创建音频上下文this.setData({au…

Hadoop——大数据生态体系详解

一.大数据概论 1.1 大数据概念 大数据&#xff08;big data&#xff09;&#xff1a;指无法在一定时间范围内用常规软件工具进行捕捉、管理 和处理的数据集合&#xff0c;是需要新处理模式才能具有更强的决策力、洞察发现力和流程 优化能力的海量、高增长率和多样化的信息资产…

【无标题】使用html2canvas和jspdf生成的pdf在不同大小的屏幕下文字大小不一样

问题&#xff1a;使用html2canvas和jspdf生成的pdf在不同大小的屏幕下文字大小不一样&#xff0c;在mac下&#xff0c;一切正常&#xff0c;看起来很舒服&#xff0c;但是当我把页面放在扩展屏幕下&#xff08;27寸&#xff09;&#xff0c;再生成一个pdf&#xff0c;虽然排版一…

ARM Coresight 系列文章 8 - ARM Coresight 通过 APBIC 级联使用

文章目录 APBIC 回顾APBIC 级联 上篇文章&#xff1a;ARM Coresight 系列文章 7 - ARM Coresight 通过 AHB-AP 访问 异构 cpu 内部 coresight 组件 APBIC 回顾 APBIC 可以连接一个或者多个APB BUS masters&#xff0c; 例如连接一个 APB-AP 组件和带有 APB 接口的 Processor&…

js几种打印方法的几种方法

方法一&#xff1a;使用printJs库实现打印功能 1. 引入插件&#xff1a; 首先&#xff0c;在您的 HTML 文件中引入printJs库。可以通过在<head>标签中添加以下代码来引入库文件&#xff1a; <script src"https://printjs-4de6.kxcdn.com/print.min.js"&g…

【C++】STL——vector的使用、 vector增删查改函数的介绍和使用、push_back和pop_back、operator[]

文章目录 1.vector的使用2.vector的增删查改&#xff08;1&#xff09;push_back 尾插&#xff08;2&#xff09;pop_back 尾删&#xff08;3&#xff09;find 查找&#xff08;4&#xff09;insert 在position之前插入val &#xff08;5&#xff09;erase 删除指定位置的数据&…

【云原生】Kubernetes工作负载-Deployment

Deployments 一个 Deployment 为 Pod 和 ReplicaSet 提供声明式的更新能力 你负责描述 Deployment 中的目标状态&#xff0c;而 Deployment 控制器&#xff08;Controller&#xff09; 以受控速率更改实际状态&#xff0c; 使其变为期望状态。你可以定义 Deployment 以创建新…