electron项目搭建

前言:electron是一个跨平台桌面端应用开发工具。它将整个系统内容分为主进程和渲染进程两个部分(你可以粗略的理解为electron项目开启了两个服务器,一个渲染页面另一个处理electron窗口内容)。这两个"服务器"之间通过JS Bridge进行通信(即:contextBridge),在主进程的preload预加载中可以同时访问到浏览器进程的window对象和主进程的electron api。此时,我们可以经由ipcRerender(electron中从渲染进程(网页)向主进程发送同步和异步消息的api)将electron的api挂载到window对象上,以便在浏览器进程中使用),然后在主进程中通过ipcMain(处理从渲染器进程(网页)发送的异步和同步消息。从渲染器发送的消息将被发送到该模块。)监听即可达到进程通信的目的。

本文章主要介绍如何基于vite搭建electron项目

首先创建文件夹并cd到此文件夹中初始化

javascript 复制代码
npm init -y

然后安装vite环境

javascript 复制代码
npm i vite -D

安装electron(推荐cnpm安装,npm安装有可能会卡住,或者你自己更换镜像地址也行)

javascript 复制代码
cnpm install --save-dev electron

安装electron打包工具

javascript 复制代码
cnpm install  electron-builder -D

接下来安装你想用的框架及配套内容(本文使用的是vue3)

javascript 复制代码
npm i vue vue-router pinia axios less less-loader -s

安装vue的构建工具

javascript 复制代码
npm i @vitejs/plugin-vue -D

现在我们开始配置文件内容

因为是基于vite搭建的项目,故此需要再根目录新建vite.config.mjs(为啥用mjs稍后会解释)文件

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

export default defineConfig({
    //项目路径配置
    base:'./',
    plugins:[
       //vue解析插件
       vue(),
       electron({
         //electron项目入口
         entry:'./electron/index.js',
         vite:{
             build:{
               //打包目录名
               outDir:'dist'
             }
          }
       }),
       //渲染进程入口 
       renderer({
         entry:'./src/main.js',
         nodeIntegration: true,
       })
    ],
    //允许跨域
    server:{
      cors:true
    },

    resolve:{
      "alias":{
         "@":resolve(__dirname,'./src')
      }
    }
})

package.json文件配置

javascript 复制代码
{
  "name": "electron",
  "version": "1.0.0",
  //"type":"module",
  /*  electron项目不推荐"type":"module"故此我们这里就不使用"type":"module"选项,
      启动项目时控制台会提醒The CJS build of Vite's Node API is deprecated
      vite已弃用cjs进行构建,我们可以修改vite.config.js为vite.config.mjs
   */
  //入口文件
  "main": "electron/index.js",
  "scripts": {
    //启动项目 
    "dev": "vite",
    //打包成windows应用
    /* --config electron-builder.json 指根据electron-builder.json配置文件打包,所以需要在根 
    目录下新建electron-builder.json文件配置打包信息*/
    "build": "vite build && electron-builder build --win --x64 --config electron- 
              builder.json",
    //打包成mac应用(注:打包mac应用需要再mac系统中才能打包)
    "build:mac":"vite build && electron-builder build --mac --arm64 --config electron- 
              builder.json",
    //打包成linux应用
    "build:linux":"vite build && electron-builder build --linux --armv7l --config 
              electron-builder.json"
  },
  "keywords": [
    "electron",
    "vue",
    "pinia"
  ],
  "description":"vite-electron",
  "author": "仙古梦回",
  "license": "ISC",
  "devDependencies": {
    "@vitejs/plugin-vue": "^5.1.0",
    "electron": "^31.2.1",
    "electron-builder": "^24.13.3",
    "less": "^4.2.0",
    "less-loader": "^12.2.0",
    "vite": "^5.3.4",
    "vite-plugin-electron": "^0.28.7",
    "vite-plugin-electron-renderer": "^0.14.5"
  },
  "dependencies": {
    "@vitejs/plugin-vue": "^5.1.0",
    "pinia": "^2.1.7",
    "vue": "^3.4.33",
    "vue-router": "^4.4.0"
  }
}

