Electron + React 应用打包全流程

news2025/4/13 5:24:35

(第一次用 Typora 写博,希望效果不错~)

这几天有个创意编程比赛,要写一个电脑端应用。我准备用 React.js + Electron 做(因为熟悉~),编程部分一路风雨无阻,到了打包却出现了问题。Electron 没打过包不知道,一打包一下两天两夜就没了(T_T)但最后还是打包成功了~ 由于里面坑很多,把我打包的流程浅写在下面,供需要的人参考。

1. 打包工具的选择

粽锁粥汁,Electron 的打包工具有两个:electron-packager 和 electron-builder。它们都可以把 Electron 应用打包成可执行文件。这里我果断选择了 electron-builder。原因有两点:

1. 打包文件体积小。用 electron-packager 我试着打了下包,打出来一下子两个 G。要知道我写的只是一个小程序,就占用两个 G…… 而使用 electron-builder 打包出来的文件才 91M 多。装在电脑上也才 400 多 M。

2. 和普通应用几乎没有区别。electron-packager 只能生成“绿色版”,也就是没有安装程序,直接运行里面的 exe。而 electron-builder 使用 NSIS,可以把安装包打包出来。运行安装包可以安装应用,电脑设置也能识别得到,也很方便卸载。

2. 生成静态文件

这一步我们就是要把 React 项目的静态文件打包出来。这一步虽然简单,但也有几个坑需要注意。如果你使用 React Router,那 BrowserRouter 要替换成 HashRouter,因为 BrowserRouter 打包之后路由使用不了,路由组件本应该显示的部分直接白屏。

在这里插入图片描述

然后就可以执行打包命令了。这个应该有学过。对于 npm,运行 npm run build。对于 yarn,就把前面的 npm 换成 yarn。

打包生成出来的文件也不能直接用。如果直接用的话 index.html 加载不出 js 文件会导致白屏。打开生成出来的 index.html,把引入 js 的语句加上一个点。它代表从当前目录下的 static 加载 js。因为打包出来之后层级变了,直接使用 / 就变成从根路径加载 js 了。

在这里插入图片描述

最后就是把你应用的图标 favicon 的大小调整成 256x256。Electron 的应用图标大小必须要大于等于 256x256。别问我为什么,人家 electron-builder 要求的(T_T)

在这里插入图片描述

3. Electron 入口文件配置

Electron 入口文件(就是 main.js,Electron 开启的时候从这个文件开始加载)也是一个大坑。一不小心配置错误打包出来就又白屏了。Electron 入口文件的坑主要在于加载页面。

之前开发的时候使用的 loadURL(“localhost:3000”) 用不了了,因为我们要加载的是刚刚生成出来的静态页面。这里需要用到 loadFile 来加载一个 html 文件。毫无疑问肯定是要引入我们刚刚打包出来的 index.html。

首先把入口文件名字改为 main.js 然后移动到项目根目录(与 package.json 同级),然后把之前的 loadURL 删了,改成 loadFile(“build/index.html”),代表加载 build 下的 index.html 文件。网上大部分教程都是教的 path.join(__dirname, “xxx”) 这种形式,亲测无效。最简单的就是最好的~

在这里插入图片描述

4. electron-builder 配置

这是最重要的决定成败的一步。打开 package.json,首先你需要把 main 属性的值设置为 ./main.js,就是刚刚的那个 Electron 入口文件。
在这里插入图片描述

然后是 electron-builder 的配置了。这里我们只打包 Windows 的安装包。往 package.json 里加入如下代码。粘贴的时候注释“阅后即焚”~

"build": {
    "appId": "XXX", // 软件包名,填你软件的名字
    "productName": "XXX", // 产品名称,也填你软件的名字
    "copyright": "GPL 3.0", // 使用版权的名称,可选
    "directories": { // 一些用到的文件夹
      "buildResources": "build", // 需要打包的静态文件目录
      "output": "dist" // 打包文件目录,默认为 dist
    },
    "nsis": { // 安装包生成程序 NSIS 的配置
      "oneClick": false, // 是否一键安装
      "language": "2052", // 语言为中文
      "perMachine": true, // 按机器安装
      "allowToChangeInstallationDirectory": true // 允许用户自定义安装路径
    },
    "win": { // Windows 下的配置
      "icon": "./build/favicon.png", // 图标路径
      "target": "nsis" // 使用 NSIS 生成安装包
    },
    "files": [ // 需要打包进去的文件
      "build/**/*", // build 下所有静态文件
      "./main.js" // 入口文件 main.js
    ],
    "extends": null // 不使用扩展
}

最后在 script 里添加一个条目 builder,如下:
在这里插入图片描述

保存,就配置完成了~

