Electron从构建到打包exe应用

这篇具有很好参考价值的文章主要介绍了Electron从构建到打包exe应用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Electron文档

搭建

创建一个文件夹,在根目录执行以下几个命令

1.npm init
2.npm install electron --save-dev
3.根目录新增main.js文件,添加内容console.log("hellow!!")
4.package.json中更改
	"main": "main.js",
	"scripts":{
		"start": "electron .",  
	}

然后运行根目录执行命令npm run start
可以在命令行中看到hellow!!,此时项目算是跑通了
Electron从构建到打包exe应用,Electron,electron,arcgis,javascript

网页装载到 BrowserWindow中

1.根目录新增index.html文件,写添加html的默认代码等标签,并添加一个hellow

<!DOCTYPE html>
<body>
  <h1>Hello!!</h1> 
</body>

2.根目录新增main.js

const { app, BrowserWindow } = require('electron');//导入Electron模块

// 函数index.html页面加载到新的 BrowserWindow 实例中
const createWindow = () => {
  const win = new BrowserWindow({width: 800,height: 600});//设置BrowserWindow 窗口的宽高
  win.loadFile('index.html'); 
}

// 应用准备就绪时调用函数
app.whenReady().then(() => {createWindow()})
// app.on('ready', () => {createWindow()}) 不建议这么调用

// 退出应用程序,不兼容macOS
app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {app.quit()}
})

运行npm start ,会打开一个浏览器窗口
Electron从构建到打包exe应用,Electron,electron,arcgis,javascript

定义全局对象

1.根目录新加新建一个 preload.js,并添加如下代码

const { contextBridge } = require('electron')

// 设置全局变量versions
contextBridge.exposeInMainWorld('versions', {
  // 使用功函数的形式,
  node: () => process.versions.node, // 调用:versions.node()
  chrome: () => process.versions.chrome,
  electron: () => process.versions.electron
  // 除函数之外,我们也可以暴露变量
  isBool:true
})

2.将preload.js的代码渲染到进程上,main.js文件中添加如下代码

const path = require('path')

// new BrowserWindow中添加如下代码
webPreferences: {
  preload: path.join(__dirname, 'preload.js')
}

3.根目录新加新建一个 renderer.js,并添加如下代码

const el= document.getElementById('info')
// 调用versions下的方法
el.innerText = ` Chrome (v${versions.chrome()}), Node.js (v${versions.node()}), 和 Electron (v${versions.electron()})`
console.log(versions.isBool) // true
/*
注意: Electron 12 以来,默认情况下已启用上下文隔离,
所以在preload.js中设置window.myAPI全局变量的话,在 renderer.js里面window.myAPI为undefined
window.myAPI = {
  desktop: true
}
*/

4.将renderer.js引入到index.html,并添加一个id为info的标签

<div id="info"></div>
<script src="./renderer.js"></script>

运行 npm start
Electron从构建到打包exe应用,Electron,electron,arcgis,javascript

进程之间通信

使用 Electron 的 ipcMain 模块和 ipcRenderer 模块来进行进程间通信

渲染器进程到主进程(单向)

将单向 IPC 消息从渲染器进程发送到主进程,使用 ipcRenderer.send API 发送消息,然后使用 ipcMain.on API 接收。
1.main.js添加如下代码

app.whenReady().then(() => {
	...
	// 使用ipcMain.on侦听事件监听set-title
	ipcMain.on('set-title', (event, title) => {
	   const webContents = event.sender
	   const w = BrowserWindow.fromWebContents(webContents)
	   w.setTitle(title)
	 });
 })

2.preload.js添加如下代码

// 将消息发送到上面的ipcMain.on监听器,使用 ipcRenderer.send API
contextBridge.exposeInMainWorld('versions', {
  ...
  setTitle: (title) => ipcRenderer.send('set-title',title),
})

3.触发(调用)versions.setTitle,

// index.html里面新增代码
<input id="btn" type="button" value="渲染器进程到主进程(单向)-设置标题"/>

// renderer.js里面新增代码
const buttonel = document.getElementById('btn')
buttonel.addEventListener('click', () => {
  const title = buttonel.value
  versions.setTitle(title)
})

运行npm run start
Electron从构建到打包exe应用,Electron,electron,arcgis,javascript

渲染器进程到主进程(双向)

双向 IPC 的一个常见应用是从渲染器进程代码调用主进程模块并等待结果。
通过将 ipcRenderer.invokeipcMain.handle 搭配使用来完成

步骤:
1.网页向主进程发送消息,使用 ipcMain.handle 设置一个主进程处理程序
2.然后在预处理脚本中暴露一个 ipcRenderer.invoke 的函数来触发该处理程序
演示代码如下
1.在main.js中添加如下代码

const { ipcMain } = require('electron')
app.whenReady().then(() => {
	// 设置一个主进程处理程序发送器,监听myfn12
  ipcMain.handle('myfn12', (event,arg) => {
    return '我是myfn的返回:'+ arg;
  });
 ...
})

