【前端记事】关于electron的入门使用

electron入门使用

  • 背景
  • how to start
    • 第一步 创建一个vite-vue3项目
    • 第二步 装各种依赖
    • 第三步 配置
      • vite.config.js
      • package.json
      • electron入口
    • 启动
    • 重写关闭、隐藏、最大化最小化

背景

最近对electron比较感兴趣,折腾一段时间后有了点眉目,记录一下

how to start

第一步 创建一个vite-vue3项目

# 选vue3但是不要用ts,用js会舒服得多
npm create vite -n test-electron

第二步 装各种依赖

# 命令1
npm i electron -d -s
# 命令2
npm install vite-plugin-optimizer --save-dev
# 命令3
npm install vite-plugin-node-polyfills --save-dev
# 命令4
npm install @electron/remote
# 命令5
npm install element-plus --save
# 命令6
npm i vue-router

注意,命令1可能需要反复执行反复失败才会成功,推测是网的原因,而且我自己测试用yarn和pnpm必报错,只有npm才行

第三步 配置

vite.config.js

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { nodePolyfills } from 'vite-plugin-node-polyfills'
import optimizer from 'vite-plugin-optimizer'// https://vite.dev/config/
export default defineConfig({plugins: [vue(), // 添加 Node.js 内置模块的 polyfillnodePolyfills({include: ['path'],globals: { Buffer: true, global: true, process: true },protocolImports: true,}),optimizer({electron: `const { ipcRenderer } = require('electron'); export { ipcRenderer };`})],build: {rollupOptions: {output: {manualChunks: {// 将第三方库分割到单独的代码块'vendor': ['element-plus'],}}}},server: {port: 8888,cors: true, // 允许跨域hmr: true, // 开启热更新},"base": "./"
})

package.json

{"name": "ele-pro","private": true,"version": "0.0.0","type": "module","main": "electron/main.cjs","scripts": {"dev": "vite","build": "vite build","preview": "vite preview","electron:serve": "vite build && electron ."},"dependencies": {"@electron/remote": "^2.1.2","electron-reload": "^2.0.0-alpha.1","element-plus": "^2.9.7","vue": "^3.5.13","vue-router": "^4.5.0"},"devDependencies": {"@vitejs/plugin-vue": "^5.2.1","electron": "^35.1.3","vite": "^6.2.0","vite-plugin-node-polyfills": "^0.23.0","vite-plugin-optimizer": "^1.4.3"}
}

一定要重点关注入口:“main”: “electron/main.cjs”,和electron启动命令:“electron:serve”: “vite build && electron .”

electron入口

在项目的根目录下新建文件夹/electron。
在文件夹中新建文件main.cjs
注意,一定要是.cjs,不是.js

// 控制应用生命周期和创建原生浏览器窗口的模组
const { app, BrowserWindow, Menu } = require('electron')
const path = require('path')
require('@electron/remote/main').initialize()function createWindow() {// 创建浏览器窗口const mainWindow = new BrowserWindow({width: 1200,height: 800,frame: false, // 隐藏默认的标题栏webPreferences: {// 书写渲染进程中的配置nodeIntegration: true, //开启true这一步很重要,目的是为了vue文件中可以引入node和electron相关的APIcontextIsolation: false, // 可以使用require方法},})require('@electron/remote/main').enable(mainWindow.webContents)let env = 'pro'// 配置热更新if (env == 'pro') {const elePath = path.join(__dirname, '../node_modules/electron')require('electron-reload')('../', {electron: require(elePath),})// 热更新监听窗口mainWindow.loadURL('http://localhost:8888')// 打开开发工具mainWindow.webContents.openDevTools()} else {// 生产环境中要加载文件,打包的版本// Menu.setApplicationMenu(null)// 加载 index.htmlmainWindow.loadFile(path.resolve(__dirname, '../dist/index.html')) // 新增}
}
// 这段程序将会在 Electron 结束初始化
// 和创建浏览器窗口的时候调用
// 部分 API 在 ready 事件触发后才能使用。
app.whenReady().then(() => {// 关闭默认菜单栏Menu.setApplicationMenu(null)createWindow()app.on('activate', function () {// 通常在 macOS 上,当点击 dock 中的应用程序图标时,如果没有其他// 打开的窗口,那么程序会重新创建一个窗口。if (BrowserWindow.getAllWindows().length === 0) createWindow()})
})// 除了 macOS 外,当所有窗口都被关闭的时候退出程序。 因此,通常对程序和它们在
// 任务栏上的图标来说,应当保持活跃状态,直到用户使用 Cmd + Q 退出。
app.on('window-all-closed', function () {if (process.platform !== 'darwin') app.quit()
})

启动

打开两个终端窗口,需要都在该项目的根目录。
先运行npm run dev
再运行npm run electron:serve
这样,electron就能根据vue的内容实时渲染

重写关闭、隐藏、最大化最小化

在vue的根组件App.vue中:

<script setup>
import {Close,FullScreen,ArrowDown
} from '@element-plus/icons-vue'
import { getCurrentWindow } from '@electron/remote'
// 关闭
const closeApp = () => {const currentWindow = getCurrentWindow()currentWindow.close()
}
// 全屏/退出全屏应用
const fullScreenApp = () => {const currentWindow = getCurrentWindow()if (currentWindow.isFullScreen()) {currentWindow.setFullScreen(false)} else {currentWindow.setFullScreen(true)}
}// 最小化应用
const hideApp = () => {const currentWindow = getCurrentWindow()currentWindow.minimize()
}
</script><template><div><div style="padding: 10pt; text-align: right;"><el-button type="warning" size="small" circle :icon="ArrowDown" @click="hideApp"></el-button><el-button type="success" size="small" :icon="FullScreen" circle @click="fullScreenApp" /><el-button type="danger" size="small" :icon="Close" circle @click="closeApp" /></div><router-view></router-view></div>
</template><style scoped>
#app {font-family: Avenir, Helvetica, Arial, sans-serif;color: #2c3e50;
}
</style>

