创建Electron35 + vue3 + electron-builder项目,有很过坑,记录过程
环境: node v20.18.0 npm 11.1.0
用到的所有依赖:
"dependencies": {"core-js": "^3.8.3","vue": "^3.2.13","vue-router": "^4.5.0"},"devDependencies": {"@babel/core": "^7.12.16","@babel/eslint-parser": "^7.12.16","@vue/cli-plugin-babel": "~5.0.0","@vue/cli-plugin-eslint": "~5.0.0","@vue/cli-service": "~5.0.0","cross-env": "^7.0.3","dotenv-webpack": "^8.1.0","electron": "^35.0.0","electron-builder": "^25.1.8","eslint": "^7.32.0","eslint-plugin-vue": "^8.0.3"},
安装@vue/cli
// 已经安装可以忽略
npm install -g @vue/cli
创建一个新的 Vue 项目
vue create my-electron-vue-app
cd my-electron-vue-app
// 加上这个,build后,发布的页面不会出现白板
module.exports = {publicPath: process.env.NODE_ENV === 'production' ? './' : '/'
};
添加Electron镜像地址
添加.npmrc文件,里面加上。不配置这个会有很多electron相关的文件下载不了。
electron_mirror=https://npmmirror.com/mirrors/electron/
安装 Electron
npm install electron --save-dev
mkdir electron
touch electron/main.js
// electron/main.js
// app 模块,它控制应用程序的事件生命周期。
// BrowserWindow 模块,它创建和管理应用程序 窗口。
const { app, BrowserWindow, ipcMain } = require('electron')
// 部引入 Node.js 中的 path 模块
const path = require('path')const process = require('process')// 添加一个createWindow()方法来将index.html加载进一个新的BrowserWindow实例
function createWindow () {// Create the browser window.const mainWindow = new BrowserWindow({width: 800,height: 600,webPreferences: {nodeIntegration: true,contextIsolation: false,//预加载// __dirname 字符串指向当前正在执行脚本的路径 (本项目,指向项目的根文件夹)。// path.join API 将多个路径段联结在一起,创建一个跨平台的组合路径字符串。preload: path.join(__dirname, 'preload.js')}})// and load the index.html of the app.if (process.env.NODE_ENV === 'development') {mainWindow.loadURL('http://localhost:8080');// Open the DevTools.// mainWindow.webContents.openDevTools()} else {mainWindow.loadFile(path.join(__dirname, '../dist/index.html'));}}// 在 Electron 中,只有在 app 模块的 ready 事件被激发后才能创建浏览器窗口。
// 您可以通过使用 app.whenReady() API来监听此事件。
// 在whenReady()成功后调用createWindow()。
app.whenReady().then(() => {createWindow()app.on('activate', function () {// 在macOS上,当单击dock图标并且没有其他窗口打开时,通常会在应用程序中重新创建一个窗口if (BrowserWindow.getAllWindows().length === 0) createWindow()})
})// 在Windows和Linux上,关闭所有窗口通常会完全退出一个应用程序。
// 为了实现这一点,监听 app 模块的 'window-all-closed' 事件,
// 并在用户不是在 macOS (darwin) 上运行时调用 [app.quit()][app-quit]
app.on('window-all-closed', function () {if (process.platform !== 'darwin') app.quit()
})
touch electron/preload.js
// electron/preload.js
/*** 预加载* 预加载脚本在渲染器进程加载之前加载,并有权访问两个 渲染器全局 (例如 window 和 document) 和 Node.js 环境(例如 process)*/
window.addEventListener('DOMContentLoaded', () => {const replaceText = (selector, text) => {const element = document.getElementById(selector)if (element) element.innerText = text}for (const dependency of ['chrome', 'node', 'electron']) {replaceText(`${dependency}-version`, process.versions[dependency])}
})
// package.json
{...// 加入"main": "electron/main.js""main": "electron/main.js","scripts": {...// 本地启动命令electron:serve"electron:serve": "set NODE_ENV=development&& electron ."},...
}
安装Electron打包程序electron-builder
npm install electron-builder --save-dev
// package.json
{..."scripts": {..."electron:build": "set NODE_ENV=production&& electron-builder"},// electron打包配置"build": {"appId": "com.example.yourapp","productName": "YourApp","directories": {"output": "dist_electron"},"files": ["dist/**/*","electron/*"],"win": {"target": "nsis","icon": "build/icon.ico"},"mac": {"target": "dmg","icon": "build/icon.icns"},"linux": {"target": "AppImage","icon": "build/icon.png"}},...
}
appId: com.example.yourapp
productName: YourApp
copyright: Copyright © 2025 MyApp
directories:output: dist_electron
files:- "dist/**/*"- "electron/*"
asar: true
win:target: nsisicon: build/icon.ico
mac:target: dmgicon: build/icon.icns
linux:target: AppImageicon: build/icon.png
nsis:oneClick: false # 是否一键安装#allowElevation: true # 允许请求提升权限allowToChangeInstallationDirectory: true # 允许修改安装目录createDesktopShortcut: true # 创建桌面快捷方式createStartMenuShortcut: true # 创建开始菜单快捷方式
安装配置env环境变量
npm install dotenv-webpack --save-dev
const Dotenv = require('dotenv-webpack');
module.exports = {configureWebpack: {plugins: [new Dotenv({path: `./.env.${process.env.NODE_ENV}`,})]}
};
npm install cross-env --save-dev
{..."scripts": {// "serve": "vue-cli-service serve","serve": "cross-env NODE_ENV=development vue-cli-service serve",// "build": "vue-cli-service build","build": "cross-env NODE_ENV=production vue-cli-service build",...},}
touch .env.development
touch .env.production
// .env.development
API_URL=https://dev.api.example.com
// .env.production
API_URL=https://pro.api.example.com
安装vue-router配置
npm install vue-router
// src/router/index.js
import { createRouter, createWebHistory, createWebHashHistory } from 'vue-router';
import HelloWorld from '../components/HelloWorld.vue';const routes = [{ path: '/', component: HelloWorld }
];const router = createRouter({// 打包用createWebHashHistory,如果用createWebHistory,页面会出现白板。history: process.env.NODE_ENV === 'production'? createWebHashHistory(process.env.BASE_URL): createWebHistory(process.env.BASE_URL),routes,
});
执行命令
npm run electron:serve
// 先执行vue的打包
npm run build
// 再执行electron的打包
npm run electron:build
相关文章:
创建Electron35 + vue3 + electron-builder项目,有很过坑,记录过程
环境: node v20.18.0 npm 11.1.0 用到的所有依赖: "dependencies": {"core-js": "^3.8.3","vue": "^3.2.13","vue-router": "^4.5.0"},"devDependencies": {"ba…...
FPGA 实验报告:四位全加器与三八译码器仿真实现
目录 安装Quartus软件 四位全加器 全加器、半加器 半加器: 全加器: 四位全加器电路图 创建项目 半加器 全加器 四位全加器 代码实现 半加器 全加器 四位全加器 三八译码器 创建项目 代码展示 modelsim仿真波形图 四位全加器 三八译码…...
动态规划详解(二):从暴力递归到动态规划的完整优化之路
目录 一、什么是动态规划?—— 从人类直觉到算法思维 二、暴力递归:最直观的问题分解方式 1. 示例:斐波那契数列 2. 递归树分析(以n5为例) 3. 问题暴露 三、第一次优化:记忆化搜索(Memoiza…...
前端学习——HTML
HTML VSCode常用快捷键HTML标签文本标签列表标签表格Form表单表单元素 块元素与行内元素新增标签 VSCode常用快捷键 代码格式化:ShiftAltF 向上或向下移动一行:AltUp或AltDown 快速复制一行代码:ShiftAltUp或者ShiftAltDown 快速替换&#x…...
12.【线性代数】——图和网络
十二 图和网络(线性代数的应用) 图 g r a p h { n o d e s , e d g e s } graph\{nodes, edges\} graph{nodes,edges}1.关联矩阵2. A A A矩阵的零空间,求解 A x 0 Ax0 Ax0 电势3. A T A^T AT矩阵的零空间,电流总结电流图结论 …...
[环境搭建篇] Windows 环境下如何安装repo工具
Windows 环境下如何安装repo工具 1. 安装前置依赖2. 配置Repo引导脚本方法一:通过Gitee镜像安装(推荐)方法二:通过清华镜像安装 3. 解决依赖问题4. 初始化Repo仓库5. 常见问题解决 前言: 在Windows环境下安装Repo工具需…...
LeetCode 热题 100_字符串解码(71_394_中等_C++)(栈)
LeetCode 热题 100_字符串解码(71_394) 题目描述:输入输出样例:题解:解题思路:思路一(栈): 代码实现代码实现(栈):以思路一为例进行调…...
「DataX」数据迁移-IDEA运行DataX方法总结
背景 业务需求希望把Oracle数据库中的数据,迁移至MySql数据库中,因为需要迁移全量和增量的数据,所以希望想用数据迁移工具进行操作。 经过一些调研查询,最终打算使用DataX进行数据的迁移。 DataX简单介绍 DataX 是阿里云 DataW…...
【 <一> 炼丹初探:JavaWeb 的起源与基础】之 Servlet 过滤器:实现请求的预处理与后处理
<前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、过滤器&…...
DeepSeek与浏览器自动化AI Agent构建指南
文章使用到的模型可以用硅基流动中的: 注册链接:硅基流动统一登录 邀请码:FytHp9Xa 一、技术选型阶段 1. 基础组件选择 AI模型:DeepSeek-R1开放API(对话/推理)或DeepSeek-Coder(代码生成&#…...
面试中常问的mysql数据库指令【杭州多测师_王sir】
数据库中的修改表结构、增删改查、用户权限操作DDL 》数据库定义语言 create database,create table drop tableDML 》数据库操作语言 insert into,delete from,update set,DQL 》数据库查询语言 select .... from....crea…...
深度学习驱动的智能化革命:从技术突破到行业实践
第一章 深度学习的技术演进与核心架构 1.1 从浅层网络到深度学习的范式转变 深度学习的核心在于通过多层次非线性变换自动提取数据特征,其发展历程可划分为三个阶段:符号主义时代的规则驱动(1950s-1980s)、连接主义时代的浅层网络(1990s-2000s)以及深度学习时代的端到端…...
基于编译器特性浅析C++程序性能优化
最近在恶补计算机基础知识,学到CSAPP第五章的内容,在这里总结并且展开一下C程序性能优化相关的内容。 衡量程序性能的方式 一般而言,程序的性能可以用CPE(Cycles Per Element)来衡量,其指的是处理每个元素…...
服务器上通过ollama部署deepseek
2025年1月下旬,DeepSeek的R1模型发布后的一周内就火了,性能比肩OpenAI的o1模型,且训练成本仅为560万美元,成本远低于openAI,使得英伟达股票大跌。 下面我们来看下如何个人如何部署deepseek-r1模型。 我是用的仙宫云的…...
Android Coil总结
文章目录 Android Coil总结概述添加依赖用法基本用法占位图变形自定义ImageLoader取消加载协程支持缓存清除缓存监听 简单封装 Android Coil总结 概述 Coil 是一个用于 Android 的 Kotlin 图像加载库,旨在简化图像加载和显示的过程。它基于 Kotlin 协程࿰…...
《安富莱嵌入式周报》第351期:DIY半导体制造,工业设备抗干扰提升方法,NASA软件开发规范,小型LCD在线UI编辑器,开源USB PD电源,开源锂电池管理
周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 视频版: https://www.bilibili.com/video/BV16C95YEEZs 《安富莱嵌入式周报》第351期:DIY半导体…...
Redis在人员管理系统中的应用示例
用户会话管理 场景:用户登录后存储会话信息,支持多服务器共享 实现: 用户登录成功后,生成唯一Token(如JWT),作为Redis的Key Value存储用户ID、角色、权限等信息,设置过期时间&…...
The Wedding Juicer POJ - 2227
采取从外层边界,一步一步向内部拓展的策略,具体来说,一开始将最外面一层的点加入队列,并标记这些点的坐标已经被访问 取出队列中高度最低的点,将其弹出,查看其上下左右的点,如果新点没有被访问…...
# 深入理解RNN(一):循环神经网络的核心计算机制
深入理解RNN:循环神经网络的核心计算机制 RNN示意图 引言 在自然语言处理、时间序列预测、语音识别等涉及序列数据的领域,循环神经网络(RNN)一直扮演着核心角色。尽管近年来Transformer等架构逐渐成为主流,RNN的基本原理和思想依然对于理…...
分布式锁—6.Redisson的同步器组件
大纲 1.Redisson的分布式锁简单总结 2.Redisson的Semaphore简介 3.Redisson的Semaphore源码剖析 4.Redisson的CountDownLatch简介 5.Redisson的CountDownLatch源码剖析 1.Redisson的分布式锁简单总结 (1)可重入锁RedissonLock (2)公平锁RedissonFairLock (3)联锁MultiL…...
在GitHub项目中集成Taotoken多模型API的完整配置指南
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在GitHub项目中集成Taotoken多模型API的完整配置指南 将大模型能力集成到GitHub托管的项目中,是现代开发工作流的常见需…...
别再为Android M闪退头疼了!手把手教你用Desugaring搞定Java 8新API兼容
彻底解决Android低版本Java 8兼容性问题:从崩溃分析到Desugaring实战 当你在Android M设备上看到java.lang.NoClassDefFoundError: Failed resolution of: Ljava/time/LocalDate;这样的崩溃日志时,是否感到既熟悉又无奈?这种兼容性问题困扰着…...
Shannon 没有想到的事——当信息论遇上有限算力
从一个日常经验开始你有没有过这种体验——打开一本教科书,前三页还能跟上,到第四页突然看不懂了。每个字你都认识,但连在一起就变成了噪音。你翻回去重读,还是不行。于是你合上书,换了一本"入门版"…...
终极HttpBin容器化部署指南:5分钟完成Kubernetes环境快速配置 [特殊字符]
终极HttpBin容器化部署指南:5分钟完成Kubernetes环境快速配置 🚀 【免费下载链接】httpbin HTTP Request & Response Service, written in Python Flask. 项目地址: https://gitcode.com/gh_mirrors/ht/httpbin HttpBin是一个强大的HTTP请求…...
Tauri + Next.js 桌面应用开发:从架构到部署的完整实践指南
1. 项目概述:一个现代桌面应用开发的“瑞士军刀” 最近在折腾一个桌面端的小工具,需要把Web前端那套东西打包成一个独立的桌面应用。一开始想着用Electron,毕竟生态成熟,但一想到那动辄上百兆的安装包和不算低的内存占用…...
2026年电工杯比赛思路、Python代码、Matlab代码、论文(持续更新中......)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
HDD与SSD存储技术演进:从产业变迁看成本容量比与分层存储实践
1. 硬盘驱动器产业的十字路口:一场迟来的告别十多年前,当我在实验室里第一次把玩一块2.5英寸的机械硬盘,惊叹于它能在方寸之间存储数十GB的数据时,绝不会想到,这个看似坚不可摧的存储基石,其背后的商业帝国…...
如何快速解密RPG Maker加密文件:新手必看的完整解密指南
如何快速解密RPG Maker加密文件:新手必看的完整解密指南 【免费下载链接】RPGMakerDecrypter Tool for decrypting and extracting RPG Maker XP, VX and VX Ace encrypted archives and MV and MZ encrypted files. 项目地址: https://gitcode.com/gh_mirrors/rp…...
智能算法车队换道决策与轨迹规划【附仿真】
✨ 长期致力于车队换道、支持向量机、决策树、换道决策、多目标优化研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)NGSIM数据清洗与特征重构…...
DeepSeek本地部署:从零开始,把大模型跑在自己电脑上
DeepSeek本地部署:从零开始,把大模型跑在自己电脑上我们公司因为数据安全要求,所有文档不能传到外部API。但团队又想用AI辅助写代码、做文档分析。解决方案:本地部署DeepSeek。这篇文章记录了完整的部署过程、踩过的坑、以及部署之…...
