当前位置: 首页 > news >正文

【electron-vite】搭建electron+vue3框架基础

一、拉取项目 electron-vite

中文文档地址: https://cn-evite.netlify.app/guide/

官网网址:https://evite.netlify.app/

版本

vue版本:vue3
构建工具:vite
框架类型:Electron
JS语法:TypeScript (目前未使用,TS限制太麻烦,我没有采用,当前版本JavaScript)

使用包管理器(如 NPM、Yarn 或 pnpm)安装 ,如果你的网络环境不佳,推荐使用 cnpm 或使用 npmmirror

安装

前提条件

electron-vite 需要 Node.js 版本 18+,20+ 和 Vite 版本 4.0+

npm i electron-vite -D
搭建第一个 electron-vite 项目
npm create @quick-start/electron@latest

在这里插入图片描述

运行项目:

	cd electron-appnpm installnpm run dev

二、安装路由和二次封装

路由vue-router

npm install vue-router -S

在这里插入图片描述

二次封装路由

二次封装路由:为了方便后期维护和管理

1.在新建 electron-app\src\renderer\src目录下新增文件夹 views,存放vue页面。

2.在views目录下新增Login.vue,Home.vue文件用于测试。

<script setup></script><template><div>首页/登录</div>
</template>

在这里插入图片描述

3.清理App.vue里面的无关的代码,添加router-view 标签

<template><router-view></router-view>
</template>

4.electron-app\src\renderer\src 下新增router目录,存放路由相关配置文件

在这里插入图片描述

5.router目录下 新增 index.js (配置入口)

import { createRouter, createWebHashHistory } from 'vue-router'//引入路由表
import { AppRoutes } from './routes'
//引入导航守卫
import { beforeEach, afterEach } from './guards'const router = createRouter({history: createWebHashHistory(), //hash模式routes: AppRoutes
})//全局前置导航守卫
router.beforeEach(beforeEach)//全局后置导航守卫
router.afterEach(afterEach)export default router

6.router目录下 新增routes.js (路由表 )

/*** 路由表*/export const AppRoutes = [{path: '/',name: '登录',component: () => import('../views/Login.vue')},{path: '/',name: '首页',component: () => import('../views/Home.vue')}
]

7.router目录下 新增 guards.js (导航守卫)

/****导航守卫*///前置
export const beforeEach = () => {console.log('前置')return true
}//后置
export const afterEach = () => {console.log('后置')
}

8.在src\renderer\src\main.js 中引入路由

//import './assets/main.css'import { createApp } from 'vue'
import App from './App.vue'import router from './router'createApp(App).use(router).mount('#app')

9.测试路由是否正常访问

npm run dev 启动项目,访问是否正常显示内容。

三、安装store (pinia) 和持久化存储

安装插件pinia

pinia的优点

  • 更好的支持vue3和Ts
  • vuedevtools更好的支持pinia
  • 支持服务端渲染
  • 支持插件扩展功能

1.下载安装pinia

npm install pinia -S

在这里插入图片描述

安装插件pinnia-plugin-persist

2.下载安装pinnia-plugin-persist 用于持久化存储

pinnia-plugin-persist 是一个用于 Vue.js 应用的状态管理库 Pinnia 的一个插件,它用于在浏览器中持久化状态。有时候我们需要持久化state数据,vue2我们采用localstorage多一点,这里我们推荐使用pinia-plugin-persist,安装 pinia-plugin-persist。

npm i pinia-plugin-persist

在这里插入图片描述

持久化存储

3.src目录下新增store目录,新增modules目录,这里存放模块的store文件。

举例新增useUserStore.js文件,配置persist

import { defineStore } from 'pinia'// useStore 可以是 useUser、useCart 之类的任何东西
// 第一个参数是应用程序中 store 的唯一 id
export const useUserStore = defineStore('userStore', {// 推荐使用 完整类型推断的箭头函数state: () => {return {token: 'xxxxxxxxxxxxxxxxxxabcd'}},actions: {},getters: {},persist: {// 开启持久化enabled: true,// 选择存储方式和内容strategies: [{storage: localStorage, //默认走sessionpaths: ['token']}]}
})

增加全局store : 新建index.js文件 ,存放公共配置,引入useUserStore。模块少的话其实可以不用写,可以忽略这个。

import { defineStore } from 'pinia'import { useUserStore } from './modules/useUserStore'export const useStore = defineStore('storeId', {// 推荐使用 完整类型推断的箭头函数state: () => {return {user: useUserStore() //用户}},actions: {},getters: {},
})

在这里插入图片描述

4.在mian.js中引入并use 引入注册

