Code前端首页关于Code前端联系我们

electron-vue3 admin 开发入门、实战与趋势全解析

terry 1小时前 阅读数 38 #Vue
文章标签 vue3;admin开发

什么是 electron-vue3 admin?能解决哪些场景需求?

很多做桌面端工具的同学,第一次听到“electron-vue3 admin”可能有点懵,简单说,它是 Electron(跨平台桌面应用框架)+ Vue3(前沿前端框架)+ 后台管理系统(Admin) 三者结合的技术方案。

Electron 负责让前端代码能打包成 Windows、Mac、Linux 的桌面应用;Vue3 提供高效的组件化开发、响应式数据处理,让后台系统交互更流畅;Admin 则是围绕“数据管理、权限控制、业务流程”设计的后台界面体系。

它能解决的场景特别接地气:

  • 企业内部工具:比如公司里的客户信息管理工具,需要本地化存储敏感数据,同时要有权限控制(普通员工只能看,主管能修改);
  • 本地化运维平台:像服务器监控客户端,能在桌面端实时看服务器状态,还能一键执行脚本;
  • 行业垂直工具:比如影视公司的素材管理系统,要在桌面端快速预览本地视频、批量重命名,还要对接云端素材库;
  • 离线可用工具:有些场景网络不稳定,比如野外测绘数据的临时管理,electron-vue3 admin 能离线处理数据,联网后再同步。

为啥选 electron + vue3 做后台管理系统?优势在哪?

选技术栈得看“需求匹配度”,做后台管理系统,核心关注 开发效率、跨平台、交互体验、系统能力 这几点,electron + vue3 刚好能打:

Electron 解决“跨平台+系统级能力”

  • 跨平台省心:写一套代码,能编译成 Windows exe、Mac dmg、Linux deb 包,不用给三个系统分别写原生应用;
  • 系统 API 自由调用:比如要读取本地文件(像日志、Excel)、操作系统通知(任务完成弹通知)、控制硬件(连接打印机、扫描设备),Electron 的主进程能直接调用 Node.js 和操作系统 API,比纯网页版后台“权限高太多”。

Vue3 解决“前端开发效率+性能”

  • 开发效率起飞:组合式 API(setup 语法糖)让代码逻辑更聚合,写权限管理、表格联动这些复杂功能时,不用像以前一样来回找代码;组件库生态成熟,Element Plus、Naive UI 这些适配 Vue3 的库,直接拿现成组件拼页面,表单、表格、弹窗半小时就能搭好;
  • 性能更能打:Vue3 的响应式系统重构后,数据更新更高效,后台系统里常见的“大数据表格渲染、多图表实时更新”场景,比 Vue2 流畅不少;Tree-shaking(摇树优化)配合 Vite 打包,项目体积更小,启动更快。

后台场景的天然适配

后台管理系统离不开 权限控制、多窗口交互、数据持久化 这些需求:

  • 权限控制:Vue3 的路由守卫(beforeEach)能拦截页面访问,结合 Electron 主进程的“系统权限判断”(比如管理员才能打开配置窗口),前后端权限双保险;
  • 多窗口交互:Electron 能轻松创建新窗口(比如弹窗式表单、独立的数据分析窗口),Vue3 的状态管理工具(Pinia)能跨组件、跨窗口共享数据;
  • 数据持久化:Electron 能装本地数据库(SQLite、LevelDB),也能存 JSON 文件,Vue3 里用响应式数据绑定,改数据自动同步到本地存储,比纯网页依赖 Cookie、LocalStorage 安全灵活多了。

从零开始搭 electron-vue3 admin 项目,第一步干啥?

很多同学想动手试试,但一上来就卡“项目初始化”,其实分两种思路:用脚手架偷懒手动组合练手

方案 1:用社区脚手架“一键初始化”

现在社区有现成的 create-electron-vue 脚手架(类似 create-vue),命令行敲:

npm create electron-vue@latest my-admin-app

跟着向导选:Vue3 + Vite(或 Webpack),然后脚手架会自动生成项目结构:

  • src/main:Electron 主进程代码(控制窗口、系统 API、自动更新这些);
  • src/renderer:Vue3 渲染进程代码(页面、组件、路由这些前端逻辑);
  • 配置文件:自动配好 Vite 打包、Electron Builder 打包桌面应用的脚本。

这种方式适合“快速出 Demo”,不用纠结 Electron 和 Vue3 的配置细节,缺点是脚手架可能有版本兼容问题,得留意依赖更新。

方案 2:手动组合“理解底层”

想彻底搞懂 Electron 和 Vue3 怎么配合,手动搭更扎实:

  1. 初始化 Vue3 项目:先建个 Vue3 + Vite 的前端项目(npm create vite@latest vue3-admin -- --template vue);
  2. 引入 Electron:在项目根目录新建 electron 文件夹,放主进程文件 main.js(控制窗口创建、ipc 通信);
  3. 配置跨进程通信:主进程用 BrowserWindow 加载 Vue3 的页面(loadURL('http://localhost:5173') 开发时用本地服务,打包后加载 dist 目录的 index.html);渲染进程用 ipcRenderer 给主进程发消息(打开本地文件选择框”);
  4. 配置打包:用 electron-builder 写打包配置文件(electron-builder.json),指定应用名称、图标、系统适配选项。