2.preload.js添加如下代码

contextBridge.exposeInMainWorld('versions', {
  ...,
  electron: () => process.versions.electron,
  myfn: (arg) => ipcRenderer.invoke('myfn12',arg)
})

3.renderer.js新增里面添加如下代码

const fn = async () => {
  const response = await versions.myfn('我传一个参数个myfn');// 传参,接收返回的参数
  information.innerHTML = `${response}`
}
fn()

运行npm start如下图
Electron从构建到打包exe应用,Electron,electron,arcgis,javascript

主进程到渲染器进程

将消息从主进程发送到渲染器进程时,需要指定是哪一个渲染器接收消息。 消息需要通过其 WebContents 实例发送到渲染器进程。 此 WebContents 实例包含一个 send 方法,其使用方式与 ipcRenderer.send 相同

我们实现如下功能,切换菜单触发
main.js新增如下代码

const { Menu   } = require('electron')
const createWindow = () => {
const win = new BrowserWindow({...})
// ++利用Menu 模块 构建一个菜单
  const menu = Menu.buildFromTemplate([
    {
      label: app.name, // 主菜单使用当前应用的名字
      submenu: [
        {
          click: () => win.webContents.send('update-counter', 1), // 点击子菜单的事件,通过 update-counter 通道向渲染器进程发送消息1
          label: 'Increment' // 子菜单的名字
        },
        {
          click: () => win.webContents.send('update-counter', -1),// 点击子菜单的事件
          label: 'Decrement' // 子菜单的名字
        }
      ]
    }

  ])

  Menu.setApplicationMenu(menu)
}


app.whenReady().then(() => {
	...
  // ++监听counter-value
  ipcMain.on('counter-value', (_event, value) => {
    console.log('avlue'+value) // will print value to Node console
  })
})

preload.js新增如下代码

contextBridge.exposeInMainWorld('versions', {
  ...
  handleCounter: (callback) => ipcRenderer.on('update-counter', callback), // 再此处监听update-counter
})

renderer.js新增如下代码

const counter = document.getElementById('counter')
/*
调用handleCounter后,会开始监听"update-counter"(监听的代码在preload.js中),
点击菜单的时候会发送数据到update-counter触发,进入到下面的回调中,进入回调后,向counter-value发送了数据,
在main.js中counter-value中可以监听到数据,
*/ 
window.versions.handleCounter((event, value) => {
  const oldValue = Number(counter.innerText)
  const newValue = oldValue + value
  counter.innerText = newValue
  event.sender.send('counter-value', newValue); // 在此处send
})

index.html新增如下代码

 当前值: <strong id="counter">0</strong>

运行npm start 效果如下
Electron从构建到打包exe应用,Electron,electron,arcgis,javascript

打开调试器

// 打开 DevTools.
 win.webContents.openDevTools()

运行npm start如下,打开了谷歌的调试器
Electron从构建到打包exe应用,Electron,electron,arcgis,javascript

打包应用程序

将 Electron Forge 的 CLI 工具包安装到项目的 devDependencies 依赖中,然后使用现成的转化脚本将项目导入至 Electron Forge。
Electron Forge CLI 文档。
1.根目录运行以下命令,安装依赖

npm install --save-dev @electron-forge/cli
npx electron-forge import

安装完后会发现,package.json中多了一些代码,以及多了一个 forge.config.js文件
Electron从构建到打包exe应用,Electron,electron,arcgis,javascript

2,。运行以下命令

npm run make

如果出现以下报错,记得填写package.json中的description和author
Electron从构建到打包exe应用,Electron,electron,arcgis,javascript

打包完成后,根目录会出现一个 out 文件夹,其中包括可分发文件与一个包含其源码的文件夹

out/
├── out/make/zip/darwin/x64/my-electron-app-darwin-x64-1.0.0.zip
├── ...
└── out/my-electron-app-darwin-x64/my-electron-app.app/Contents/MacOS/my-electron-app

out/make 文件夹中的应用程序(.exe),双击exe文件就可以启动了
Electron从构建到打包exe应用,Electron,electron,arcgis,javascript

对代码进行签名

代码签名是交付桌面应用程序的重要组成部分,并且它对于应用程序的自动更新功能 (将会在教程最后部分讲解) 来说是必需的

为了将桌面应用程序分发给最终用户,建议应用进行代码签名。

在 macOS 上,代码签名是在应用程序打包时完成的。 而在 Windows 中,则是对可分发文件进行签名操

如果您已经拥有适用于 Windows 和 macOS 的代码签名证书,可以在 Forge 配置中设置您的凭据
签署 macOS 应用程序 指南

macOS端
forge.config.js文件

module.exports = {
  packagerConfig: {
    osxSign: {},
    // ...
    osxNotarize: {
      tool: 'notarytool',
      appleId: process.env.APPLE_ID,
      appleIdPassword: process.env.APPLE_PASSWORD,
      teamId: process.env.APPLE_TEAM_ID
    }
    // ...
  }
}

