使用 Electron 打包可执行文件和资源:完整实战教程
一.项目结构
项目结构建议如下:
my-electron-app/
├── example.exe ← 需打包的外部程序
├── config.json ← 配置文件
├── native-lib/ ← 自定义库或 DLL
│ └── yourlib.dll
├── main.js ← Electron 主进程入口
├── index.html ← 简单渲染页面├── package.json ← 应用与打包配置
二、安装依赖
首先初始化项目,并安装 Electron和 electron-builder:
npm init -y
npm install --save-dev electron electron-builder
三、编写主进程代码(main.js)
const { app, BrowserWindow } = require('electron');
const path = require('path');
const fs = require('fs');
const { spawn } = require('child_process');function createWindow() {const win = new BrowserWindow({width: 800,height: 600});win.loadFile('index.html');// 读取 JSON 配置const configPath = app.isPackaged? path.join(process.resourcesPath, 'config.json'): path.join(__dirname, 'config.json');const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));console.log('Loaded Config:', config);// 启动 example.execonst exePath = app.isPackaged? path.join(process.resourcesPath, 'example.exe'): path.join(__dirname, 'example.exe');spawn(exePath, [], {cwd: app.isPackaged ? process.resourcesPath : __dirname,detached: true,stdio: 'ignore'});
}app.whenReady().then(createWindow);
四、HTML 页面(index.html)
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>Electron Resource Demo</title>
</head>
<body><h1>Hello from Electron!</h1><p>example.exe 已在后台执行。</p>
</body>
</html>
五、配置 package.json
关键配置在于 build
部分,确保你指定了所有需要打包的资源文件。
{"name": "example-electron","version": "1.0.0","main": "main.js","scripts": {"start": "electron .","dist": "electron-builder"},"build": {"appId": "com.skydimo.exampleapp","productName": "Electron Resource Example","files": ["**/*"],"extraResources": [{"from": "example.exe","to": "resources/example.exe"},{"from": "config.json","to": "config.json"},{"from": "native-lib/","to": "native-lib"}],"win": {"target": "nsis","icon": "icon.ico"},"nsis": {"oneClick": false,"allowToChangeInstallationDirectory": true}},"devDependencies": {"electron": "^28.0.0","electron-builder": "^24.0.0"}
}
说明:
-
extraResources
: 是关键,它将你自定义的.exe
、.json
、DLL 文件一并打包到最终的resources
文件夹中; -
process.resourcesPath
: Electron 打包后会将所有extraResources
放到这里; -
app.isPackaged
: 判断是否是打包后的运行环境。
六、运行 & 打包
启动开发环境:
npm start
打包生成 .exe
:
npm run dist
输出目录默认在 dist/
,你会看到:
dist/
├── win-unpacked/
├── Electron Resource Example Setup 1.0.0.exe ← 安装包
七、测试打包后行为
打包后双击运行 .exe
安装程序后,你的应用应该能:
-
正常打开窗口;
-
正确读取配置文件;
-
成功启动
example.exe
; -
正常加载 DLL 等附加库文件(如你使用的是本地模块)。
小贴士
场景 | 处理方式 |
---|---|
配置文件读取 | 用 fs.readFileSync(path) 搭配 process.resourcesPath |
加载本地库 | 放在 native-lib/ 目录下,打包配置中加上路径 |
执行外部程序 | 使用 spawn() ,避免阻塞主线程 |
调试路径问题 | console.log(process.resourcesPath) 看清真实路径 |
总结
通过 electron-builder
的 extraResources
配置,我们可以轻松地将自定义的 .exe
程序、.json
配置文件、本地库一并打包,并通过 Node.js 的路径处理函数在运行时加载它们。这不仅能保持项目结构清晰,也让部署和运行更简单稳定。
注意事项:运行时错误与调试建议
即使按照博客教程一步步来,也有可能在打包后遇到一些运行时错误。下面是一些 常见错误场景 和对应的 解决建议,帮助你根据实际情况灵活调整 main.js
和 package.json
。
1. 找不到资源文件 / 配置文件
错误现象:
ENOENT: no such file or directory, open '.../config.json'
解决方法:
-
问题来源:开发环境用的是
__dirname
,但打包后要用process.resourcesPath
; -
解决方案:统一路径判断:
const configPath = app.isPackaged
? path.join(process.resourcesPath, 'config.json')
: path.join(__dirname, 'config.json');
2. example.exe 无法启动或崩溃
错误现象:
-
Electron 报错
spawn ENOENT
; -
example.exe
启动了但马上退出; -
没有任何反馈。
解决方法:
-
确认文件是否被打包:打包后去
dist/win-unpacked/resources/
看是否有example.exe
; -
调整启动方式:
spawn(exePath, [], {
cwd: path.dirname(exePath),
detached: true,
stdio: 'ignore'
});
-
example.exe 有依赖项(如 DLL):确保这些 DLL 也通过
extraResources
被打包进来。
3. DLL/动态库加载失败
解决方法:
-
把
.dll
文件和.exe
放在同一目录,或在native-lib/
中统一管理; -
添加:
"extraResources": [
{
"from": "native-lib/",
"to": "native-lib"
}
]
-
程序中使用完整路径引入 DLL:
const libPath = app.isPackaged
? path.join(process.resourcesPath, 'native-lib', 'yourlib.dll')
: path.join(__dirname, 'native-lib', 'yourlib.dll');
4. 图标不生效 / 打包失败
可能原因:
-
图标不是
.ico
格式; -
图标路径不正确。
解决方法:
-
将
icon.ico
放在项目根目录; -
配置:
"win": {
"icon": "icon.ico"
}
终极调试技巧
console.log('App Path:', app.getAppPath());
console.log('Resources Path:', process.resourcesPath);
console.log('Is Packaged:', app.isPackaged);
这些日志可以让你在运行时清楚知道资源到底应该在哪、程序是打包状态还是开发状态。
建议:打包前 checklist
检查项 | 是否确认 ✅ |
---|---|
所有资源是否加进 extraResources | ✅ |
所有路径是否做了 isPackaged 判断 | ✅ |
example.exe 是否独立可运行 | ✅ |
所有 DLL 是否与 EXE 同目录 | ✅ |
控制台是否打印真实路径调试信息 | ✅ |
要是打包之后运行遇到问题,咱们可以一起交流看看,你也可以把 main.js
和 package.json
发过来,我这边也帮着看一眼,或许能一起摸索出个思路来,把 .exe
和资源搞定
相关文章:
使用 Electron 打包可执行文件和资源:完整实战教程
一.项目结构 项目结构建议如下: my-electron-app/ ├── example.exe ← 需打包的外部程序 ├── config.json ← 配置文件 ├── native-lib/ ← 自定义库或 DLL │ └── yourlib.dll ├── main.js …...
【网络安全】CI/CD 流水线漏洞
【网络安全】CI/CD 流水线漏洞 1. 保护您的软件管道:CI/CD 安全2. 什么是 CI/CD 以及它为何重要?2.1 持续集成(CI):构建坚实的基础2.2 持续交付(CD):准备发布2.3 持续部署࿰…...
计算机是如何工作的(上)
对于学习JavaEE初阶为什么要知道计算机是如何工作的,是因为在未来我们写代码的时候,会出现一些bug,而在代码层面是看不出来的,所以我们需要了解一些关于计算机内部是如何工作的,从而提高代码的健壮度。 计算机的组成&…...
【SF顺丰】顺丰开放平台API对接(Java对接篇)
对接前置篇: 【SF顺丰】顺丰开放平台API对接(注册、API测试篇)_顺丰api接口对接指南-CSDN博客 1.实现效果展示 2.SF顺丰开放平台,JDK资源下载。 下载地址:顺丰开放平台 3.将下载的JDK放入项目中。 4.将JDK资源引入p…...
【KWDB创作者计划】_针对KWDB时序数据库(多副本集群环境)进行压力测试
【KWDB创作者计划】_针对KWDB时序数据库(多副本集群环境)进行压力测试 1. 概述2. 压测环境部署3. 生成测试数据4. 写入性能测试5. 查询性能测试7. 总结 1. 概述 KWDB是一款主要应用于工业物联网、数字能源、车联网、智慧产业等领域的时序数据库ÿ…...
24.中医知识问答删除历史对话功能前端代码实现
前端实现对话删除功能的完整指南 功能概述 前篇文章介绍了删除历史对话的后端开发,本篇将介绍如何在前端实现一个完整的对话删除功能,包括用户确认、API调用、状态管理和错误处理等关键环节。 功能拆解 1. 用户确认机制 javascript const confirmDe…...
在Cursor编辑器上部署MCP(Minecraft Coder Pack)完整指南
MCP(Minecraft Coder Pack)是用于反编译和修改Minecraft Java版代码的工具包。本教程将详细介绍如何在Cursor编辑器中配置和运行MCP,以便高效地进行Minecraft模组开发或代码研究。 1. 准备工作 1.1 所需工具 Cursor编辑器(基于VS…...
STM32——相关软件安装
本文是根据江协科技提供的教学视频所写,旨在便于日后复习,同时供学习嵌入式的朋友们参考,文中涉及到的所有资料也均来源于江协科技(资料下载)。 Keil5 MDK安装 1.安装Keil5 MDK2.安装器件支持包方法一:离线…...
蓝牙WiFi模组rtl8821cs在Android14调
环境 SDK: AOSP14 主控:RK3576 蓝牙:RTL8821CS 先记一下官网文档关于蓝牙的资料 蓝牙 | Android Open Source Project 还在调,先看看啥情况,点赞多或者想起来记录再回来 TODO...
MCP实践第一步--磕磕碰碰搭环境
由于deepseek-r1不支持function calling,所以我们采用了deepseek-v3进行实践,模型名称为deepseek-chat,在deepseek官网获取api-key。 一、参照MCP官网设置环境 创建项目目录 uv init mcp-client # 若没有uv,则先通过pip instal…...
Java并发:线程池
目录 一、核心概念与设计原理 1、线程池的核心价值 2、核心接口和类 3、线程池的核心构造参数 4、线程池工作流程 二、参数选择 1、任务队列选择 2、拒绝策略选择 3、常见线程池选择 4、参数调优 三、 应用 1、创建建议 2、生命周期管理:优雅关闭 3、…...
Kubernetes集群超配节点容量
目录: 1、节点超配简介2、创建 PriorityClass3、运行请求节点容量的 Pod4、调整占位资源请求5、设置所需的副本数量6、自动扩缩容组件6.1、手动方式6.2、自动方式 1、节点超配简介 节点超配是一种主动预留部分集群计算资源的策略。这种预留有助于减少在扩缩容事件期…...
每日一题(小白)回溯篇7
首先我们可以判断出这是一个dfs的题目,因为简言之就是要求最短路径。其次这个题目与直接找最短路径有所不同,增加了条件必须依次穿过指定的符号。无论坦克走到任何一点都有四个方向可以走(越界要判断),结束的条件是到达…...
rk3588上完成halcon的形状模型配准以及和opencv的图像转换
一、准备工作 1)安装好halcon,确保halcon的c的调用是正常的 2)编译好opencv 上面的两个步骤,均可以参考我的两个博文完成: Halcon在linux及ARM上的安装及c工程化_halcon linux-CSDN博客 RK3588上编译opencv 及基于…...
Spring Boot 断点续传实战:大文件上传不再怕网络中断
精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 一、痛点与挑战 在网络传输大文件(如视频、数据集、设计稿)时,常面临: 上传中途网络中断需重新开始服务器内…...
Springboot集成websocket实现消息推送
假设有个需求需要多个用户同时在对应的消息面板实时查看相关接口的执行流程进度,此时可以可考虑使用websocket来实现结果进度推送 一、引入websocket依赖,并编写WebSocket配置类 <dependency><groupId>org.springframework.boot</group…...
PostgreSQL 用户资源管理
PostgreSQL 用户资源管理 PostgreSQL 提供了多种机制来管理和限制用户对数据库资源的使用,以下是全面的资源管理方法: 1 连接限制 1.1 限制最大连接数 -- 在 postgresql.conf 中设置 max_connections 100 -- 全局最大连接数-- 为特定用户设置连接限…...
Uniapp:pages.json页面路由
目录 一、pages二、style 一、pages uni-app 通过 pages 节点配置应用由哪些页面组成,pages 节点接收一个数组,数组每个项都是一个对象,其属性值如下: 属性类型默认值描述pathString配置页面路径styleObject配置页面窗口表现nee…...
使用open3d将pcd点云按照颜色等级分块显示并令其随颜色变化播放
👑主页:吾名招财 👓简介:工科学硕,研究方向机器视觉,爱好较广泛… 💫签名:面朝大海,春暖花开! 使用open3d将pcd点云按照颜色等级分块显示并令其随颜色变化播放 引言显示效果点云获取完整代码引言 有很多时候我们需要更改pcd点云某些区域的颜色,可能是颜色随着点…...
玩转Docker | 使用Docker部署nullboard任务管理工具
玩转Docker | 使用Docker部署nullboard任务管理工具 前言一、nullboard介绍简介主要特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署nullboard服务下载镜像创建容器创建容器检查容器状态检查服务端口安全设置四、访问nullboard服务访问nullboard首页五…...
如何避免流程形式化导致的效率低下?
要避免流程形式化导致的效率低下,核心在于:聚焦流程价值、保障执行灵活性、优化流程设计、建立反馈机制、提升执行感知。其中,聚焦流程价值 是解决流程“空转”的首要原则。流程不应只是文档或制度的堆叠,而要服务于业务目标&…...
Java学习手册:HTTP 协议基础知识
一、HTTP 协议概述 HTTP(HyperText Transfer Protocol)即超文本传输协议,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传输协议。它是一个应用层协议,基于请求-响应模型…...
基于多模态融合算法的航空武器毁伤评估技术方案
基于多模态融合算法的航空武器毁伤评估技术方案 1. 引言 航空武器毁伤评估(Damage Assessment, DA)是现代战争中的关键环节,直接影响后续作战决策。传统的人工评估方式效率低、主观性强,且在高强度战场环境下难以实时完成。因此,本研究提出一种基于多模态融合算法的自动…...
欧拉-国产操作系统替代产品如何
欧拉(openEuler)国产操作系统是由华为发起并联合开源社区共同开发的企业级操作系统,旨在构建自主可控的数字基础设施生态底座。以下从开发背景、技术特点、应用场景、生态建设及市场表现等方面进行全面介绍: 一、开发背景与战略定位 国家需求驱动 在中美技术竞争背景下,国…...
入门-C编程基础部分:16、 预处理器
飞书文档https://x509p6c8to.feishu.cn/wiki/DzSJwsGiTiXkeCkyEYUcuXbKnbf C 预处理是编译过程中一个单独的步骤,是一个文本替换工具而已。所有的预处理命令都是以井号(#)开头。 指令描述#define定义宏#ifdef如果宏已经定义,则返…...
Spark-SQL4
一 .Spark-SQL核心编程(六) Spark-SQL连接Hive Apache Hive 是 Hadoop 上的 SQL 引擎,Spark SQL 编译时可以包含 Hive 支持,也可以不包含。包含 Hive 支持的 Spark SQL 可以支持 Hive 表访问、UDF (用户自定义函数)、Hive 查询语…...
模数转换【1】AD7699
1.开发背景 一款可以模数转换芯片,兼容通用 SPI 接口,支持最多支持 8 个通道和 500KSPS 的采样率。支持单个通道采集和扫描采集模式。 同系列的芯片还有 AD7682 和 AD7689 等。 2.开发需求 配置内部参考电压4.096V,实现单个通道采集和扫描采集…...
P5670 秘籍-反复异或 Solution
Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1,a2,⋯,an) 和常数 m m m,有 q q q 个操作分两种: add ( l , r , x ) \operatorname{add}(l,r,x) add(l,r,x):对每个 i ∈ [ l , r ] i\in[l,r] …...
PID控制程序编写
目录 一、C语言PID控制器示例代码 二、代码解释 三、重要注意事项 一、C语言PID控制器示例代码 #include <stdio.h> #include <stdlib.h> #include <unistd.h> // For sleep function typedef struct { double Kp; // 比例增益 double…...
推荐系统/业务,相关知识/概念2
一、漫画库更新大量新作品,如何融入推荐系统? 参考答案: 快速提取新作品特征:除基础属性外,利用自然语言处理技术提取漫画简介关键词等丰富特征向量,分析情节、角色设定等深层次特征结合物品画像体系分类…...
基于Python的施工图与竣工图对比小工具开发方案
基于Python的施工图与竣工图对比小工具开发方案 一、引言 在工程建设领域,施工图与竣工图的对比是项目验收的关键环节。传统人工对比方式效率低、易出错,本文基于Python开发一款自动化对比工具,支持快速检测图纸差异并生成可视化报告&#x…...
2025年世界职业院校技能大赛实施方案(意见稿)
为贯彻落实《教育强国建设规划纲要(2024—2035年)》,进一步提升世界职业院校技能大赛(以下简称“大赛”)内涵质量,发挥大赛引领作用,提升高技能人才培养质量,服务现代职业教育体系建…...
辛格迪客户案例 | 苏州富士莱医药GMP培训管理(TMS)项目
一、案例概述 富士莱医药股份有限公司位于美丽的江南水乡常熟,前身为常熟富士莱医药化工有限公司,从建厂初期面积仅有10余亩,逐步扩展到100余亩。近年来公司飞速发展,以黑马姿态发展成为中国专业生产硫辛酸系列产品、肌肽系列产品…...
安恒安全渗透面试题
《网安面试指南》https://mp.weixin.qq.com/s/RIVYDmxI9g_TgGrpbdDKtA?token1860256701&langzh_CN 5000篇网安资料库https://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247486065&idx2&snb30ade8200e842743339d428f414475e&chksmc0e4732df793fa3bf39…...
【基于WSAAsyncSelec模型的通信程序设计】
文章目录 一、实验背景与目的二、实验设计与实现思路1. 设计思想2. 核心代码实现 总结 一、实验背景与目的 这次实验主要是为了让大家了解基于 WSAAsyncSelect 模型通信程序的编写、编译和执行过程。通过实践操作,深入掌握这种模型在实现计算机之间通信时的应用。 …...
Spring Boot+Mybatis设置sql日志打印
Spring BootMybatis设置sql日志打印 在全局配置文件添加以下内容:logging.level.com.demo.mapperdebug,com.demo.mapper:src下的mapper路径,debug:设置日志打印级别为debug,亦可设置为:ERROR、…...
Java 性能优化:从硬件到软件的全方位思考
Java 性能优化:从硬件到软件的全方位思考 在数字化飞速发展的当下,Java 作为广泛使用的编程语言,在各个应用领域发挥着关键作用。而 Java 性能优化作为提升系统运行效率、降低成本的核心环节,需要我们从硬件到软件进行全方位深入…...
ros2 humble moveit调试笔记
Overview — ROS2 Grasp Library Tutorials 0.5.0 documentation Robot Interface — ROS2 Grasp Library Tutorials 0.5.0 documentation 手动添加ompl_planning.yaml文件 planning_plugins:- ompl_interface/OMPLPlanner # To optionally use Ruckig for jerk-limited s…...
静态点亮数码管的某几段(STC89C52单片机)
#include <reg52.h> sbit ADDR0 P1^0; sbit ADDR1 P1^1; sbit ADDR2 P1^2; sbit ADDR3 P1^3; sbit ENLED P1^4; void main() { ENLED 0; //使能U3,选择数码管DS1 ADDR3 1; ADDR2 0; ADDR1 0; ADDR0 0; P0 0xF9; /…...
搭建哨兵架构
Redis大纲 3.1.sentinel环境准备: a.3个sentinel实例信息: 1.sentinel实例信息如下,sentinel只是起到监控作用,不存放数据!!2.为了节省资源,在同一台虚拟机开启3个实例,必须准备三…...
阿里云入门手册
阿里云入门手册 一、付费方式二、云计算基础概念(一)云计算定义(二)云计算优势(三)云计算部署模式(四)专有网络 VPC 三、阿里云ECS实例(一)实例类型ÿ…...
AI日报 - 2024年04月22日
🌟 今日概览(60秒速览) ▎🤖 模型进展 | Google发布Gemini 2.5 Flash,强调低延迟与成本效益;Kling AI 2.0展示多轴运动视频生成;研究揭示SLM在知识图谱上优于LLM,RLHF在推理提升上存局限。 ▎💼…...
Windows BilibiliHistoryFetcher-v1.3.2-v1.2.1-开源B站历史记录管理工具[支持批量管理下载]
Windows BilibiliHistoryFetcher 链接:https://pan.xunlei.com/s/VOONAVJpANYPmzu1Zc3B0q1XA1?pwdnrjc# 使用说明: 以1.3.2与1.2.1版本为例 需要下载 BiliBili-History-Frontend 前端程序,在下载 BilibiliHistoryAnalyzer 解压运行&#…...
CH585单片机的LCD外设怎么驱动段式LCD
1、首先这里只讲应用,不讲具体原理。 要驱动段式LCD,这里就要知道占空比的调整,比如1/4为例就需要4个COM口。这4个COM口由单片机自行驱动,你不用管。就像硬件IIC和SPI,时序问题不用你去操心,你要做的就是向…...
包管理工具有哪些?主流软件分享
常见的包管理工具主要有:npm、Yarn、pnpm、Composer、Maven、pip、Conda 等,其中 npm 是目前全球使用最广泛的JavaScript包管理工具,以丰富的生态、便捷的使用体验以及强大的社区支持闻名。npm具备依赖管理、版本控制、脚本执行等强大功能&am…...
【网络安全】OWASP 十大漏洞
1. OWASP 十大漏洞 为了应对未来的风险,安全专业人员需要随时掌握最新信息。之前,您了解了CVE 列表,这是一个公开的已知漏洞和暴露列表。CVE 列表是全球安全社区相互共享信息的重要信息来源。 在本文中,您将了解安全专业人士参考…...
Fortran中FORALL的用法与性能分析
Fortran中FORALL的用法与性能分析 FORALL语句的基本用法 FORALL是Fortran 95引入的一种结构,用于表达并行数组操作。它的基本语法如下: FORALL (index start:end:stride, mask)array(index) expression END FORALL或者更复杂的多维度形式࿱…...
web组件和http协议
1.web组件 2.自定义元素 3.影子DOM 4.HTML模板 5.http协议 6.tcp ip协议...
论文笔记-arXiv2025-FilterLLM
论文笔记-arXiv2025-FilterLLM: Text-To-Distribution LLM for Billion-Scale Cold-Start Recommendation FilterLLM:面向十亿级冷启动推荐的文本到分布大语言模型摘要1.引言2.前言2.1符号说明2.2文本到判断2.2.1候选生成(从数十亿到数百)2.2…...
Anaconda Prompt 切换工作路径的方法
直接切换是不生效的: (base) C:\Users\96975>cd D:\weiban-tool-master\weiban-tool-master需要先回到根目录C盘,然后切换到目标文件夹盘符,进一步切换到目标文件夹 (base) C:\Users\96975>cd ..(base) C:\Users>cd ..(base) C:\&g…...