手动搭的好处是每个环节都清楚,比如知道“为什么开发时要开两个服务(Vite 前端服务 + Electron 主进程)”,但缺点是费时间,适合想深入学习的同学。

不管用哪种方式,初始化后先跑通“Hello World”:Vue3 页面能渲染,Electron 窗口能打开,就算迈出第一步了。

electron-vue3 admin 技术栈怎么选?避坑指南

后台系统技术栈像“搭积木”,选对组件库、状态管理、请求工具,开发效率能翻倍,分享一套经过验证的组合:

基础框架:Vue3 + Vite

Vue3 是必选项(毕竟主题是 vue3),Vite 比 Webpack 启动快、热更新丝滑,后台系统页面多、组件多,Vite 能减少等待时间,配置上注意:

  • vite.config.js 里设置 base: './'(打包后 Electron 加载本地文件,避免路径错误);
  • 开启 build.rollupOptions.output.entryFileNames 自定义打包后文件名,方便 Electron Builder 处理。

状态管理:Pinia 替代 Vuex

Pinia 是 Vue 官方推荐的状态管理库,比 Vuex 更轻量,语法更简洁,比如定义全局用户信息:

// stores/user.js
import { defineStore } from 'pinia'
export const useUserStore = defineStore('user', {
  state: () => ({ token: '', role: 'guest' }),
  actions: {
    setToken(token) { this.token = token }
  }
})

在 Vue 组件里直接用 const user = useUserStore(),不用像 Vuex 一样写 mapState、mapActions,代码少一半。

UI 组件库:Element Plus / Naive UI

  • Element Plus:生态成熟,文档友好,后台常用的表格、表单、树组件应有尽有,适合快速出活;
  • Naive UI:设计更现代,组件更轻量化,对 TypeScript 支持更好,适合追求代码优雅的团队。

选的时候看团队熟悉度,比如团队之前用 Element UI,选 Element Plus 无缝衔接;喜欢新东西选 Naive UI。

网络请求:Axios + 拦截器

后台系统离不开和后端接口交互,Axios 是标配,重点是拦截器处理权限

// utils/axios.js
import axios from 'axios'
import { useUserStore } from '@/stores/user'
const instance = axios.create({ baseURL: '/api' }) // 开发时用 Vite 代理,打包后用 Electron 主进程代理
// 请求拦截器:加 token
instance.interceptors.request.use(config => {
  const user = useUserStore()
  if (user.token) {
    config.headers.Authorization = `Bearer ${user.token}`
  }
  return config
})
// 响应拦截器:处理 401 权限错误
instance.interceptors.response.use(res => res, error => {
  if (error.response.status === 401) {
    // 跳转到登录页,或触发 Electron 通知
    window.$router.push('/login')
  }
  return Promise.reject(error)
})

注意:Electron 里跨域和网页不同,开发时用 Vite 的 proxy 代理(比如把 /api 代理到后端服务);打包后,让 Electron 主进程用 axios 发请求(绕开浏览器跨域限制),再把结果传给渲染进程。

Electron 工具库:解决系统级需求

  • electron-store:本地存储键值对数据(比如用户偏好设置),用法像 localStorage,但更安全;
  • electron-updater:实现应用自动更新,配置后用户打开应用时自动检查新版本,下载安装;
  • sqlite3 / better-sqlite3:本地数据库,存大量业务数据(比如日志、订单),主进程操作数据库,渲染进程发指令;
  • @electron/remote:简化跨进程通信,不用每次写 ipcRenderer,直接在渲染进程调用主进程方法。

开发后台核心功能,electron-vue3 怎么落地?

后台管理系统核心功能逃不过 权限、数据、交互、持久化 这几块,结合 Electron 和 Vue3 的特性,逐个拆解:

权限管理:前后端+系统权限三重控制

  • 前端路由守卫:用 Vue Router 的 beforeEach,判断用户角色是否能访问页面:

    // router/index.js
    import { createRouter } from 'vue-router'
    import { useUserStore } from '@/stores/user'
    const router = createRouter({...})
    router.beforeEach((to, from, next) => {
      const user = useUserStore()
      if (to.meta.requiresAdmin && user.role !== 'admin') {
        next('/403') // 没有权限跳 403 页面
      } else {
        next()
      }
    })
  • 系统级权限:导出数据到本地”功能,只有管理员账户登录时,Electron 主进程才允许调用 fs 模块写文件:

    // electron/main.js
    ipcMain.handle('export-data', (event, data) => {
      const isAdmin = checkUserRole() // 假设有个方法判断系统用户权限
      if (isAdmin) {
        fs.writeFileSync('data.json', JSON.stringify(data))
        return 'success'
      } else {
        return 'permission-denied'
      }
    })
  • 后端接口权限:Axios 拦截器加 token,后端接口校验 token 合法性,三重保障让权限更安全。

多窗口管理:Electron 窗口 + Vue3 组件联动

