用electron打包前端应用初体验

简介: 用electron打包开发桌面应用遇到的各种问题和解决办法

打包报错

按照示例教程打包应用,报错:

  • An unhandled rejection has occurred inside Forge:
  • Error: Command failed with a non-zero return code (1):
  • Fatal error: Unable to commit changes
  • Electron Forge was terminated. Location...

本地运行起来的桌面窗口未关闭,先关了再来打包。

引用 react + vite 打包后的 dist 文件白屏

react + vite build 打包后的文件,js 和 css 资源引用路径都是绝对路径,导致 electron 中加载不到对应的文件。

<script type="module" crossorigin src="/assets/index.21b9ac96.js"></script>
<link rel="stylesheet" href="/assets/index.c622ce5d.css">

解决办法,配置 vite.config.js 中的 base: './' 为相对路径。

本地运行调试前端项目

正常打包项目是用 win.loadFile 加载打包好的 html 文件,本地运行时可以直接用 win.loadURL 直接引入本地运行的前端服务,方便调试和开发。

  // win.loadFile('./dist/index.html')
  win.loadURL('http://127.0.0.1:5173/')

使用 node 模块

渲染进程使用 node 模块,需要额外配置 webPreferences

// main.js
const {
    app, BrowserWindow } = require('electron')

let win = null
app.on('ready', () => {
   
  win = new BrowserWindow({
   
    width: 800,
    height: 800,
    webPreferences: {
    // 在渲染进程中使用node, 需要配置 webPreferences属性
      nodeIntegration: true, // 使渲染进程拥有node环境
      contextIsolation: false, // 设置此项为false后,才可在渲染进程中使用 electron api,https://www.electronjs.org/zh/docs/latest/api/browser-window
      preload: path.join(__dirname, 'preload.js')
  })
})

// preload.js
window.require = require

注意需要用 preload 预加载脚本去设置下 window.require,这样才能在 vue、react 项目中用 require 去导入 node 相关模块,当然你也可以往 window 上挂载其他需要挂载的,注意这样挂载了不能直接在浏览器中调试,会报错的,要在 electron 中去调试。

主进程和渲染进程通信

ipcRenderer 和 ipcMain 通过 send 和 on 事件监听通信,如果一方收到信息后还要回复另一方,只能通过 event.reply 发送给对方另一个事件实现回复通信。

不过还可以通过 ipcMain.handle 用 promise 来 return 数据实现回复,主进程 ipcMain.handle,渲染进程 ipcRenderer.invoke。

数据传递

vue3 中如果用的 reactive 定义的数据,其实是一个 Proxy 代理对象,直接往主进程传递会报错,要自己 JSON.parse(JSON.stringify(xx)) 或者将数据复制到普通对象进行传递。

查看相关版本号

  • electron 版本:process.versions.electron
  • NODE版本:process.versions.node
  • V8 引擎版本:process.versions.v8
  • chrome版本:process.versions.chrome
相关文章
|
6天前
|
缓存 监控 前端开发
【Flutter 前端技术开发专栏】Flutter 应用的启动优化策略
【4月更文挑战第30天】本文探讨了Flutter应用启动优化策略,包括理解启动过程、资源加载优化、减少初始化工作、界面布局简化、异步初始化、预加载关键数据、性能监控分析以及案例和未来优化方向。通过这些方法,可以缩短启动时间,提升用户体验。使用Flutter DevTools等工具可助于识别和解决性能瓶颈,实现持续优化。
【Flutter 前端技术开发专栏】Flutter 应用的启动优化策略
|
6天前
|
Dart 前端开发 开发工具
【Flutter前端技术开发专栏】Flutter入门指南:搭建开发环境与第一个应用
【4月更文挑战第30天】本文介绍了Flutter SDK的安装和配置过程,以及如何创建并运行第一个Flutter应用。首先确保安装了Dart SDK和Flutter SDK,支持macOS、Linux和Windows。安装完成后,设置环境变量,然后通过`flutter doctor`验证安装。接着,使用`flutter create`命令创建新项目,进入项目目录并运行`flutter run`启动应用。在`main.dart`中修改代码以自定义应用。Flutter支持热重载和DevTools调试。本文为Flutter初学者提供了快速入门的指导。
【Flutter前端技术开发专栏】Flutter入门指南:搭建开发环境与第一个应用
|
1天前
|
前端开发 Java Go
从前端到后端:构建现代化Web应用的技术演进
本文探讨了从前端到后端的技术演进,介绍了前端、后端以及多种编程语言,如Java、Python、C、PHP和Go,以及数据库在构建现代化Web应用中的应用。通过深入剖析各个技术领域的发展和应用,读者将对构建高效、可扩展、安全的Web应用有更深入的理解。
|
4天前
|
前端开发 Java Go
从前端到后端:构建现代化Web应用的技术实践
本文将介绍如何通过前端和后端技术相结合,构建现代化Web应用的技术实践。我们将探讨前端开发、后端架构以及多种编程语言(如Java、Python、C、PHP、Go)在构建高效、可扩展的Web应用中的应用。
|
4天前
|
前端开发 JavaScript 测试技术
第八章(应用场景篇) 中大型项目的解构:从单体应用到微前端
第八章(应用场景篇) 中大型项目的解构:从单体应用到微前端
|
5天前
|
Web App开发 前端开发 JavaScript
构建跨浏览器兼容的前端应用:技术实践与挑战
【5月更文挑战第16天】构建跨浏览器兼容的前端应用是应对浏览器差异和多样性的挑战。使用现代框架(如React、Vue)能自动转换代码,编写可移植的Web标准代码,结合浏览器兼容性测试工具和Polyfill解决旧浏览器支持问题。关注浏览器更新,应对性能、API差异和样式问题,采用渐进增强、条件判断和CSS Reset策略确保应用在各种浏览器上运行良好。
|
5天前
|
前端开发 JavaScript Java
浅谈企业级前端应用中的组件概念和具体的应用
浅谈企业级前端应用中的组件概念和具体的应用
11 1
|
6天前
|
JSON 前端开发 JavaScript
快照测试在前端自动化测试中的应用
在前端自动化测试中,快照测试常用于检验组件渲染与布局。
|
6天前
|
缓存 移动开发 前端开发
【专栏:HTML与CSS前端技术趋势篇】HTML与CSS在PWA(Progressive Web Apps)中的应用
【4月更文挑战第30天】PWA(Progressive Web Apps)结合现代Web技术,提供接近原生应用的体验。HTML在PWA中构建页面结构和内容,响应式设计、语义化标签、Manifest文件和离线页面的创建都离不开HTML。CSS则用于定制主题样式、实现动画效果、响应式布局和管理字体图标。两者协同工作,保证PWA在不同设备和网络环境下的快速、可靠和一致性体验。随着前端技术进步,HTML与CSS在PWA中的应用将更广泛。
|
6天前
|
前端开发 JavaScript 搜索推荐
【专栏:HTML 与 CSS 前端技术趋势篇】HTML 与 CSS 在 Web 组件化中的应用
【4月更文挑战第30天】本文探讨了HTML和CSS在Web组件化中的应用及其在前端趋势中的重要性。组件化提高了代码复用、维护性和扩展性。HTML提供组件结构,语义化标签增进可读性,支持用户交互;CSS实现样式封装、布局控制和主题定制。案例展示了导航栏、卡片和模态框组件的创建。响应式设计、动态样式、CSS预处理器和Web组件标准等趋势影响HTML/CSS在组件化中的应用。面对兼容性、代码复杂度和性能优化挑战,需采取相应策略。未来,持续发掘HTML和CSS潜力,推动组件化开发创新,提升Web应用体验。