react项目引入electron进行mac、windows桌面应用打包,通过浏览器下载安装包

打包步骤

  1. 全局安装electron
npm install electron -g
  1. 在react项目的根目录中,创建一个新的文件夹electron,用于存放electron相关的文件
  2. 在该文件夹中,创建一个新的package.json文件,并添加以下内容:
{"name": "example", // 应用名称"version": "1.0.0", // 应用版本号"main": "main.js", // 主入口文件"scripts": {"start": "electron-forge start", // 启动应用的命令"dist:mac": "electron-builder build --m", // 打包mac应用程序的命令"dist:win": "electron-builder build --w " // 打包windows应用程序的命令},"author": "xxx", // 作者"license": "xxx-1.0", // 许可证"build": {"appId": "com.example.app", // 应用ID"productName": "example", // 应用名称"directories": {"output": "release-builds", // 打包输出目录"buildResources": "public" // 构建资源目录},"afterSign": "afterSign.js", // 签名后执行的脚本"nsis": { // NSIS安装程序配置"installerIcon": "./public/icons/favicon.ico", // 安装程序图标"uninstallerIcon": "./public/icons/favicon.ico", // 卸载程序图标"installerHeaderIcon": "./public/icons/favicon.ico", // 安装程序头部图标"oneClick": false, // 是否一键安装"language": "2052", // 安装程序语言"installerLanguages": ["zh-CN" // 安装程序支持的语言],"perMachine": true, // 是否为每台机器安装"allowToChangeInstallationDirectory": true, // 允许更改安装目录"createDesktopShortcut": true, // 创建桌面快捷方式"createStartMenuShortcut": true, // 创建开始菜单快捷方式"shortcutName": "阿拉丁AI" // 快捷方式名称},"files": ["**/*","!node_modules/electron-*","!node_modules/electron-builder","!node_modules/electron-prebuilt-compile","!node_modules/electron-edge-js/**/*"], // 打包时需要包含的文件和排除的文件"dmg": { // DMG安装包配置"iconSize": 100, // 图标尺寸"contents": [{"x": 380,"y": 180,"type": "link","path": "/Applications" // 链接到Applications目录},{"x": 130,"y": 180,"type": "file" // 文件}],"window": {"x": 100,"y": 100,"width": 500,"height": 300 // DMG窗口尺寸}},"mac": {"category": "public.app-category.utilities", // 应用程序所属的类别"target": [{"target": "dmg", // 目标为生成dmg安装包"arch": ["arm64", // 支持arm64架构"x64" // 支持x64架构]},"zip" // 目标为生成zip压缩包],"icon": "./public/icons/favicon.icns", // 应用程序的图标路径"notarize": {"teamId": "xxxxxx" // 用于应用程序的代码签名的团队ID}},"win": {"target": [{"target": "nsis", // 目标为生成NSIS安装包"arch": ["ia32", // 支持ia32架构"x64" // 支持x64架构]},"zip" // 目标为生成zip压缩包],"icon": "./public/icons/favicon.ico" // 应用程序的图标路径}},"devDependencies": {"@electron-forge/cli": "^7.3.0","@electron-forge/maker-deb": "^7.3.0","@electron-forge/maker-rpm": "^7.3.0","@electron-forge/maker-squirrel": "^7.3.0","@electron-forge/maker-zip": "^7.3.0","@electron-forge/plugin-auto-unpack-natives": "^7.3.0","@electron-forge/plugin-fuses": "^7.3.0","electron": "^28.2.1","electron-builder": "^24.12.0"},"dependencies": {"electron-log": "^5.1.1","electron-notarize": "^1.2.2","electron-squirrel-startup": "^1.0.0"}
}
  1. 在同一文件夹中,创建一个新的main.js文件,并添加以下内容:
