博客 分类专栏 专题 成员
使用vite 构建vue3+electron项目
2023-11-24 09:13:40
分类专栏: electron

构建vue3项目

构建项目

npm create vite@latest electron-demo

引入electron

npm install electron -D
npm install vite-plugin-electron -D
#渲染进程和主进程的通信
npm install vite-plugin-electron-renderer -D

修改vite.config.js

引入 electron 和 electronRender 进程间通讯

import { fileURLToPath, URL } from 'node:url'

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import electron from 'vite-plugin-electron'
import electronRender from 'vite-plugin-electron-renderer'

export default defineConfig({
  plugins: [
    vue(), electron({
      entry: 'src/electron/index.js'
    }),electronRender()
  ],
  resolve: {
    alias: {
      '@': fileURLToPath(new URL('./src', import.meta.url))
    }
  },
  server: {
    port:3000
  }
})

创建electron 主进程窗口

src目录下新建/electron/index.js

import path from "path";
const { app, BrowserWindow, ipcMain,shell } = require('electron');

const createWindow = () => {
  const win = new BrowserWindow({
    width: 800,
    height: 600,
    titleBarStyle: 'hidden',
    webPreferences: {
      contextIsolation: false, // 是否开启隔离上下文
      nodeIntegration: true, // 渲染进程使用Node API
      // preload: path.join(__dirname, "../electron-preload/index.js"), // 需要引用js文件
    }
  });
  win.webContents.openDevTools();
  win.setMenu(null)
  // 如果打包了,渲染index.html
  if (app.isPackaged) {
    win.loadFile(path.join(__dirname, "../index.html"));
  } else {
    win.loadURL(process.env['VITE_DEV_SERVER_URL'])
  }

  ipcMain.on('msg', (_, msg) => {
    console.log('渲染进程传递信息 :>> ', msg);
    win.webContents.send('load', { msg: '我已经收到消息' + msg })
  });


};

app.whenReady().then(() => {
  createWindow(); // 创建窗口
  app.on('activate', () => {
    if (BrowserWindow.getAllWindows().length === 0) {
      createWindow();
    }
  });
});

// 关闭窗口
app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit();
  }
});

process.env['ELECTRON_DISABLE_SECURITY_WARNINGS'] = 'true'

页面

<template>
  <div>
    <el-button type="primary" @click="send">按钮</el-button>
  </div>
</template>

<script setup>
import { ipcRenderer } from 'electron'
import { useRouter } from 'vue-router'

const router = useRouter()

const send = () => {
  ipcRenderer.send('msg', '页面消息')
}

const openNewWin = () => {
  ipcRenderer.send('openNewWin')
}

ipcRenderer.on('load', (_, msg) => {
  console.log('主进程传递信息 :>> ', msg)
})

</script>

<style lang="scss" scoped>
</style>

运行

修改package.json

 "main": "dist-electron/index.js",
 "dev": "chcp 65001 && vite"
npm run dev