electron-builder.json文件配置

javascript 复制代码
{
    "productName": "仙古梦回",
    "files": ["./electron/index.js", "./dist"],
    "extraFiles": ["./videos", "./cvideo"], 
    "directories": {
      "output": "./dist"
    }
  }

现在我们开始构建主进程文件,在根目录新建electron文件夹并新建index.js

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

const createWindow = ()=>{
    const win = new BrowserWindow({
        width:1100,
        height:700,
        webPreferences:{
          nodeIntegration:true, // 禁用 nodeIntegration
          contextIsolation: true, // 启用上下文隔离 
          preload:path.join(__dirname,'./preload.js')
        }
    })
    //关闭菜单
    win.setMenu(null)
    /*环境变量process.env.VITE_DEV_SERVER_URL,用于获取当前项目的启动地址。 
        示例:http://localhost:5173
    */
    if(process.env.VITE_DEV_SERVER_URL){
        win.loadURL(process.env.VITE_DEV_SERVER_URL)
    }else{
        win.loadFile(path.join(__dirname,'../dist/index.html'))
    }
}

//监听渲染进程传过来的great事件
ipcMain.on('great',(event,val)=>{
  console.log(val)
})

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

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

预加载文件配置

javascript 复制代码
const { contextBridge,ipcRenderer } = require('electron')

//用于安全地将 API 从预加载脚本的隔离上下文公开到网站运行的上下文。该 API 也可以像以前一样从 window.myAPI 上的网站访问。
contextBridge.exposeInMainWorld('electronAPI', {
    //暴露到渲染进程window对象中的great事件,通过ipcRenderer.send发送给主进程
    great: (val) => ipcRenderer.send('great', val)
})

构建渲染进程

在根目录建立src文件夹同时在根目录创建index.html作为展示页面(上文建立主进程index.js文件时有引入这个html文件)

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>仙古梦回</title>
    <!--注意这里的type="module",我们使用vue开发用的是ESmodule,同时允许跨域crossorigin -->
    <script type="module" crossorigin src="./src/main.js" ></script>
</head>
<body>
   <div id="app"></div>
</body>
</html>

在src文件夹下开始构建vue项目(与普通vue项目构建一样)

main.js文件

javascript 复制代码
import { createApp } from "vue";

import App from './App.vue'

const app = createApp(App)


app.mount('#app')

App.vue文件配置

javascript 复制代码
<template>
     <div>
         <button @click="send">向主进程发送你好</button>
     </div>
</template>


<script setup>

const send = ()=>{
   window.electronAPI.great('你好123' )
}


</script>


<style lang="less" scoped>

</style>

至此,一个基于vite和vue搭建的electron项目就构建完成。

项目代码地址:仙古梦回/electron的搭建

相关推荐
前端小小王10 分钟前
React Hooks
前端·javascript·react.js
迷途小码农零零发19 分钟前
react中使用ResizeObserver来观察元素的size变化
前端·javascript·react.js
娃哈哈哈哈呀41 分钟前
vue中的css深度选择器v-deep 配合!important
前端·css·vue.js
旭东怪1 小时前
EasyPoi 使用$fe:模板语法生成Word动态行
java·前端·word
ekskef_sef3 小时前
32岁前端干了8年,是继续做前端开发,还是转其它工作
前端
sunshine6413 小时前
【CSS】实现tag选中对钩样式
前端·css·css3
真滴book理喻3 小时前
Vue(四)
前端·javascript·vue.js
蜜獾云4 小时前
npm淘宝镜像
前端·npm·node.js
dz88i84 小时前
修改npm镜像源
前端·npm·node.js
Jiaberrr4 小时前
解锁 GitBook 的奥秘:从入门到精通之旅
前端·gitbook