const { app, BrowserWindow } = require('electron')function createWindow () {const win = new BrowserWindow({width: 1280,height: 800,webPreferences: {devTools: true, //是否开启 DevToolsnodeIntegration: true}})win.loadURL('http://localhost:3000') // 请替换为你的react项目的URL// 隐藏客户端默认菜单Menu.setApplicationMenu(null);// 解决应用启动白屏问题win.on("ready-to-show", () => {win.show();win.focus();});// 打开开发者工具// win.webContents.openDevTools()
}app.whenReady().then(createWindow)app.on('window-all-closed', () => {if (process.platform !== 'darwin') {app.quit()}
})app.on('activate', () => {if (BrowserWindow.getAllWindows().length === 0) {createWindow()}
})
  1. 在终端中,进入到该文件夹,并运行以下命令来安装依赖:
npm install
  1. 接下来,运行以下命令来启动Electron应用程序:
npm run start
  1. 进行mac签名公证
    参考 MacOS的 打包、签名、公证、上架 和 electron mac 打包、分发流程(dmg & mas)
  2. 在同一文件夹中,创建一个新的afterSign.js文件,并添加以下内容:
const { notarize } = require('electron-notarize');
const path = require("path")
exports.default = async function notarizing(context) {const { electronPlatformName, appOutDir } = context;if (electronPlatformName !== 'darwin') {return;}const appName = context.packager.appInfo.productFilename;const appPath = path.join(appOutDir, `${appName}.app`);return await notarize({appBundleId: ‘apple开发者中该应用的bundleid',appPath,//打包后的放置app文件的命名和路径appleId: “开发者账号",appleIdPassword: "app专属密码”,//在apple开发者里可以对某个app设置专属密码});
};
  1. 打包
npm run dist:mac
npm run dist:win

10、生成下载链接

把dmg包和exe包上传到阿里云oss,访问链接即可下载

其他问题

1、electron mac端打包需要依赖python2.7,如果报错,下载安装一下python2.7

2、遇到mac打包报错:macxcrun: error: invalid active developer path

这个错误通常是由于缺少Xcode命令行工具导致的。你可以尝试以下解决方法:

确保你已经安装了Xcode。你可以在终端中运行以下命令来检查:

xcode-select -p

如果返回了Xcode的路径,那么Xcode已经安装。如果没有返回任何内容,那么你需要安装Xcode。

安装Xcode命令行工具。在终端中运行以下命令:

xcode-select --install

这将打开一个对话框,提示你安装Xcode命令行工具。按照提示进行安装。

确保你已经接受了Xcode的许可协议。在终端中运行以下命令:

sudo xcodebuild -license accept

按照提示接受许可协议。

重新运行打包命令

3、点击dmg安装包下载链接后,浏览器提示“已阻止不安全的下载”,安装软件时提示已损坏

由于浏览器对于某些文件类型或来源的下载进行了安全限制。对于 Electron 打包的 dmg 文件,有时候浏览器会将其标记为不安全的下载。

测试阶段可以去系统设置->隐私与安全性->安全性下面选择允许任何来源(如果没有该选项可以在终端中执行 sudo spctl --master-disable )来解决此问题,正式包分发去往打包步骤7。

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

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

相关文章

推荐一个 Obsidian 的 ChatGPT 插件

源码地址:https://github.com/nhaouari/obsidian-textgenerator-plugin Text Generator 是目前我使用过的最好的 Obsidian 中的 ChatGPT 功能插件。它旨在智能生成内容,以便轻松记笔记。它不仅可以在 Obsidian 中直接使用 ChatGPT,还提供了优…

二叉树高频题目(不含树形DP)

二叉树高频题 二叉树的层序遍历 . - 力扣&#xff08;LeetCode&#xff09; 按点弹出 class Solution { public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>>ans;if(root!nullptr){queue<TreeNode*>q;unordered_map&…

音视频技术-电脑连接调音台时交流声的产生与消除

当电脑&#xff08;笔记本/台式机&#xff09;声卡通过音频线与调音台&#xff08;或扩音机&#xff09;连接时&#xff0c;能听到“交流声”。有时很轻微&#xff0c;有时很明显&#xff0c;甚至干扰正常的演讲或发言。 很多时候&#xff0c;我们在台上演讲时&#xff0c;都会…

Centos7.9环境源码编译安装ffmpeg6.x

1.官网ffmpeg下载源码 https://ffmpeg.org/download.html#build-windows 2.未安装x264库则先安装配置 可以先查询x264库: whereis libx264 安装编译工具和依赖库&#xff1a; sudo yum install gcc make cmake mercurial git yasm pkgconfig autoconf automake libtool sudo…

UE4 材质多张图片拼接成一张图片(此处用2×2拼接)

UE4 材质多张图片拼接成一张图片&#xff08;此处用22拼接&#xff09; //TexCoord,TextureA,TextureB,TextureC,TextureDfloat3 ReturnTexture TextureA; if(TexCoord.x < 0.5 && TexCoord.y < 0.5) {ReturnTexture TextureA; } else if(TexCoord.x > 0.5…

力扣1290. 二进制链表转整数

Problem: 1290. 二进制链表转整数 文章目录 题目描述思路复杂度Code 题目描述 思路 1.记录一个变量res初始化为0&#xff0c;指针p指向链表头&#xff1b; 2.循环每次res res * 2 p -> val;p p -> next;&#xff08;充分利用二进制数的特性&#xff1b;其中利用指针先…

C++前言..

1.前言 C主要从三个模块讲起 分别是&#xff1a;语法(包括底层汇编)、面向对象以及项目实战 C语言纯面向过程 而Java纯面向对象 但是C则是一门面向过程和面向对象都较为完善的语言 并且他能做到Java所不能做到的点就是他更能够窥探底层的汇编代码 而Java是一点都不想透露给外…

leetcode初级算法(python)- 字符串

文章目录 1.反转字符串常规算法pythonic 算法2.整数反转数学法字符串法3.字符串中的第一个唯一字符pythonic算法哈希算法4.有效的字母异位词常规算法进阶算法5.最长公共前缀1.反转字符串 输入:[‘h’,‘e’,‘l’,‘l’,‘o’] 输出:[‘o’,‘l’,‘l’,‘e’,‘h’]

LeetCode 第三题: 无重复字符的最长子串

文章目录 题目描述示例 解题思路 - 滑动窗口法Go语言实现 - 滑动窗口法算法分析 解题思路 - 优化的滑动窗口法 题目描述 给定一个字符串&#xff0c;请你找出其中不含有重复字符的最长子串的长度。 示例 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串…

VMware使用虚拟机,开启时报错:无法连接虚拟设备 0:0,因为主机上没有相应的设备。——解决方法

检查虚拟机配置文件并确保物理设备已正确连接。 操作&#xff1a; 选中虚拟机&#xff0c;打开设置&#xff0c;点击CD/DVD。在连接处选择使用ISO镜像文件

.top域名解析超过72小时ping不通

域名作为网络上网站的唯一标识&#xff0c;它可以是可视的文本字符串&#xff0c;也可以是IP地址&#xff0c;它提供了一种方便的方式来访问网站&#xff0c;而不用担心网址的改变。域名可以分为不同的类型&#xff0c;如顶级域名(TLD)、国家域名(ccTLD)、通用域名(gTLD)等。因…

怎样知道员工上班浏览了哪些网页

在数字化时代&#xff0c;员工在工作时间内上网浏览网页已经成为常态。然而&#xff0c;这也为企业带来了信息安全和工作效率的隐患。为了解决这个问题&#xff0c;许多企业开始使用域智盾这样的专业软件来监控员工的上网行为。 一、域智盾软件简介 域智盾是一款功能强大的企业…

操作系统--设备管理

一、设备控制器 我们的电脑设备可以接非常多的输入输出设备&#xff0c;比如键盘、鼠标、显示器、网卡、硬盘、打印机、音响等等&#xff0c;每个设备的用法和功能都不同。为了屏蔽设备之间的差异&#xff0c;每个设备都有一个叫设备控制器&#xff08;Device Control&#xf…

电子书推荐|IT 基础架构团队的 K8s 管理(含最新性能评测)

越来越多的企业采用 Kubernetes 支持应用的快速开发与交付&#xff0c;Kubernetes 的部署与管理任务也逐渐向 IT 基础架构团队倾斜。尤其是对于习惯了传统虚拟化环境的基础架构工程师&#xff0c;容器环境的管理方式往往会带来诸多困扰&#xff1a; Kubernetes 使用门槛高&…

分布式缓存简介

分布式缓存是一种用于存储和访问大量数据的系统&#xff0c;其数据在多个缓存节点&#xff08;也称为服务器或实例&#xff09;之间分布和复制。这种架构的主要目的是提高性能和可扩展性&#xff0c;同时提供数据冗余和高可用性。 以下是分布式缓存的主要特点和优势&#xff1…

期权无风险套利策略[6]—看跌期权价格波动区间套利

看跌期权价格波动区间定义 根据美式看涨和看跌期权的均衡公式&#xff0c;在无现金股利的发放下&#xff1a; &#xff08;1&#xff09;美式看跌期权的价格&#xff08;P&#xff09;一定不会超过同等特征美式看涨期权的价格 &#xff08;C&#xff09;&#xff0c;加上执行…

React18源码: Fiber树的初次创建过程图文详解

fiber树构造&#xff08;初次创建&#xff09; fiber树构造的2种情况&#xff1a; 1.初次创建 在React应用首次启动时&#xff0c;界面还没有渲染此时并不会进入对比过程&#xff0c;相当于直接构造一棵全新的树 2.对比更新 React应用启动后&#xff0c;界面已经渲染如果再次发…

12.openEuler用户和群组

openEuler OECA认证辅导,标红的文字为学习重点和考点。 如果需要做实验,建议安装麒麟信安、银河麒麟、统信等具有图形化的操作系统,其安装与openeuler基本一致。 1.用户和组管理 用户的基础概念: Linux是一个多用户多任务的操作系统: Linux系统支持多个用户在同一时间…

改善C++程序与设计的55个具体做法——2.尽量以const,enum,inline替换#define

const和#define 这个条款或许改为“宁可以编译器替换预处理器”比较好&#xff0c;因为或许#define不被视为语言的一部分。那正是它的问题所在。当你做出这样的事情&#xff1a; #define ASPECT RATIO 1.653 记号名称ASPECT_RATIO也许从未被编译器看见&#xff1b;也许在编译…

面试经典150题【31-40】

文章目录 面试经典150题【31-40】76.最小覆盖字串36.有效的数独54.螺旋矩阵48.旋转图像73.矩阵置零289.生命游戏383.赎金信205.同构字符串290.单词规律242.有效的字母异位词 面试经典150题【31-40】 76.最小覆盖字串 基本思路很简单&#xff0c;就是先移动右边到合适位置。再移…