后台系统经常需要“弹窗式表单、独立数据分析窗口”,Electron 的 BrowserWindow 能灵活创建:

  • 封装窗口创建函数(主进程)
    // electron/main.js
    function createWindow(url, width, height) {
      const win = new BrowserWindow({ width, height, webPreferences: { preload: path.join(__dirname, 'preload.js') } })
      win.loadURL(url)
      return win
    }
    ipcMain.handle('open-analysis-window', () => {
      createWindow('http://localhost:5173/analysis', 800, 600)
    })
  • 渲染进程触发创建:在 Vue 组件里用 ipcRenderer.invoke 调用主进程方法:
    // src/components/AnalysisButton.vue
    import { ipcRenderer } from 'electron'
    const openWindow = () => {
      ipcRenderer.invoke('open-analysis-window')
    }
  • 跨窗口数据共享:用 Pinia 状态管理,多个窗口的 Vue 实例都能访问同一份状态,比如分析窗口和主窗口共享选中的数据集。

数据可视化:ECharts + Vue3 组件化

后台系统里的图表(柱状图、折线图、饼图)是刚需,ECharts 适配 Electron 很丝滑:

  • 封装 ECharts 组件
    <!-- components/Chart.vue -->
    <template>
      <div ref="chartRef" class="chart" />
    </template>
    <script setup>
    import { ref, onMounted } from 'vue'
    import * as echarts from 'echarts'
    const chartRef = ref(null)
    onMounted(() => {
      const chart = echarts.init(chartRef.value)
      chart.setOption({...}) // 配置图表数据
    })
    </script>
  • 处理 Electron 渲染问题:ECharts 依赖 Canvas,Electron 的渲染进程默认支持,只要确保 ECharts 版本和 Electron 版本兼容(Electron 25+ 配 ECharts 5+),不会有渲染 bug。

本地数据持久化:Electron-store + SQLite

  • 轻量配置存储:用 electron-store 存用户偏好(比如主题、语言):
    // electron/main.js
    import Store from 'electron-store'
    const store = new Store()
    store.set('theme', 'dark')
    const theme = store.get('theme')
  • 大量业务数据存储:用 SQLite 存日志、订单,主进程操作数据库,渲染进程发指令:
    // electron/main.js
    import Database from 'better-sqlite3'
    const db = new Database('data.db')
    ipcMain.handle('save-log', (event, log) => {
      const stmt = db.prepare('INSERT INTO logs (content) VALUES (?)')
      stmt.run(log.content)
    })

    Vue3 组件里调用 ipcRenderer.invoke('save-log', { content: '操作记录' }),就能把数据存到本地数据库。

electron-vue3 admin 开发常见坑,怎么避?

踩过坑才知道哪些地方要留心,分享几个高频踩坑点和解决方案:

跨进程通信延迟:从“回调地狱”到“Promise 化”

早期 Electron 用 ipcRenderer.sendipcMain.on 通信,回调嵌套多了像“俄罗斯套娃”,现在用 ipcRenderer.invokeipcMain.handle 做 Promise 化通信:

// 主进程
ipcMain.handle('get-user-info', async () => {
  return await fetchUserInfo() // 假设是异步获取用户信息
})
// 渲染进程
const userInfo = await ipcRenderer.invoke('get-user-info')

这样代码更线性,和 Vue3 的 async/await 结合丝滑,避免回调地狱。

窗口生命周期:关闭窗口要“释放资源”

Electron 窗口如果频繁创建/关闭,不释放资源会内存泄漏,解决方法:

  • 监听窗口关闭事件,销毁实例
    // electron/main.js
    const win = new BrowserWindow(...)
    win.on('closed', () => {
      win = null // 释放引用
    })
  • 渲染进程里,窗口关闭前保存数据
    // src/components/EditWindow.vue
    window.addEventListener('beforeunload', () => {
      saveDraft() // 保存草稿
    })

打包体积过大:从“臃肿”到“瘦身”

Electron 应用打包后体积大是通病,优化方法:

  • Vite 配置 Tree-shakingvite.config.js 里开启 build.rollupOptions.output.manualChunks,把第三方库拆分成单独 chunk,减少重复打包;
  • Electron Builder 配置压缩electron-builder.json 里设置 compression: 'maximum',开启最高压缩等级;
  • 剔除无用依赖:用 npm ls --depth=0 检查依赖树,删掉不用的库(比如开发时用的 mock 库,打包前移除)。

系统权限坑:Mac 沙盒、Windows 权限

  • MacOS 沙盒机制:如果应用要访问摄像头、麦克风、下载文件夹,必须在 info.plist 里声明权限描述:
    <key>NSCameraUsageDescription</key>
    <string>需要摄像头权限来扫描二维码</string>
  • Windows 管理员权限:如果应用要修改系统配置,打包时用 electron-builder 配置 requestedExecutionLevel: 'requireAdministrator',让应用以管理员身份运行。

路由冲突:前端路由 vs Electron 路由

Electron 主进程用 BrowserWindow.loadURL 加载页面,前端用 Vue Router 的 history 模式时,

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

热门