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

vue 项目集成 electron 和 electron 打包及环境配置

vue + electron 开发桌面端应用


安装 electron

npm i electron -D

记得加上-D,electron 需添加到devDependencies,如果添加到dependencies后面运行可能会报错

根目录创建electron文件夹,在electron文件夹创建main.js(或者background.js)

在文件中添加如下代码:

// 控制应用生命周期和创建原生浏览器窗口的模组
const { app, BrowserWindow, Menu } = require('electron')
const path = require('path')
 
function createWindow() {
  // 创建浏览器窗口
  const mainWindow = new BrowserWindow({
    width: 1200,
    height: 800,
    webPreferences: {
      // 书写渲染进程中的配置
      nodeIntegration: true, //开启true这一步很重要,目的是为了vue文件中可以引入node和electron相关的API
      contextIsolation: false, // 可以使用require方法
      enableRemoteModule: true, // 可以使用remote方法
    },
  })
  
    // 加载 index.html
    mainWindow.loadFile(path.resolve(__dirname, '../dist/index.html')) // 新增
}
// 这段程序将会在 Electron 结束初始化
// 和创建浏览器窗口的时候调用
// 部分 API 在 ready 事件触发后才能使用。
app.whenReady().then(() => {
  createWindow()
 
  app.on('activate', function () {
    // 通常在 macOS 上,当点击 dock 中的应用程序图标时,如果没有其他
    // 打开的窗口,那么程序会重新创建一个窗口。
    if (BrowserWindow.getAllWindows().length === 0) createWindow()
  })
})
 
// 除了 macOS 外,当所有窗口都被关闭的时候退出程序。 因此,通常对程序和它们在
// 任务栏上的图标来说,应当保持活跃状态,直到用户使用 Cmd + Q 退出。
app.on('window-all-closed', function () {
  if (process.platform !== 'darwin') app.quit()
})

修改package.json

1、在scripts同级下添加

"main": "electron/main.js",

根据实际的文件路径配置

2、查看是否存在"type": "module"配置
如果有,则删除"type"配置,因为main中用的不是es6的模块引入

3、"scripts"中添加"electron:dev": "electron .",用于启用electron


现在就可以通过npm run electron:dev运行electron了

因为上面main.css运行的是 dist文件夹 中的 index.html ,所以如果没有该文件的得先npm run build

多环境配置并在本地开发时使用热更新

安装 electron-reload

npm i electron-reload

修改”scripts“ 指令

"electron:dev": "set ELECTRON_ENV=development& electron .",

在本地运行时添加值为 ‘development’ 的 ELECTRON_ENV 环境变量

修改main.js内容

完整代码如下

// 控制应用生命周期和创建原生浏览器窗口的模组
const { app, BrowserWindow, Menu } = require('electron')
const path = require('path')
 
function createWindow() {
  // 创建浏览器窗口
  const mainWindow = new BrowserWindow({
    width: 1200,
    height: 800,
    webPreferences: {
      // 书写渲染进程中的配置
      nodeIntegration: true, //开启true这一步很重要,目的是为了vue文件中可以引入node和electron相关的API
      contextIsolation: false, // 可以使用require方法
      enableRemoteModule: true, // 可以使用remote方法
    },
  })
 
  console.log("process.env.ELECTRON_ENV", process.env.ELECTRON_ENV)
  // let env = 'pro'
  let env = process.env.ELECTRON_ENV
  // 环境变量 ELECTRON_ENV 值为 development 则使用热更新
  // 配置热更新
  if (env == 'development') {
    const elePath = path.join(__dirname, '../node_modules/electron')
    require('electron-reload')('../', {
      electron: require(elePath),
    })
    // 热更新监听窗口
    mainWindow.loadURL('http://localhost:3100')
    // 打开开发工具
    mainWindow.webContents.openDevTools()
  } else {
    // 生产环境中要加载文件,打包的版本
    Menu.setApplicationMenu(null)
    // 加载 index.html
    mainWindow.loadFile(path.resolve(__dirname, '../dist/index.html')) // 新增
  }
}
// 这段程序将会在 Electron 结束初始化
// 和创建浏览器窗口的时候调用
// 部分 API 在 ready 事件触发后才能使用。
app.whenReady().then(() => {
  createWindow()
 
  app.on('activate', function () {
    // 通常在 macOS 上,当点击 dock 中的应用程序图标时,如果没有其他
    // 打开的窗口,那么程序会重新创建一个窗口。
    if (BrowserWindow.getAllWindows().length === 0) createWindow()
  })
})
 