// 使用持久化插件
import piniaPluginPersist from 'pinia-plugin-persist'
const store = createPinia()
store.use(piniaPluginPersist)createApp(App).use(router).use(store).mount('#app')

5.测试,修改Login.vue文件如下。npm run dev 运行 后,在浏览器打开,控制台调试模式,点击按钮,查看浏览器的Local storage是否生效

<script setup name="">
import { useUserStore } from '../store/modules/useUserStore'
const userStore = useUserStore()const getToken =()=>{userStore.token = '测试'
}
</script><template><div>首页</div><button @click="getToken">token</button><div>{{ userStore.token}}</div>
</template>

测试运行如下:

在这里插入图片描述

四、路径别名

配置文件 electron.vite.config.mjs

import { resolve } from 'path'
import { defineConfig, externalizeDepsPlugin } from 'electron-vite'
import vue from '@vitejs/plugin-vue'export default defineConfig({main: {plugins: [externalizeDepsPlugin()]},preload: {plugins: [externalizeDepsPlugin()]},renderer: {resolve: {alias: {'@renderer': resolve('src/renderer/src'),//增加路径别名'@store': resolve('src/renderer/src/store'),'@views': resolve('src/renderer/src/views'),'@router': resolve('src/renderer/src/router'),'@components': resolve('src/renderer/src/components')}},plugins: [vue()]}
})

在这里插入图片描述

之前文件的引入都可以修改为别名的形式

export const AppRoutes = [{path: '/',name: '登录',component: () =>import ('@views/Login.vue')},{path: '/',name: '首页',component: () =>import ('@views/Home.vue')}
]import { useUserStore } from '@store/modules/useUserStore'//引入路由表
import { AppRoutes } from '@router/routes'
//引入导航守卫
import { beforeEach, afterEach } from '@router/guards'

五、配置代理 和请求二次封装

配置代理

  1. 配置文件 electron.vite.config.mjs中 renderer下面的

resolve:同级新增配置

 server: {proxy: {'/api': {target: 'http://127.0.0.1:3000', //访问地址changeOrigin: true,rewrite: (path) => path.replace(/^\/api/, '')}}},

安装插件axious

1.下载安装 axious

npm install axios

在这里插入图片描述

请求二次封装

2.src目录下新增 utils/request.js文件

配置请求拦截器 ,响应拦截器

import axios from 'axios'//创建axious对象
const request = axios.create({baseURL: '/api'
})// 添加请求拦截器
request.interceptors.request.use(function (config) {// 在发送请求之前做些什么return config},function (error) {// 对请求错误做些什么return Promise.reject(error)}
)// 添加响应拦截器
request.interceptors.response.use(function (response) {// 2xx 范围内的状态码都会触发该函数。// 对响应数据做点什么return response},function (error) {// 超出 2xx 范围的状态码都会触发该函数。// 对响应错误做点什么return Promise.reject(error)}
)export default request

3.electron.vite.config.mjs文件内配置api目录和utils目录的路径别名。

alias: {'@renderer': resolve('src/renderer/src'),//增加路径别名'@store': resolve('src/renderer/src/store'),'@views': resolve('src/renderer/src/views'),'@router': resolve('src/renderer/src/router'),'@components': resolve('src/renderer/src/components'),'@utils': resolve('src/renderer/src/utils'),'@api': resolve('src/renderer/src/api'),}

4.src目录下新增 api目录 ,存放api请求文件。举例新增login.js

import request from '../utils/request'
export const loginByJson = (data) => {return request({url: '/u/loginByJson',method: 'post',data})
}

5.测试

六、安装使用Element Plus

官网:一个 Vue 3 UI 框架 | Element Plus

安装element-plus

1.安装element-plus

npm install element-plus --save

在这里插入图片描述

完整引入

如果你对打包后的文件大小不是很在乎,那么使用完整导入会更方便。

// main.ts
import { createApp } from 'vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import App from './App.vue'const app = createApp(App)app.use(ElementPlus)
app.mount('#app')

按需引入

按需导入:您需要使用额外的插件来导入要使用的组件。

自动导入推荐

2.首先你需要安装unplugin-vue-componentsunplugin-auto-import这两款插件

npm install -D unplugin-vue-components unplugin-auto-import

在这里插入图片描述

3.配置你的 Vite 的配置文件,即electron.vite.config.mjs 文件中,引入

// vite.config.ts
import { defineConfig } from 'vite'
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'export default defineConfig({// ...plugins: [// ...AutoImport({resolvers: [ElementPlusResolver()],}),Components({resolvers: [ElementPlusResolver()],}),],
})

所有代码如下 electron.vite.config.mjs

import { resolve } from 'path'
import { defineConfig, externalizeDepsPlugin } from 'electron-vite'
import vue from '@vitejs/plugin-vue'//引入
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'export default defineConfig({main: {plugins: [externalizeDepsPlugin()]},preload: {plugins: [externalizeDepsPlugin()]},renderer: {resolve: {alias: {'@renderer': resolve('src/renderer/src'),//增加路径别名'@store': resolve('src/renderer/src/store'),'@views': resolve('src/renderer/src/views'),'@router': resolve('src/renderer/src/router'),'@components': resolve('src/renderer/src/components'),'@utils': resolve('src/renderer/src/utils'),'@api': resolve('src/renderer/src/api')}},server: {proxy: {'/api': {target: 'http://127.0.0.1:3000',changeOrigin: true,rewrite: (path) => path.replace(/^\/api/, '')}}},plugins: [AutoImport({resolvers: [ElementPlusResolver()]}),Components({resolvers: [ElementPlusResolver()]}),vue()]}
})

4.测试,Login.vue中添加组件,运行查看页面效果

<script setup name="">
import { useUserStore } from '@store/modules/useUserStore'const userStore = useUserStore()const getToken =()=>{userStore.token = '测试'
}import { loginByJson } from '@api/login';
const getLogin = async()=>{
let res = await loginByJson({"password": "Admin",//密码"username": "Admin",//用户名}
)
}
</script><template><div>首页</div><button @click="getToken">token</button><button @click="getLogin">登录</button><el-button type="primary" >Primary</el-button><div>{{ userStore.token}}</div>
</template>

下载引入icon

1.安装

npm install @element-plus/icons-vue

在这里插入图片描述

2.main.js中引入

// main.js// 如果您正在使用CDN引入,请删除下面一行。
import * as ElementPlusIconsVue from '@element-plus/icons-vue'const app = createApp(App)
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {app.component(key, component)
}

相关文章:

【electron-vite】搭建electron+vue3框架基础

一、拉取项目 electron-vite 中文文档地址&#xff1a; https://cn-evite.netlify.app/guide/ 官网网址&#xff1a;https://evite.netlify.app/ 版本 vue版本&#xff1a;vue3 构建工具&#xff1a;vite 框架类型&#xff1a;Electron JS语法&#xff1a;TypeScript &…...

05《存储器层次结构与接口》计算机组成与体系结构 系列课

目录 存储器层次结构概述 层次结构的定义 存储器的排名 存储器接口 处理器与存储器的速度匹配 存储器接口的定义 存储器访问命中率 两种接口 第1种方式&#xff1a;并行 命中率的计算 存储器访问时间 第2种方式&#xff1a;逐级 结语 大家好&#xff0c;欢迎回来。…...

elasticsearch报错fully-formed single-node cluster with cluster UUID

1.问题描述 k8s集群内部署的es中间件起不来&#xff0c;查看日志发现如下警告&#xff0c;节点发现功能开启&#xff0c;但是目前我是单节点服务&#xff0c;所以尝试编辑sts将节点发现功能去掉或者在部署时将你的sts的yaml文件和chart文件修改重新部署以去掉该功能 {"t…...

Milvus×Florence:一文读懂如何构建多任务视觉模型

近两年来多任务学习&#xff08;Multi-task learning&#xff09;正取代传统的单任务学习&#xff08;single-task learning&#xff09;&#xff0c;逐渐成为人工智能领域的主流研究方向。其原因在于&#xff0c;多任务学习可以让我们以最少的人力投入&#xff0c;获得尽可能多…...

DAPP

02-DAPP 1 啥是 DApp&#xff1f; DApp&#xff0c;部署在链上的去中心化的应用。 DApp 是开放源代码&#xff0c;能运行在分布式网络上&#xff0c;通过网络中不同对等节点相互通信进行去中心化操作的应用。 DAPP 开放源代码&#xff0c;才能获得人的信任。如比特币&#xff…...

生产环境中,nginx 最多可以代理多少台服务器,这个应该考虑哪些参数 ?怎么计算呢

生产环境中&#xff0c;nginx 最多可以代理多少台服务器&#xff0c;这个应该考虑哪些参数 &#xff1f;怎么计算呢 关键参数计算方法评估步骤总结 在生产环境中&#xff0c;Nginx最多可以代理的服务器数量并没有一个固定的限制&#xff0c;它取决于多个因素&#xff0c;包括Ng…...

【深度学习|目标跟踪】StrongSORT 详解(以及StrongSORT++)

StrongSort详解 1、论文及源码2、DeepSORT回顾3、StrongSORT的EMA4、StrongSORT的NSA Kalman5、StrongSORT的MC6、StrongSORT的BOT特征提取器7、StrongSORT的AFLink8、StrongSORT的GSI模块 1、论文及源码 论文地址&#xff1a;https://arxiv.org/pdf/2202.13514 源码地址&#…...

23种设计模式-原型(Prototype)设计模式

文章目录 一.什么是原型设计模式&#xff1f;二.原型模式的特点三.原型模式的结构四.原型模式的优缺点五.原型模式的 C 实现六.原型模式的 Java 实现七. 代码解析八.总结 类图&#xff1a; 原型设计模式类图 一.什么是原型设计模式&#xff1f; 原型模式&#xff08;Prototype…...

Qt—QLineEdit 使用总结

文章参考:Qt—QLineEdit 使用总结 一、简述 QLineEdit是一个单行文本编辑控件。 使用者可以通过很多函数,输入和编辑单行文本,比如撤销、恢复、剪切、粘贴以及拖放等。 通过改变 QLineEdit 的 echoMode() ,可以设置其属性,比如以密码的形式输入。 文本的长度可以由 m…...

go-zero使用自定义模板实现统一格式的 body 响应

前提 go环境的配置、goctl的安装、go-zero的基本使用默认都会 需求 go-zero框架中&#xff0c;默认使用goctl命令生成的代码并没有统一响应格式&#xff0c;现在使用自定义模板实现统一响应格式&#xff1a; {"code": 0,"msg": "OK","d…...

BUGKU printf

整体思路 实现循环-->获取libc版本和system函数地址->将strcpy的got表项修改为system并获得shell 第一步&#xff1a;实现循环 从汇编语句可以看出&#xff0c;在每次循环结束时若0x201700处的值是否大于1则会继续循环。 encode1会将编码后的结果保存至0x2015c0处&am…...

深度学习:梯度下降法

损失函数 L&#xff1a;衡量单一训练样例的效果。 成本函数 J&#xff1a;用于衡量 w 和 b 的效果。 如何使用梯度下降法来训练或学习训练集上的参数w和b &#xff1f; 成本函数J是参数w和b的函数&#xff0c;它被定义为平均值&#xff1b; 损失函数L可以衡量你的算法效果&a…...

`console.log`调试完全指南

大家好&#xff0c;这里是 Geek技术前线。 今天我们来探讨 Console.log() 的一些优点。并分析一些基本概念和实践&#xff0c;这些可以让我们的调试工作变得更加高效。 理解前端 log 与后端 log 的区别 前端 log 与后端 log 有着显著的不同&#xff0c;理解这一点至关重要。…...

ROS VSCode调试方法

VSCode 调试 Ros文档 1.编译参数设置 cd catkin_ws catkin_make -DCMAKE_BUILD_TYPEDebug2.vscode 调试插件安装 可在扩展中安装(Ctrl Shift X): 1.ROS 2.C/C 3.C Intelliense 4.Msg Language Support 5.Txt Syntax 3.导入已有或者新建ROS工作空间 3.1 导入工作…...

16 —— Webpack多页面打包

需求&#xff1a;把 黑马头条登陆页面-内容页面 一起引入打包使用 步骤&#xff1a; 准备源码&#xff08;html、css、js&#xff09;放入相应位置&#xff0c;并改用模块化语法导出 原始content.html代码 <!DOCTYPE html> <html lang"en"><head&…...

微服务即时通讯系统的实现(服务端)----(3)

目录 1. 消息存储子服务的实现1.1 功能设计1.2 模块划分1.3 模块功能示意图1.4 数据管理1.4.1 数据库消息管理1.4.2 ES文本消息管理 1.5 接口的实现1.5.1 消息存储子服务所用到的protobuf接口实现1.5.2 最近N条消息获取接口实现1.5.3 指定时间段消息搜索接口实现1.5.4 关键字消…...

.net6.0 mvc 传递 model 实体参数(无法对 null 引用执行运行时绑定)

说一下情况&#xff1a; 代码没问题&#xff0c;能成功从数据库里查到数据&#xff0c;能将数据丢给ViewBag.XXXX, 在View页面也能获取到 ViewBag.XXXX的值&#xff0c;但是发布到线上后报这个错&#xff1a; Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 无法对 …...

VUE 入门级教程:开启 Vue.js 编程之旅

一、Vue.js 简介 Vue.js 是一套构建用户界面的渐进式 JavaScript 框架。它专注于视图层的开发&#xff0c;能够轻松地与其他库或现有项目进行整合。Vue.js 的核心库只关注视图层&#xff0c;通过简洁的 API 实现数据绑定和 DOM 操作的响应式更新&#xff0c;让开发者可以高效地…...

Ubantu系统docker运行成功拉取失败【成功解决】

解决docker运行成功拉取失败 失败报错 skysky-Legion-Y7000-IRX9:~$ docker run hello-world docker: permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Head “http://%2Fvar%2Frun%2Fdocker.sock/_ping”: dial uni…...

mvn-mac操作小记

1.安装brew 如果报错&#xff0c;Warning: /opt/homebrew/bin is not in your PATH. vim ~/.zshrc&#xff0c;最后一行追加 export PATH“/opt/homebrew/bin:$PATH” source ~/.zshrc 2.安装brew install maven mvn -version查看路径 Maven home: /opt/homebrew/Cellar/mav…...

Midjourney生成图落地PS的7大断层痛点:从提示词对齐、分辨率陷阱到图层级精修,一文打通AI与专业图像处理全链路

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Midjourney与Photoshop整合方案的底层逻辑与工作流重构 Midjourney 生成的图像虽具高美学质量&#xff0c;但缺乏图层控制、非破坏性编辑及像素级精度&#xff0c;而 Photoshop 正是弥补这一缺口的核心…...

PS4游戏存档管理终极指南:如何使用Apollo工具轻松备份和修改游戏进度

PS4游戏存档管理终极指南&#xff1a;如何使用Apollo工具轻松备份和修改游戏进度 【免费下载链接】apollo-ps4 Apollo Save Tool (PS4) 项目地址: https://gitcode.com/gh_mirrors/ap/apollo-ps4 在PlayStation 4游戏体验中&#xff0c;游戏存档管理一直是个让玩家头疼的…...

热间隙填充材料在PCB散热设计中的关键应用与选型

1. 热间隙填充材料在PCB散热设计中的核心作用热间隙填充材料&#xff08;Thermal Gap Filler&#xff09;是现代电子散热系统中不可或缺的功能性材料。作为一名经历过数十个散热方案设计的工程师&#xff0c;我深刻理解这类材料在解决"散热器与PCB之间公差累积"问题上…...

深度解析:Mermaid实时编辑器架构设计与工程实践指南

深度解析&#xff1a;Mermaid实时编辑器架构设计与工程实践指南 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-live-editor …...

英雄联盟Akari助手:从青铜到王者的智能游戏革命

英雄联盟Akari助手&#xff1a;从青铜到王者的智能游戏革命 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power &#x1f680;. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 还在为英雄联盟中的重复操作和信息…...

Midjourney未来三年风格演进路径图(2024–2026关键拐点全标注)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Midjourney 2026年审美趋势总览 2026年&#xff0c;Midjourney 的视觉语言正经历一场由技术理性与人文温度共同驱动的范式迁移。V7引擎全面启用动态语义权重调节&#xff08;DSWR&#xff09;&#xff…...

硬件工程师实战指南:工业物联网安全、无线充电与TSN网络设计解析

1. 项目概述&#xff1a;一场面向硬件工程师的线上技术盛宴最近在整理行业资料时&#xff0c;翻到了EE Times几年前发布的一个“即将到来的线上技术活动”汇总页面。虽然发布时间是2018年&#xff0c;但里面提到的几个技术主题——工业物联网安全、硬件身份认证、工业以太网演进…...

FPGA上做图像压缩,别从零造轮子!聊聊DCT那些开源IP核与设计技巧

FPGA图像压缩实战&#xff1a;DCT开源IP核选型与架构优化指南 在嵌入式视觉系统开发中&#xff0c;JPEG图像压缩是FPGA工程师经常遇到的需求场景。当项目周期紧张且资源有限时&#xff0c;明智的开发者会优先考虑利用经过验证的开源IP核&#xff0c;而非从零开始实现离散余弦变…...

何为可编程控制器?可编程控制器4大内容介绍

可编程控制器在控制中常为使用&#xff0c;因此本文将从4大方面对可编程控制器予以介绍&#xff0c;以增进大家对可编程控制器的了解。这4大方面包括&#xff1a;1.何为可编程控制器?2. 可编程控制器的基本组成&#xff0c;3. 可编程控制器发展史&#xff0c;以及4. 可编程控制…...

Python地理空间数据处理技能库geoskills:简化GIS分析,提升开发效率

1. 项目概述&#xff1a;一个面向地理空间数据处理的技能库最近在GitHub上闲逛&#xff0c;发现了一个挺有意思的项目&#xff0c;叫geoskills&#xff0c;来自一个叫Cognitic-Labs的组织。光看名字&#xff0c;geo和skills的组合&#xff0c;就让我这个常年和数据打交道的人眼…...