(如果你想要配置其它平台或是其它配置,请参考官网配置说明:https://www.electron.build/configuration/configuration)

5. 准备打包文件

到这一步我们就可以安装打包工具 electron-builder 了。直接一行代码:npm i electron-builder --save-dev 或是 yarn add electron-builder -D。

electron-builder 在打包时需要很多依赖,从官方下载地址下载非常慢,所以我们要配置镜像。对于 npm,输入:

npm config set electron_mirror https://npmmirror.com/mirrors/electron/

对于 yarn,把上面的 npm 替换成 yarn 即可。

除此之外,electron-builder 还需要一些镜像站没有的依赖,要从 GitHub 上下载,我们可以把这些文件分别下载并解压在如下目录:

winCodeSign:C:\Users\用户名\AppData\Local\electron-builder\Cache\winCodeSign\winCodeSign-2.6.0

nsis:C:\Users\用户名\AppData\Local\electron-builder\Cache\nsis\nsis-3.0.4.1

nsis-resources:C:\Users\用户名\AppData\Local\electron-builder\Cache\nsis\nsis-resources-3.4.1

它们的下载链接:

winCodeSign:https://github.com/electron-userland/electron-builder-binaries/releases/download/winCodeSign-2.6.0/winCodeSign-2.6.0.7z

nsis:https://github.com/electron-userland/electron-builder-binaries/releases/download/nsis-3.0.4.1/nsis-3.0.4.1.7z

nsis-resources:https://github.com/electron-userland/electron-builder-binaries/releases/download/nsis-resources-3.4.1/nsis-resources-3.4.1.7z

PS. 如果你去 GitHub 上看这些文件,你可能会看见它们有更新的版本出来。但是人家 electron-builder 只认上面的版本,版本不对 electron-builder 还要重新下载。上次我就是下载了 nsis 更新的版本,然后导致了 electron-builder 又下载了一遍 nsis(T_T)

6. 打包过程

接下来就是最后的打包了。如果你的 electron 没有安装为 dev 依赖,请卸载之后重新安装并加上 --save-dev。

然后输入 npm run builder 开始打包。等待一会儿即可。它可能会报几个警告但是没事~

在这里插入图片描述

打包后你会看见生成了一个 dist 文件夹。dist 下有一个文件夹是 win-unpacked,里面是绿色版免安装的打包程序。运行里面的 .exe 文件就可以打开你打包后的应用了。

在这里插入图片描述

如果发现有白屏(其实上面所有的排坑都是为了避免白屏),可以在 main.js 里把开发者工具开起来,然后打包运行,根据它的报错进行相应的调整。不过上面排了那么多坑应该不会白屏了~

dist 下的 .exe 文件就是你应用的安装包,安装到电脑上就可以跟普通软件一样使用了。

在这里插入图片描述

如果能成功运行,你的 React.js + Electron 应用就打包完成了,恭喜~

P.S. Electron 应用也是真的大,即使使用 builder 打包也还要 400 多 M,看来前端即使有了 Electron 和原生后端应用还是有些差距~

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

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

相关文章

多轮对话(一):概述(意图识别+槽填充)

一、对话系统 基于流水线的面向任务的对话系统包含了四个关键部分: 语言理解。它被称为自然语言理解(NLU),它把用户话语解析为预定义的语义槽。对话状态跟踪器。它管理每一轮的输入与对话历史,输出当前对话状态。对话…

Sechunter移动应用隐私合规检测详解

概述: 受益于移动设备的广泛普及,移动应用近年来得到了蓬勃发展。基于移动设备集成的各类传感器,众多功能丰富的移动应用被开发出来,聚集了大量高价值用户隐私数据,包括用户身份信息、地理位置信息、账户资料信息等。…

玩转机密计算从 secGear 开始

随着网络与计算业务的快速发展,数据成为数字经济的关键生产要素,如何高质量挖掘数据价值,构建安全、合规、可信的数据流通,成为推动数字经济健康发展的关键。此外,根据我国个人信息保护法、欧盟通用数据保护条例 GDPR …

IDEA安装使用代码提交模板

IDEA安装使用代码提交模板 1. idea安装git commit template插件 2、重启idea 3、选择要提交的文件右击(或CtrlShiftK),如下图: 3.1 Type of change用于说明commit的类别,常用的标识如下: feat: 新功能(f…

501. 二叉搜索树中的众数

501. 二叉搜索树中的众数 难度简单 给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。 如果树中有不止一个众数,可以按 任意顺序 返…

Effective C++条款38:通过复合塑模出 has-a 或“根据某物实现出“

Effective C条款38:通过复合塑模出 has-a 或"根据某物实现出"(Model "has-a" or "is-implemented-in-terms-of" through composition)条款38:通过复合塑模出 has-a 或"根据某物实现出"1、…

Batch Normalization

1、原理 在图像预处理过程中会对图像进行标准化处理,这样能够加速网络的收敛速度。 如下图所示,对于Conv1来说输入的是满足某一分布的特征矩阵,但对于Conv2来说输入的feature map就不一定满足某一分布规律。 Batch Normalization的目的就是使…

大坝安全在线监控系统包含哪些内容?怎样提升水库大坝信息化管理水平?

平升电子大坝安全在线监控系统根据SL551-2012《土石坝安全监测技术规范》的整编要求,设置了变形监测、渗流监测、环境量监测。大坝安全在线监控系统可及时了解大坝的工作性态和水库可能存在的事故隐患,为大坝安全管理与水库运行调度提供了准确、及时的现…

Elasticsearch集群搭建

前言在如今的开发过程中,单节点的Elasticsearch肯定是支撑不了大数据量的,而且还存在单节点故障的问题,所以Elasticsearch也提供了集群功能,像其他中间件也基本都会考虑到这个问题准备信息首先, 由于我机器有限&#x…

如何在虚拟机上安装Linx系统

前言作为Java开发的我们,可能有时候想自己玩玩linux服务器,但是如果买阿里云或者腾讯云的服务器又很贵,这时候我们就可以在自己电脑上安装虚拟机了,这也是本篇文章出现的原因,下面我就安装centOS7为例子来进行介绍首先…

openEuler资源利用率提升之道 05:虚机混部介绍与功耗管理技术

随着云计算市场规模的快速增长,各云厂商基础设施投入也不断增加,但行业普遍存在资源利用率低的问题,在上述背景下,提升资源利用率已经成为了一个重要的技术课题。将业务区分优先级混合部署(下文简称混部)是典型有效的资源利用率提…

【C语言】使用C语言实现静态、动态的通讯录(简单易懂)

我们在学习结构体之后,就可以尝试去实现通讯录的制作,如果您这边对于结构体还没有太多的认识的话,请先访问这一篇文章,会有利于接下来的学习。【自定义类型】带你走进结构体、枚举、联合_小王学代码的博客-CSDN博客 目录 一、通讯录 二、静…

JVM-【面试题】-对象内存分配

一、对象内存分配流程图如果能在栈分布就直接在栈创建如果是大对象就直接在old区创建如果不大于TLAB则在TLAB创建,否则在Eden区创建如果Eden区空间不足就会发生Minor GC进行回收,回收的空间放不下或年龄达到上限就直接放到Old区,之后S0区的存…

Vue3.0 性能提升主要是通过哪几方面体现的?

一、编译阶段 回顾Vue2,每个组件实例都对应一个 watcher 实例,它会在组件渲染的过程中把用到的数据property记录为依赖,当依赖发生改变,触发setter,则会通知watcher,从而使关联的组件重新渲染 试想一下&…

34420A万用表

18320918653 34420A Agilent 34420A 七位半台式数字万用表|安捷伦纳伏表34420A|微欧表|安捷伦34420A 品牌: Agilent(安捷伦) 1.3nV rms噪声/8n Vp-p 100pV,100nΩ灵敏度 两通道可编程电压输入:差分和比值功能 71/2位分辨率 1mV到100V量程…

如何通过指令控制将一副扑克牌变成一种简单的计算机

题目 题目就是文章的标题 已知 牌数:每套扑克牌有54张,其中去掉大小王,剩下52张,这52张中又有4种花色黑桃,红桃,梅花,方片每种花色都有13张(1,2,3,4,5,6,7,8,9,10,J,Q,K&#xff…

【Ubuntu】在VMWare虚拟机中安装Ubuntu【教程】

文章目录【Ubuntu】在VMWare虚拟机中安装Ubuntu教程一、安装VMWare二、下载Ubuntu的iso文件三、安装UbuntuReference【Ubuntu】在VMWare虚拟机中安装Ubuntu教程 一、安装VMWare 具体的安装方法,可以参考这一篇博客,这里就不详细介绍了 二、下载Ubuntu…

centos禁止root登录

ssh登录linux服务器的时候,经常会有提示 There were * failed login attempts since the last successful login. 说明有大量的非法登录尝试 检查服务器是否被恶意登录 # Ubuntu # 1. 查看近期成功的密码登录: grep "password" /var/log/au…

如何搭建邮箱服务器?mail系统架设的两种方法

邮件mail通信是常用的办公场景,对于技术和网管等人员,往往需要搭建自己的邮箱服务器。那么,如何架设邮箱系统呢?通常有两种方案,一种是在在本地主机部署,另一种是在云端如云服务器上部署应用。根据主机IP情…

以交互方式导入图像、音频和视频

以交互方式将数据导入到 MATLAB 工作区。 查看文件的内容 指定变量 生成可重用的 MATLAB 代码 注意:​有关导入文本文件的信息,可以参考使用导入工具读取文本文件数据。有关导入电子表格的信息,可以参考使用导入工具读取电子表格数据。 查…