先到这里,后面有什么好玩的继续更新

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

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

相关文章

跨浏览器音频录制:实现兼容的音频捕获与WAV格式生成

在现代Web开发中&#xff0c;音频录制功能越来越受到开发者的关注。无论是在线会议、语音识别还是简单的语音留言&#xff0c;音频录制都是一个重要的功能。然而&#xff0c;实现一个跨浏览器的音频录制功能并非易事&#xff0c;因为不同浏览器对音频录制API的支持存在差异。本…

Semantic Kernel也能充当MCP Client

背景 笔者之前&#xff0c;分别写过两篇关于Semantic Kernel&#xff08;下简称SK&#xff09;相关的博客&#xff0c;最近模型上下文协议&#xff08;下称MCP&#xff09;大火&#xff0c;实际上了解过SK的小伙伴&#xff0c;一看到 MCP的一些具体呈现&#xff0c;会发现&…

识别图片内容OCR并重命名文件

在工作场景中&#xff0c;经常出现通过拍摄设备获取图片后&#xff0c;未及时进行有效命名的情况。这些图片中往往包含关键信息&#xff08;如合同编号、产品型号、日期等&#xff09;&#xff0c;需要人工识别并命名&#xff0c;存在以下痛点&#xff1a; 效率低下&#xff1…

【防火墙 pfsense】3 portal

&#xff08;1&#xff09;应该考虑的问题&#xff1a; ->HTTPS 连接的干扰问题&#xff1a;HTTPS 是一种旨在防止恶意第三方截取和篡改流量的协议。但强制门户的工作原理是截取并改变终端用户与网络之间的连接。这对于 HTTP 流量来说不是问题&#xff0c;但使用 HTTPS 加密…

银发科技:AI健康小屋如何破解老龄化困局

随着全球人口老龄化程度的不断加深&#xff0c;如何保障老年人的健康、提升他们的生活质量&#xff0c;成为了社会各界关注的焦点。 在这场应对老龄化挑战的战役中&#xff0c;智绅科技顺势而生&#xff0c;七彩喜智慧养老系统构筑居家养老安全网。 而AI健康小屋作为一项创新…

TCP协议理解

文章目录 TCP协议理解理论基础TCP首部结构图示字段逐项解析 TCP是面向连接&#xff08;Connection-Oriented&#xff09;面向连接的核心表现TCP 面向连接的核心特性TCP 与UDP对比 TCP是一个可靠的(reliable)序号与确认机制&#xff08;Sequencing & Acknowledgment&#xf…

什么是机器视觉3D碰撞检测?机器视觉3D碰撞检测是机器视觉3D智能系统中安全运行的核心技术之一

