手工搭建PC端:pnpm + Vite + Vue3 + Element Plus + Electron

初始化项目

复制代码
mkdir electron-vue3
cd electron-vue3
pnpm init 

安装Vite + Vue3 + Element Plus

复制代码
pnpm add vue@latest
pnpm add -D vite @vitejs/plugin-vue
pnpm add element-plus
pnpm add @element-plus/icons-vue

安装Electron

复制代码
pnpm add -D electron electron-builder
pnpm add -D vite-plugin-electron vite-plugin-electron-renderer

创建静态文件入口:index.html

复制代码
<!doctype html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>electron-vue3</title>
</head>

<body>
  <div id="app"></div>
  <script type="module" src="/src/main.js"></script>
</body>

</html>

创建样式文件:src/assets/style.css

复制代码
* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

创建Vue根组件:src/App.vue

复制代码
<template>
  <h1>Vue3 + Element Plus</h1>
  <el-button type="primary">测试按钮</el-button>
</template>

创建入口文件:src/main.js

复制代码
import { createApp } from 'vue'
import App from './App.vue'
import './assets/style.css'
import ElementPlus from 'element-plus'
import * as ElementPlusIconsVue from '@element-plus/icons-vue'
import 'element-plus/dist/index.css'

const app = createApp(App)
app.use(ElementPlus)
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
  app.component(key, component)
}
app.mount('#app')

创建Electron主进程文件:electron/main.js

复制代码
const { app, BrowserWindow } = require('electron')
const path = require('path')

let win

function createWindow() {
  win = new BrowserWindow({
    width: 1000,
    height: 700,
    webPreferences: {
      nodeIntegration: true,
      contextIsolation: false
    }
  })

  if (process.env.VITE_DEV_SERVER_URL) {
    win.loadURL(process.env.VITE_DEV_SERVER_URL)
    win.webContents.openDevTools()
  } else {
    win.loadFile(path.join(__dirname, '../dist/index.html'))
  }
}

app.whenReady().then(createWindow)

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') app.quit()
})

app.on('activate', () => {
  if (BrowserWindow.getAllWindows().length === 0) createWindow()
})

创建Electron渲染进程的预加载脚本文件:electron/preload.js

复制代码
console.log('preload 已加载')

Vite核心配置文件:vite.config.js

复制代码
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import electron from 'vite-plugin-electron'
import renderer from 'vite-plugin-electron-renderer'

export default defineConfig({
  plugins: [
    vue(),
    electron([
      {
        entry: "electron/main.js"
      },
      {
        entry: "electron/preload.js"
      }
    ]),
    renderer()
  ],
  server: {
    port: 3000
  }
})

创建.npmrc(npm/pnpm/yarn的配置文件)

复制代码
# Electron国内镜像
electron_mirror=https://npmmirror.com/mirrors/electron/
electron_builder_binaries_mirror=https://npmmirror.com/mirrors/electron-builder-binaries/

# PNPM专用配置
node_mirror=https://npmmirror.com/mirrors/node/
registry=https://registry.npmmirror.com/

修改Node.js核心配置文件:package.json

复制代码
  "main": "electron/main.js",


  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "start": "electron .",
    "electron:dev": "vite",
    "electron:build": "vite build && electron-builder"
  },

运行项目

复制代码
pnpm electron:dev

打包项目

复制代码
pnpm electron:build
相关推荐
紫禁玄科8 小时前
Shai-Hulud:npm生态的自我复制蠕虫风暴
前端·npm·node.js
东风破_8 小时前
后端API没写好,前端难道干等着吗?
前端
用户938515635079 小时前
从前后端分离到前端接口工程:React + MockJS + Vite 解析
前端·后端·全栈
用户938515635079 小时前
从零在浏览器里跑 DeepSeek-R1:WebGPU + Transformers.js 全链路实战(三)
前端·react.js·typescript
excel9 小时前
当前端行情变差,我们为什么还要坚持?
前端
鸿是江边鸟,曾是心上人9 小时前
快速搭建HTTPS本地开发环境
前端
To_OC10 小时前
写了 5 个表单 Demo 后,我终于彻底搞懂了 React 受控与非受控组件
前端·react.js·前端框架
Sterting10 小时前
第9课 Vue Router 路由
前端·vue.js
用户0595401744610 小时前
LangChain Memory 测试踩坑实录:用 pytest 自动化回归对话记忆,我折腾了整整一个周末
前端·css
kyriewen11 小时前
Claude Code后天起默认Auto模式了——我第一时间改了这6个设置
前端·ai编程·claude