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

news2024/11/20 0:37:51

文章目录

  • 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()
    })
  })
// 窗口全部关闭时执行退出APP
  app.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.coloradmin.cn/o/755903.html

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

相关文章

linux原生串口开发

1.在linux环境下封装串口相关代码 &#xff08;1&#xff09;vi uartTool.c #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <stdarg.h> #include <string.h> #include <termios.h> #include <unistd.h> #…

thinkphp 上传图片

public function upload_img(){// 读取图片资源// 存储路径$path "uploads/avatar";$file request()->file(background_img);// 存储图片$info $file->rule(uniqid)->move($path);// 存储成功if ($info) {//获取到上传图片的路径名称$name_img $path . …

计算机组成原理课程设计 报告

在我的博客查看&#xff1a;https://chenhaotian.top/study/computer-composition-principles-course-design/ 计算机组成原理课程设计 报告 一、目的和要求 深入了解计算机各种指令的执行过程&#xff0c;以及控制器的组成&#xff0c;指令系统微程序设计的具体知识&#xf…

plsql如何将表导出excel,同时表头是中文字段名

1、导出表中所有的字段名和对应注释&#xff0c;导出ecxel。 SELECT t.column_name,t.comments FROM user_col_comments t WHERE TABLE_NAMEHT_ORDER_INFO; 2、根据导出的excel自动生成查询的SQL。 3、根据SQL进行导出。

【菜鸟の笔记_利用Excel自动总结表格数据_自动链接word文本】

自动更新总结表格数据 1. 撰写原因2. 解决的问题3. Excel自动总结表格数据内容&#xff08;一段话&#xff09;。3.1问题引出3.2解决方式 4.Excel数据、总结内容&#xff0c;自动链接更新Word文本 1. 撰写原因 【GPT的答案】利用Excel自动总结表格数据有以下好处&#xff1a; …

mmc记录

1、获取csd&#xff0c;也就是DSR寄存器 说是应该可以获取块长度、卡存储容量等&#xff0c;但是在8953上&#xff0c;没看到这个日志 参考&#xff1a; 一、有6个主要的和寄存器 1、OCR寄存器 描述了存储卡的Vdd电压描述 &#xff0c;总共32Bit Bit31 --- 卡上电状态位&…

【已解决】JavaScript为控件绑定事件死活不生效

本博文源于最近操作的JavaScript一个诡异的事情。我在用js一个动态生成的按钮&#xff0c;然后想要为其绑定一个alert的事件&#xff0c;结果发现控制台给我报未定义的错误&#xff0c;我慌的不要要的&#xff0c;经过长时间胡乱尝试终于解决了。 问题再现 dataHtml "&…

ModaHub魔搭社区:AI原生云向量数据库Zilliz Cloud数据类型JSON

JSON 全称为 JavaScript Object Notation,是一种轻量级且易于使用的文本数据格式。JSON 字段由键值对组成,其中每个键是一个字符串,其相应的值可以是数字、字符串、布尔值、列表或数组。Zilliz Cloud 支持将字段以字典的形式插入到集群的 Collection 中。 以下示例代码展…

快速小巧的粘贴应用程序Hasty Paste

什么是 Hasty Paste? Hasty Paste 是一个快速粘贴文本并共享的地方&#xff0c;主要用于共享调试日志等&#xff0c;以帮助开发人员提供技术支持。该项目的目标是既快又小。 命令行安装 在群晖上以 Docker 方式安装。 官方的镜像没有发布在 docker hub&#xff0c;而是在 gh…

(超详解)---->> 动态内存管理

目录 本章重点 1&#xff1a;malloc,calloc,realloc,free 函数 2:常见动态内存错误 3&#xff1a;几道经典的笔试题 1&#xff1a;malloc&#xff0c;calloc&#xff0c;realloc&#xff0c;free函数 首先我们平时所创建的变量和数组都是在栈区上开辟的内存&#xff0c;空间开…

Maven的exec插件

Maven的exec插件介绍 利用maven的exec插件可以执行系统和Java程序。 官网资源 exec插件官网&#xff1a;https://www.mojohaus.org/exec-maven-plugin/java-mojo.html Goals exec:exec表示在一个单独的进程内执行系统和Java程序。 exec:java表示在当前的Java虚拟机内执行J…

基于FPGA的一维卷积神经网络算法实现(1D-CNN、BNN的FPGA加速实现)

文章目录 概要网络结构一维卷积介绍&#xff08;科普性质&#xff09;FPGA架构FPGA端口定义操作步骤结果演示总结 概要 本文介绍一种基于FPGA的1维卷积神经网络算法加速实现的方案&#xff0c;其中为了进一步提升运算速度&#xff0c;除了第一层卷积采用的是普通卷积运算&…

带你认识从 “�“ 到 “锟斤拷“ 错误编码

以一首五言绝句作为开篇&#xff0c;你知道背后说的是什么吗&#xff1f; 手持两把锟斤拷 口中疾呼烫烫烫 脚踏千朵屯屯屯 笑看万物锘锘锘 &#xfffd; 为何物&#xff1f; 在前不久石头哥的这篇文章中 —— 你可能也会掉进这个简单的 String 的坑&#xff0c;讲述了因字…

【sgUploadTray】上传托盘自定义组件,可实时查看上传列表进度

【sgUploadTray】上传托盘自定义组件&#xff0c;可实时查看上传列表进度 特性&#xff1a; 可以全屏可以还原尺寸可以最小化可以回到右下角默认位置支持删除队列数据 sgUploadTray源码 <template><div :class"$options.name" :show"show" :size…

架构训练营学习笔记3-5:消息队列备选架构设计实战

本文属于架构训练营学习笔记系列&#xff1a;模块3的案例讲解 总的来说&#xff0c;这篇从更高的维度去讲&#xff0c;而不是关注消息队列的常见问题&#xff1a;比如消息如何发送&#xff0c;消息如何不丢失 &#xff0c;消息如何不重复。总体上分为2部分&#xff1a;利益干系…

LaTex 1【字体、符号、表格】

​&#xff08;上一期已经安装完软件&#xff0c;但是突然出现了一点子问题不会解决&#xff0c;先用overleaf来学习吧&#xff0c;网站还是很给力的&#xff09; 关键字部分&#xff1a; \quad:代表空格【无论你打多少个空格都不是空格&#xff0c;要输入“\quad”】 字体部分…

github进不去的解决办法

github就凭运气进吧&#xff0c;偶尔能进去。 介绍几个可以快速进的办法&#xff1a; 第一个&#xff0c;安装插件&#xff1a;&#xff08;在microsoft搜索watt toolkit插件并安装&#xff09; 然后勾选github选项&#xff1a; 接着返回你github网站就可以了。 第二个&#…

简单工厂模式详解

文章目录 前言一、简单工厂模式定义二、举个例子三、简单工厂模式的缺点总结 前言 本篇我们了解一下简单工厂模式&#xff0c;它是设计模式的雏形&#xff0c;是学习设计模式的开端&#xff0c;我会结合案例说明它的设计思路。 一、简单工厂模式定义 简单工厂模式并不是GoF23…

JSX的基础使用

1. JSX嵌入变量作为子元素的使用 ①当变量是Number、String、Array类型时&#xff0c;可以直接显示&#xff1b; ②当变量是null、undefined、Boolean类型时&#xff0c;内容为空&#xff1b; 若想要展示nul、undefined、Boolean类型&#xff0c;转字符串&#xff1b;转换方式…

堆--二叉树的特有形式

目录 前言1.二叉树的顺序结构及实现1.1二叉树的顺序结构1.2堆的概念及结构 2.堆的功能函数的实现2.1堆结构体的定义2.2堆的初始化2.3堆的插入2.4 获取堆是否为空、堆大小、堆顶元素的函数2.5堆的销毁2.6对利用堆结构数组的数据建堆2.7堆的删除堆结构的源码 3.堆排序建堆的时间复…