vue3+ts+vite+electron+electron-store+electron-builder打包可安装包

yarn create vite


yarn add electron

 yarn add electron-store

 yarn add electron-builder

 新增main.js、preload.js

// main.js
const { app, BrowserWindow, ipcMain, globalShortcut } = require('electron')
const path = require('path')
let store // 我们将在稍后动态导入 electron-storelet mainWindow = nullconst createWindow = () => {mainWindow = new BrowserWindow({width: 1200, // 打开界面宽minWidth: 1200, // 打开界面最小宽height: 800, // 打开界面高minHeight: 800, // 打开界面最小高fullscreen: false, // 是否启动全屏resizable: true, // 是否允许调整窗口大小autoHideMenuBar: true, // 工具栏隐藏alwaysOnTop: true, // 窗口是否总是显示在其他窗口的上方icon: path.join(__dirname, './public/favicon.ico'), // 设置窗口图标webPreferences: {// 与网页相关的偏好设置preload: path.join(__dirname, 'preload.js'),contextIsolation: true,nodeIntegration: false}})if (process.env.VITE_DEV_SERVER_URL) {mainWindow.loadURL(process.env.VITE_DEV_SERVER_URL)} else {mainWindow.loadFile(path.join(__dirname, './dist/index.html'))}// 注册刷新页面快捷键globalShortcut.register('Ctrl+R', () => {mainWindow.reload()})// 注册打开控制台快捷键globalShortcut.register('Ctrl+Shift+I', () => {mainWindow.webContents.openDevTools()})mainWindow.on('closed', () => {mainWindow = null// 注销所有快捷键globalShortcut.unregisterAll()})
}app.whenReady().then(async () => {const Store = (await import('electron-store')).defaultstore = new Store()createWindow()// 在所有窗口关闭时注销快捷键app.on('window-all-closed', () => {globalShortcut.unregisterAll()if (process.platform !== 'darwin') {app.quit()}})app.on('activate', () => {if (BrowserWindow.getAllWindows().length === 0) {createWindow()}})
})ipcMain.handle('getStoreValue', (event, key) => {return store.get(key)
})ipcMain.handle('setStoreValue', (event, key, value) => {store.set(key, value)
})
ipcMain.handle('delStoreValue', () => {store.clear()console.log('已经清理')
})
// preload.js
const { contextBridge, ipcRenderer } = require('electron')// 向渲染进程暴露 Electron 特定的 API
contextBridge.exposeInMainWorld('electron', {getStoreValue: (key) => ipcRenderer.invoke('getStoreValue', key),setStoreValue: (key, value) =>ipcRenderer.invoke('setStoreValue', key, value),delStoreValue: () => ipcRenderer.invoke('delStoreValue')
})// 添加全局变量来指示是否在 Electron 环境中运行
contextBridge.exposeInMainWorld('isElectron', true)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])}
})
// vite.config.ts
import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";// https://vitejs.dev/config/
export default defineConfig({plugins: [vue()],base: "./",    // 必须
});

 

