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. 选择机房位…

中兴-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%…

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

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

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

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

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…

【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 …

【时间盒子】-【3.新建项目】创建元服务工程,选择默认模板Empty Ability

一、新建项目 1、打开DevEco Studio >>文件>>新建>>新建项目&#xff0c;选择元服务 Atomic Service>>默认模板Empty Ability。 2、设置元服务的工程名称、Bundle name等&#xff0c;模型选Stage&#xff0c;语言是ArkTS&#xff0c;支持的设备类型只…

Web安全:SQL注入实战测试.(扫描 + 测试)

Web安全&#xff1a;SQL注入实战测试. SQL注入就是 有些恶意用户在提交查询请求的过程中 将SQL语句插入到请求内容中&#xff0c;同时程序的本身对用户输入的内容过于相信&#xff0c;没有对用户插入的SQL语句进行任何的过滤&#xff0c;从而直接被SQL语句直接被服务端执行&am…

【Python】3.基础语法(3)函数

文章目录 1.函数2.语法格式3.函数参数4. 函数返回值5. 变量作用域6.函数执行过程7. 链式调用8.嵌套调用9. 函数递归10. 参数默认值11. 关键字参数 1.函数 编程中的函数, 是一段 可以被重复使用的代码片段。 代码示例: 求数列的和, 不使用函数 # 1. 求 1 - 100 的和 sum 0 f…

“立创EDA专业版”笔记

目录 二、立创EDA专业版 2.0 整体功能 2.0.1 快捷键 2.1 右侧功能栏 2.1.1 过滤 2.2 PCB设计 2.2.1 切换亮度 2.2.2 偏移 2.2.3 单位切换 2.2.4 检查DRC 2.2.5 重新铺铜 2.2.6 布线 2.2.7 锁定 2.2.8 “过滤”设置锁定 2.3 上方菜单栏 2.3.1 保存文件 2.4 元件…

安卓(Android)平台上的MVVM架构:关键知识点、优劣分析及实践示例

​ 一、安卓MVVM架构核心知识点 1.1、架构组成 1.1.1、Model层 承载业务逻辑与数据实体&#xff0c;独立于UI并与ViewModel进行交互&#xff0c;实现数据获取与处理功能。 1.1.2、View层 负责用户界面展示&#xff0c;借助Android XML布局文件及Activity/Fragment等组件&a…