Windows端
forge.config.js文件文章来源地址https://www.toymoban.com/news/detail-613176.html

module.exports = {
  // ...
  makers: [
    {
      name: '@electron-forge/maker-squirrel',
      config: {
        certificateFile: './cert.pfx',
        certificatePassword: process.env.CERTIFICATE_PASSWORD
      }
    }
  ]
  // ...
}

到了这里,关于Electron从构建到打包exe应用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Electron+Vue3+TS 打包exe客户端

    Electron + Vue3 + TS 实战 - 掘金 如果报错loaderContext.getOptions is not a function ts-loader版本不一致导致的问题。 解决方案:npm install ts-loader@8.0.0 --save

    2024年02月11日
    浏览(34)
  • electron应用打包成功纪念一下

    electron应用打包成功纪念一下,以前曾经行过后来打包各种报错,现在有空就尝试解决一下 首先安装nvm能够方便切换node版本 顺利安装后你用nvm list查看node列表时会告诉你这个nvm不存在 回到最初版本然后打包看各种错误 还有一种错误是定位到js文件catch后面的{,这时只需要再

    2024年02月10日
    浏览(39)
  • electron-builder 打包 exe 报错 Error output: Plugin not found, cannot call UAC::_

    报错信息: Error: C:Users***AppDataLocalelectron-buildercachensisnsis-3.0.1.13Binmakensis.exe exited with code 1 Output: Command line defined: \\\"APP_ID=com.baidu.app\\\" Command line defined: \\\"APP_GUID=fb00ccb0-0875-5f26-8d91-d8b573c5a860\\\" Command line defined: \\\"PRODUCT_NAME=Baidu\\\" Command line defined: \\\"PRODUCT_FILENAME=Baidu\\\" Command line define

    2024年02月14日
    浏览(30)
  • 使用angular和electron 构建桌面应用

    新建一个angular app 修改src/index.html文件内容 将绝对路径改为相对路径,加个点,使electron可以访问到angular文件资源

    2024年02月14日
    浏览(39)
  • vite + electron 构建前端桌面应用程序

    npm yarn 选择是否继续 项目名称 选择框架 选择项目语言 项目构建成功,根据提示进入项目目录,安装依赖 electron 官网:https://www.electronjs.org/zh/docs/latest/ vite-plugin-electron :https://github.com/electron-vite/vite-plugin-electron 安装依赖(electron 安装比较慢,耐心等待即可) 编写 Electron 入

    2024年02月06日
    浏览(50)
  • Vue+Electron打包桌面应用(从零到一完整教程)

    切记,整个项目的json文件不能有注释,及时没报错也不行,否则运行命令时还是有问题 参考此视频 1- 1.创建项目 1- 2. 安装依赖运行项目 1- 3.配置Electron 1- 4.修改配置文件 1) vite.config.js 2)main.js(项目根目录新增) 此为electron运行的入口文件 3)preload.js(项目根目录下新增) 4)package

    2024年02月07日
    浏览(51)
  • electron+Vue3构建桌面应用之IPC通讯

    最近在做一个C/S架构的项目预研 过程中遇到 Electron 与 Vue3 通讯的问题,费劲巴力的在网上找方案,发现都不理想,最终攻克之后,计划将过程写下来,供有需求的同学白嫖! 开始之前,先说一件重要的事情: 看文档 看官方文档 一定要看官方文档 好,言归正传。 先说需求

    2024年04月29日
    浏览(36)
  • Electron + Vue3 + Vite + TS 构建桌面应用

    之前是使用React、Electron、TS和webpack来构建桌面应用的。虽然功能齐全,但是打包等等开发的体验不太理想,总感觉太慢了。作为一个开发者,我们总是希望,执行构建命令后,可以快速打包或者启动本地应用,且通过更少的配置,来完成开发体验。 现在的vite已经得到广泛的

    2024年02月14日
    浏览(60)
  • 探索 Electron Egg:构建跨平台桌面应用的理想选择

    随着Web技术的不断发展,构建跨平台桌面应用的需求也在逐渐增加。Electron Egg作为一个结合了Electron和Vue.js的框架,为开发者提供了一个简单而强大的工具,使他们能够快速构建出优秀的桌面应用。本文将介绍Electron Egg的核心特性、优势以及如何开始使用这个框架。 什么是

    2024年02月20日
    浏览(64)
  • electron+vue3全家桶+vite项目搭建【24】设置应用图标,打包文件的图标

    demo项目地址 在electron中,我们可以通过electron-builder的配置文件来设置打包后的应用图标 因为mac环境下的图标需要特殊格式,这里我们可以利用electron-icon-builder进行配置 1.引入相关依赖 加入安装过程中卡在了 phantomjs-2.1.1-windows.zip的下载,可以直接去github上下载 这里我也放一

    2024年02月17日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包