机器视觉3D碰撞检测是一种结合计算机视觉和三维空间分析的技术,旨在检测三维场景中物体之间是否发生碰撞(即物理接触或交叠)。它通过分析物体的形状、位置、运动轨迹等信息,预测或实时判断物体间的碰撞可能性。以下是其核心要点: 基本原理 三维感知:利用深度相机(如RGB-…

nacos设置权重进行负载均衡不生效

nacos设置权重进行负载均衡不生效&#xff0c;必须在启动类下加上这个bean Beanpublic IRule nacosRule(){return new NacosRule();}如下图所示

创建 Node.js Playwright 项目:从零开始搭建自动化测试环境

一、环境准备 在开始创建 Playwright 项目之前&#xff0c;确保你的电脑上已经安装了以下工具&#xff1a; Node.js&#xff1a;Playwright 依赖于 Node.js 环境&#xff0c;确保你已经安装了最新版本的 Node.js。可以通过以下命令检查是否安装成功&#xff1a; node -v npm -…

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(11): てあります。

日语学习-日语知识点小记-构建基础-JLPT-N4阶段&#xff08;11&#xff09;&#xff1a; てあります。 1、前言&#xff08;1&#xff09;情况说明&#xff08;2&#xff09;工程师的信仰 2、知识点&#xff08;1&#xff09;てあります。&#xff08;&#xff12;&#xff09;…

【金仓数据库征文】- 深耕国产数据库优化,筑牢用户体验新高度

目录 引言 一、性能优化&#xff1a;突破数据处理极限&#xff0c;提升运行效率 1.1 智能查询优化器&#xff1a;精准优化数据检索路径 1.2 并行处理技术&#xff1a;充分释放多核计算潜力 1.3 智能缓存机制&#xff1a;加速数据访问速度 二、稳定性提升&#xff1a;筑牢…

Java代理讲解

代理 代理模式是一种结构型设计模式&#xff0c;它允许我们通过添加一个代理对象来控制对另一个对象的访问。代理对象和实际对象具有相同的接口&#xff0c;使得客户端在不知情的情况下可以使用代理对象进行操作。代理对象在与客户端进行交互时&#xff0c;可以控制对实际对象…

利用deepseek快速生成甘特图

一、什么是甘特图 甘特图&#xff08;Gantt Chart&#xff09;是一种直观的项目管理工具&#xff0c;广泛应用于多个领域&#xff0c;主要用于​​时间规划、任务分配和进度跟踪​​。 直观性​​&#xff1a;时间轴清晰展示任务重叠或延迟。 ​​灵活性​​&#xff1a;支持…

从零开始学习SLAM|技术路线

概念 视觉SLAM&#xff08;Simultaneous Localization and Mapping&#xff09;系统中&#xff0c;整个过程通常分为 前端 和 后端 两个主要部分。前端处理的是从传感器数据&#xff08;如相机图像、激光雷达等&#xff09;中提取和处理信息&#xff0c;用于实时定位和建图&am…

LeetCode 解题思路 44(Hot 100)

解题思路&#xff1a; dp 数组的含义&#xff1a; 以 nums[i] 为结尾的最长递增子序列的长度。递推公式&#xff1a; dp[i] Math.max(dp[i], dp[j] 1)。dp 数组初始化&#xff1a; dp[i] 1。遍历顺序&#xff1a; 从小到大去遍历&#xff0c;从 i 1 开始&#xff0c;直到 …

精益数据分析(22/126):解锁创业增长密码与长漏斗分析

精益数据分析&#xff08;22/126&#xff09;&#xff1a;解锁创业增长密码与长漏斗分析 在创业与数据分析的探索旅程中&#xff0c;我们都在不断寻求新的知识和方法&#xff0c;以提升创业的成功率。我一直期望能和大家共同学习、共同进步&#xff0c;今天就让我们继续深入研…

大模型应用开发之LLM入门

一、大模型概述 1、大模型概念 LLM是指用有大量参数的大型预训练语言模型&#xff0c;在解决各种自然语言处理任务方面表现出强大的能力&#xff0c;甚至可以展现出一些小规模语言模型所不具备的特殊能力 2、语言模型language model 语言建模旨在对词序列的生成概率进行建模…

Vue 计算属性 VS 侦听器:从原理到性能的深度对比

在 Vue 开发中&#xff0c;computed&#xff08;计算属性&#xff09;和watch&#xff08;侦听器&#xff09;是响应式系统的两大核心工具。 它们看似都能处理数据变化&#xff0c;实则设计理念和应用场景大相径庭。 一、核心区别&#xff1a;数据驱动的两种范式 1. 触发机制…

特斯拉宣布启动自动驾驶网约车测试,无人出租车服务进入最后准备阶段

特斯拉公司于4月24日正式宣布&#xff0c;已在美国得克萨斯州奥斯汀和加利福尼亚州旧金山湾区启动自动驾驶网约车服务的员工内部测试。这项测试将为今年夏季计划推出的完全无人驾驶出租车服务进行最后的验证和准备。 此次测试使用约200辆经过特殊改装的Model 3车型&#xff0c;…

基于springboot的在线教育系统

一、系统架构 前端&#xff1a;vue | element-ui | html | jquery | css | ajax 后端&#xff1a;springboot | mybatis 环境&#xff1a;jdk1.8 | mysql | maven | nodejs | idea 二、代码及数据 三、功能介绍 01. web端-首页1 02. web端-首页2 03. w…