// 除了 macOS 外,当所有窗口都被关闭的时候退出程序。 因此,通常对程序和它们在
// 任务栏上的图标来说,应当保持活跃状态,直到用户使用 Cmd + Q 退出。
app.on('window-all-closed', function () {
  if (process.platform !== 'darwin') app.quit()
})

这里 http://localhost:3100 为我本地开发时项目运行的url

运行
本地启动web项目
一般是:npm run dev
然后再:npm run electron:dev启动electron。这样electron就可以实时监听窗口了。

打包应用

安装 electron-builder

npm i electron-builder -D

package.json中新增scripts

"electron:build": "vite build --mode application & electron-builder build --config electron-builder.json",

创建 electron-builder.json 进行打包配置

{
  "appId": "com.example.myapp",
  "productName": "app名字",
  "files": ["./electron/main.js", "./dist"],
  "extraFiles": ["./videos", "./cvideo"], 
  "directories": {
    "output": "./buileder"
  },
  "nsis": {
    "oneClick": false,
    "perMachine": true,
    "allowToChangeInstallationDirectory": true
  },
  "win": {
    "icon": "public/icon.png",
    "target": ["nsis", "zip"]
  },
  "mac": {
    "icon": "public/icon.png",
    "target": "dmg"
  },
  "linux": {
    "icon": "public/icon.png",
    "target": "AppImage"
  },
  "dmg": {
    "contents": [
      {
        "x": 110,
        "y": 150
      },
      {
        "x": 240,
        "y": 150,
        "type": "link",
        "path": "/Applications"
      }
    ]
  },
  "appx": {
    "publisher": "CN=app名字"
  }

}

public/icon.png 为应用的icon图标,没有的话可以删除

运行打包命令

npm run electron:build 

打包成功后,在根目录会出现一个buileder文件夹,打包后的应用就在里面
在这里插入图片描述

打包过程中常见的一些坑

一、打包后没有报错,但打开后一片空白
打开调试工具发现文件引入失败,且引入路径也不对。这种一般是根路径配置问题
解决方法:
1、配置base,以vite为例
在vite.config.ts中添加base配置

export default defineConfig({
  base: './',
})

2、在 index.html 中查看head中是否有这段标签

<base href="/">

注意!注意!注意!(这个bug我之前找了好一会儿才发现)

有的话删除掉

二、如果报:Package "electron" is only allowed in "devDependencies". Please remove it from the "dependencies"

这个错误表示package.json文件中依赖electron应该在 devDependencies而不是dependencies中

解决方法:
将electron移到devDependencies,并重装依赖

三、如果报类似 http://github.com/xxxx/xxxx 的错误一般是网络问题

解决方法:
过一会儿再尝试,或者科学上网

四、如果报类似 zip: not a valid zip file github.com/develar/app-builder/pkg/archive/zipx.(*Extractor).extractAndWriteFile的错误

解决方法:
重装依赖


http://www.kler.cn/a/472207.html

相关文章:

  • WandB使用笔记
  • 【Linux】深入理解文件系统(超详细)
  • 源代码编译安装X11及相关库、vim,配置vim(2)
  • Flask返回浏览器无乱码方法
  • 使用高云小蜜蜂GW1N-2实现MIPI到LVDS(DVP)转换案例分享
  • 使用Llama 3.1创建合成数据集以调优你的大型语言模型
  • 基于R语言的DICE模型
  • gitee 使用教程
  • 基于springboot线上教学平台
  • Linux 查找工具 - find 命令介绍
  • Backend - C# 操作数据库 DB(ADO.NET、LINQ to SQL、EF)
  • MyBatis SQL 映射文件基础
  • Jupyter Notebook 取消数据框(DataFrame)缩略显示
  • 02、Docker学习,理论知识,第二天:基础概念与常用命令
  • 基于Elasticsearch8的向量检索实现相似图形搜索
  • cesium入门学习五(2025年版本)-------------cesium加载离线地图
  • 【手写数据库内核miniToadb】第1天 模拟数据库流程,剖析数据库内核的组成结构
  • JavaScript系列(9)-- Set数据结构专题
  • 鸿蒙中使用获取本地JSON文件
  • 牛客网刷题 ——C语言初阶(2分支和循环-for)——打印菱形
  • SpringBoot3集成案例
  • Flannel:Kubernetes 网络方案的“轻骑兵”
  • Burpsuite20241102macM1版安装
  • 三甲医院等级评审八维数据分析应用(一)--组织、制度、管理可视化篇
  • iOS - 消息机制
  • 数据结构(查找算法)