// app页面添加electron-store测试代码
<script setup lang="ts">
import HelloWorld from './components/HelloWorld.vue'
// 用于测试electron-store
setTimeout(() => {console.log('写入', window.electron)window.electron.setStoreValue('key', '我是写入数据')}, 1000)setTimeout(() => {const v = window.electron.getStoreValue('key')console.log('读取', v)}, 5000)</script><template><div><a href="https://vitejs.dev" target="_blank"><img src="/vite.svg" class="logo" alt="Vite logo" /></a><a href="https://vuejs.org/" target="_blank"><img src="./assets/vue.svg" class="logo vue" alt="Vue logo" /></a></div><HelloWorld msg="Vite + Vue" />
</template><style scoped>
.logo {height: 6em;padding: 1.5em;will-change: filter;transition: filter 300ms;
}
.logo:hover {filter: drop-shadow(0 0 2em #646cffaa);
}
.logo.vue:hover {filter: drop-shadow(0 0 2em #42b883aa);
}
</style>
// src/electron.d.tsexport interface ElectronAPI {getStoreValue: (key: string) => Promise<any>;setStoreValue: (key: string, value: any) => Promise<void>;
}declare global {interface Window {electron: ElectronAPI;}
}

 

 "name": "test","private": true,"version": "0.0.0",  // 新增"description": "hello world",// 新增"main": "main.js", // 新增"author": "han",  // 新增"license": "MIT",   // 新增
"scripts": {"dev": "vite","build": "vue-tsc -b && vite build","start": "electron .",    // 新增"build-builder": "electron-builder",  // 新增"preview": "vite preview"},"build": {  // 新增build"appId": "com.yourcompany.yourapp","win": {"target": "nsis","icon": "./public/icon.ico"},"linux": {"icon": "./public/icon.png"},"dmg": {"contents": [{"x": 410,"y": 150,"type": "link","path": "/Applications"},{"x": 130,"y": 150,"type": "file"}]},"mac": {"icon": "./public/icon.ico"},"files": ["dist/**/*","main.js","preload.js"],"directories": {"output": "awBack2"},"nsis": {"oneClick": false,"allowToChangeInstallationDirectory": true,"createDesktopShortcut": true,"createStartMenuShortcut": true,"shortcutName": "aw"}},

yarn build 

yarn start 

 

yarn build-builder 

{"name": "test","private": true,"version": "0.0.0","description": "hello world","main": "main.js","author": "han","license": "MIT","scripts": {"dev": "vite","build": "vue-tsc -b && vite build","start": "electron .","build-builder": "electron-builder","preview": "vite preview"},"build": {"appId": "com.yourcompany.yourapp","win": {"target": "nsis","icon": "./public/icon.ico"},"linux": {"icon": "./public/icon.png"},"dmg": {"contents": [{"x": 410,"y": 150,"type": "link","path": "/Applications"},{"x": 130,"y": 150,"type": "file"}]},"mac": {"icon": "./public/icon.ico"},"files": ["dist/**/*","main.js","preload.js"],"directories": {"output": "awBack2"},"nsis": {"oneClick": false,"allowToChangeInstallationDirectory": true,"createDesktopShortcut": true,"createStartMenuShortcut": true,"shortcutName": "aw"}},"dependencies": {"electron-store": "^10.0.0","vue": "^3.4.37"},"devDependencies": {"@vitejs/plugin-vue": "^5.1.2","electron": "^32.0.1","electron-builder": "^24.13.3","typescript": "^5.5.3","vite": "^5.4.1","vue-tsc": "^2.0.29"}
}

 

 

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

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

相关文章

关于几道计算机网络题的解答

2017年12月28日&#xff0c;星期四&#xff0c; 照片上的第一题中多项式的指数看不清&#xff0c;但没关系&#xff0c;就现在的情形&#xff0c;说一下大概的思路&#xff0c;参考着再结合题目中实际的参数&#xff0c;再套一遍就能把题目解出来了&#xff0c; 假设&#xf…

raksmart大带宽服务器怎么租

RAKsmart是一个提供大带宽服务器租赁服务的厂商&#xff0c;其机房遍布不同国家与地区如美国、日本、新加坡及韩国等&#xff0c;且有大陆优化和国际BGP两条线路可供选择。Rak小编下面将详细介绍如何租用RAKsmart的大带宽服务器&#xff0c;并提供一些考量因素。 1. 选择机房位…

【软件造价咨询】AI大模型能不能替代软件工程造价师完成软件造价?

当前国内外AI大模型呈现出多样化的发展态势&#xff0c;如由OpenAI开发的自然语言处理大模型GPT系列、由Google开发的基于Transformer的双向编码表示模型BERT、由百度研发的基于飞桨深度学习平台和知识增强大模型文心一言、由阿里研发的多轮对话大模型通义千问、由清华大学计算…

中兴-ZSRV2路由器-任意文件读取

中兴-ZSRV2路由器-任意文件读取 文章目录 中兴-ZSRV2路由器-任意文件读取免责声明漏洞描述搜索语法漏洞复现修复建议 免责声明 文章中涉及的程序(方法)可能带有攻击性&#xff0c;仅供安全研究与教学之用&#xff0c;读者将其信息做其他用途&#xff0c;由用户承担全部法律及连…

NSSCTF刷题

[NISACTF 2022]checkin 1.在选中nisactf的时候&#xff0c;注释里面的内容也被标记了 2.复制到010editer中发现存在不可见的字符 3.我们选择实际的参名和字符串&#xff0c;并转为url编码格式 4.得到最后的payload&#xff0c;传参得到flag ahahahahajitanglailo&%E2%80%…

uniapp中使用弹出框控制Tab栏区域显示与隐藏

在uniapp中提供控制TabBar的显示与隐藏的函数 uni.hideTabBar() 与 uni.showTabBar() <nut-button block type"primary" click"JDdetail()" >立即接单</nut-button> <---弹出框---> <nut-popup style"z-index: 999;" posi…

windows平台完全卸载visual studio 2022

1. 搜索框输入cmd&#xff0c;以管理员身份运行 2. 在命令行里输入以下指令&#xff08;包含双引号&#xff09;&#xff1a; "C:\Program Files (x86)\Microsoft Visual Studio\Installer\InstallCleanup.exe" 参考官网&#xff1a;解除安裝或移除 Visual Studio…

第十三节:学习Springboot整合mybatis——完整篇(自学Spring boot 3.x的第三天)

大家好&#xff0c;今天记录下学习springboot的第三天。​网创有方 这节详细记录了如何使用springboot整合mybatis方法&#xff0c;并成功实现将请求信息插入本地的mysql数据库。 由于只是为了方便本地验证&#xff0c;实际项目是需要部署到服务器上去的&#xff0c;所以就采用…

开学啦!校园跑腿小程序开发,焕新生活尽在指尖!

随着移动互联网技术的不断发展&#xff0c;校园跑腿小程序成为了高校生活中不可或缺的一部分。无论是代拿快递、代买物品&#xff0c;还是代办各种事务&#xff0c;校园跑腿小程序都能为学生提供极大的便利。 校园内的人群密集&#xff0c;购买东西的需求尤为强烈&#xff0c;…

tornado获取请求参数

在Tornado框架中&#xff0c;获取请求参数&#xff08;包括查询字符串参数、表单数据、JSON数据等&#xff09;可以通过RequestHandler类提供的方法来完成。以下是一些常用的方法来获取不同类型的请求参数&#xff1a; 1. 获取查询字符串参数 查询字符串参数是附加在URL后面的…

2023年中国90后十大影响力人物

“2023年中国90后十大影响力人物” 2024年1月23日&#xff0c;揭晓了由网友投票评选的中国2023年90后十大影响力人物。

每日一练2:两个数组的交集(含链接)

链接&#xff1a; 两个数组的交集_牛客题霸_牛客网 代码&#xff1a; class Solution {public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {bool hash[1001] { };vector<int> ret;for(auto a : nums1){hash[a] tr…

SprinBoot+Vue宠物领养救助微信小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平…

Ribbon负载均衡底层原理

springcloude服务实例与服务实例之间发送请求&#xff0c;首先根据服务名注册到nacos&#xff0c;然后发送请求&#xff0c;nacos可以根据服务名找到对应的服务实例。 SpringCloudRibbon的底层采用了一个拦截器&#xff0c;拦截了openfeign发出的请求&#xff0c;对地址做了修…

SpringBoot链路追踪②:如何集成?

首先下载Zipkin的jar包&#xff1a;Central Repository: io/zipkin/zipkin-server (maven.org) 根据自己的项目版本。我的版本分别是&#xff1a; <spring-boot.version>2.7.18</spring-boot.version> <spring-cloud.version>2021.0.8</spring-cloud.ve…

滚雪球学MyBatis-Plus(07):分页与排序

前言 在上期内容中&#xff0c;我们深入探讨了如何创建服务类和控制器&#xff0c;并通过 RESTful API 提供对外服务。我们学会了如何处理客户端的各种请求并返回相应的结果&#xff0c;这为构建一个完整的 Web 应用程序打下了基础。 本期内容将进一步深入&#xff0c;重点介…

【kafka】在Linux系统中部署配置Kafka的详细用法教程分享

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

文件IO函数练习

作业&#xff1a;使用write和read完成文件的拷贝。 代码 #include <myhead.h>int main(int argc, const char *argv[]) {int fd open("./1.txt",O_RDONLY);//已只读打开被拷贝文件if(-1 fd){perror("open");return -1;}int fd1 open("./2.…

uniapp微信小程序开发测试获取手机号码

先申请测试号 注意认证但是没有完全认证不要试测试号解密如下 总结我自己的两大坑 1.官网的WXBizDataCrypt需要导入crypto要提前下载但是试了很多次没有效果重新编写这个。将crypto库换成crypto-js库 2.我一直在尝试用下有下面这个界面的测试号不行获取不到用户的code还是啥忘记…

【Unity编辑器扩展】SpriteAltas资源一键转换为TMP_SpriteAsset或Sprite图集

【Unity编辑器扩展】艺术字/自定义图片字体/TextMeshPro艺术字生成工具_unity 艺术字-CSDN博客 博文工具源码见GF_X自动化游戏开发框架&#xff1a;GitHub - sunsvip/GF_X: Unity GameFramework HybridCLR&#xff0c;Includes several automated editor extension tools, an …