将现有web项目打包成electron桌面端教程(一)vue3+vite+js版

说明:后续项目需要web端和桌面端,为了提高开发效率,准备直接将web端的代码打包成桌面端,在此提前记录一下demo打包的过程,需要注意的是vue2或者vue3+vite+ts或者vue-cli的打包方式各不同,如果你的项目不是vue3+vite+js,就不用再往下看了哈,再找找别的教程~

一、准备

1.demo项目准备

先提前准备好一个现有的web端项目,我随便拿了一个之前做过的项目来做demo

2.安装electron依赖 
npm install electron 

3.修改vite.config.js文件

主要是修改配置文件路径

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

// https://vitejs.dev/config/
export default defineConfig({
  base: './',	// 新增,打包的dist文件的index.html引入资源css/js的路径,这里使用相对路径,预防找不到的问题
  plugins: [vue()]
})
4.在根目录添加main.js文件

这是electron运行的入口文件

// 控制应用生命周期和创建原生浏览器窗口的模组
const { app, BrowserWindow } = require('electron')
const path = require('path')

function createWindow () {
  // 创建浏览器窗口
  const mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      preload: path.join(__dirname, 'preload.js')
    }
  })

  // 加载 index.html
  mainWindow.loadFile('dist/index.html') // 此处跟electron官网路径不同,需要注意

  // 打开开发工具
  // mainWindow.webContents.openDevTools()
}

// 这段程序将会在 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()
})

// 在这个文件中,你可以包含应用程序剩余的所有部分的代码,
// 也可以拆分成几个文件,然后用 require 导入。
5.在根目录添加preload.js文件
// 所有Node.js API都可以在预加载过程中使用。
// 它拥有与Chrome扩展一样的沙盒。
window.addEventListener('DOMContentLoaded', () => {
  const replaceText = (selector, text) => {
    const element = document.getElementById(selector)
    if (element) element.innerText = text
  }

  for (const dependency of ['chrome', 'node', 'electron']) {
    replaceText(`${dependency}-version`, process.versions[dependency])
  }
})
6.修改package.json文件

新增两处如下:

到这里准备工作已经完成了 

二、正式开始打包 

1.打包web项目
npm run build
2.运行electron

看看是否可以正常运行

npm run electron:serve
3.热更新开发环境
3.1修改main.js文件

3.2开启vite和electron服务

注意:要先运行vite,让开发服务器的url 可以正常访问,才能再开启electron加载url

这需要安装两个依赖:

  • concurrently:阻塞运行多个命令,-k参数用来清除其它已经存在或者挂掉的进程
  • wait-on:等待资源,此处用来等待url可访问

npm有可能不成功,可以自己换cnpm pnpm yarn...

cnpm install -D concurrently wait-on 
3.3 修改package.json文件

两条命令添加完成

  • yarn electron为等待tcp协议5173端口可访问,然后执行electron
  • yarn electron:serve为阻塞执行开发服务器运行和yarn electron命令

运行项目只要执行命令yarn electron:serve或者npm run electron:serve即可,当修改项目文件时,桌面应用也将自动更新。

4. 开始打包
4.1 创建electron文件

将main.js和preload.js文件移进来

4.2修改electron/main.js文件
// 控制应用生命周期和创建原生浏览器窗口的模组
const { app, BrowserWindow } = require('electron')
const path = require('path')

const NODE_ENV = process.env.NODE_ENV  //新增
// const NODE_ENV = 'development'  // 判断开发或生产模式(建议写成这种,开发模式就可以用,等即将打包了再把这个变量换成打包模式)

function createWindow () {
  // 创建浏览器窗口
  const mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      preload: path.join(__dirname, 'preload.js')
    }
  })

  // 加载 index.html
  // mainWindow.loadFile('dist/index.html') // 此处跟electron官网路径不同,需要注意
  mainWindow.loadURL(
    NODE_ENV === 'development'
    ? 'http://localhost:8889'
    :`file://${path.join(__dirname, '../dist/index.html')}`
  ); // 新增
  // 打开开发工具
  if (NODE_ENV === "development") {
    mainWindow.webContents.openDevTools()
  } // 新增
}

// 这段程序将会在 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()
})

// 在这个文件中,你可以包含应用程序剩余的所有部分的代码,
// 也可以拆分成几个文件,然后用 require 导入。
 4.3修改package.json文件
  • 将main: main.js改为main: electron/main.js
  • 添加build属性:
 "build": {
    "appId": "com.dweb.demo",  //包id com.dweb.项目名
    "productName": "ElectronApp", // 项目名
    "copyright": "Copyright © 2021 <your-name>", // 版权信息
    "mac": {
      "category": "public.app-category.utilities"
    },
    "nsis": {
      "oneClick": false,
      "allowToChangeInstallationDirectory": true
    },
    "files": [
      "dist/**/*",
      "electron/**/*"
    ],
    "directories": {
      "buildResources": "assets", //静态文件资源获取目录
      "output": "dist_electron" // 打包位置,会新建到项目根目录
    }
  },
  • 修改scripts属性

先下载两个依赖:

npm install -D cross-env electron-builder
{
  "dev": "vite",
  "build": "vite build",
  "serve": "vite preview",
  "electron": "wait-on tcp:8889 && cross-env NODE_ENV=development electron .", 
  "electron:serve": "concurrently -k \"npm run dev\" \"npm run electron\"",
  "electron:build": "vite build && electron-builder" 
}

修改后的内容如下:

4.4 打包中的报错处理
npm run electron:build

出现这个报错别慌:

Package “electron” is only allowed in “devDependencies”. Please remove it from the “dependencies” section in your package.json.

把dependencies中的electron删掉就可以了

不出意外打包的时候又要报错了:

cannot resolve xxx/30.0.9/electron-v30.0.9-win32-ia32.zip

简单粗暴的办法就是手动下载:

截止到2024-06-05,淘宝镜像源资源地址为:CNPM Binaries Mirror

打开后找到搜索electron,点击进入资源列表,找到版本30.0.9,继续点击进入找到对应的版本,点击下载,下载成功后,放进本地资源包地址:C:\Users\Administrator\AppData\Local\electron\Cache

 

如果其他依赖下载失败,可以参考这篇:

解决electron-builder打包时下载依赖慢的问题 | 梓喵出没 (azimiao.com)

4.5打包完成

打包完成后,会生成dist和dist_electron,双击dist_electron中的exe文件,按照导引进行安装就可以运行啦

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/685345.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GitHub飙升!京东认证的“Python编程入门三剑客”究竟好在哪?

Python凭借着简单易学、功能强大&#xff0c;已经跃居TIOB编程语言榜首&#xff0c;并且已经开始了它的霸榜之旅。如何选择一套适合自己的Python学习教程&#xff0c;是每个Python爱好者面临的首要问题。 今天给小伙伴们带来的是图灵&京东认证的“Python编程入门三剑客”&…

搜维尔科技:Varjo XR-4功能详解:由凝视驱动的XR自动对焦相机系统

Varjo是XR市场中拥有领先技术的虚拟现实设备供应商&#xff0c;其将可变焦距摄像机直通系统带入到虚拟和混合现实场景中。在本篇文章中&#xff0c;Varjo的技术工程师维尔蒂莫宁详细介绍了这项在Varjo XR-4焦点版中投入应用的技术。 对可变焦距光学系统的需求 目前所有其他XR头…

openh264 自适应量化功能源码分析

openh264 OpenH264是一个开源的H.264/AVC视频编解码器&#xff0c;由Cisco公司发起并贡献了最初的代码基础。它提供了一个用于视频编码和解码的库&#xff0c;支持H.264视频压缩标准&#xff0c;广泛应用于视频会议、流媒体和视频存储等领域。OpenH264是实现H.264编解码功能的…

纷享销客安全体系:物理与环境安全

纷享销客的物理设备托管在经过严格准入制度授权的TIER3级别以上的专业数据中心&#xff0c;这些数据中心均通过了等保三级与IS027001安全认证&#xff0c;确保电力、制冷等基础设施提供相应级别的冗余&#xff0c;以增强IDC环境的安全性。 业务操作系统平台采用当前广泛使用的…

某h5st逆向分析

具体网址经过了base64处理 aHR0cHM6Ly9zby5tLmpkLmNvbS93YXJlL3NlYXJjaC5hY3Rpb24/a2V5d29yZD0lRTklOTklQTQlRTYlQjklQkYlRTYlOUMlQkEmc2VhcmNoRnJvbT1ob21lJnNmPTE1JmFzPTA 要做的是一个搜索的功能具体如图所示。 这里发现携带的参数中存在一个token还有一个加密参数&#x…

【Text2SQL 论文】How to prompt LLMs for Text2SQL

论文&#xff1a;How to Prompt LLMs for Text-to-SQL: A Study in Zero-shot, Single-domain, and Cross-domain Settings ⭐⭐⭐⭐ arXiv:2305.11853, NeurlPS 2023 Code: GitHub 一、论文速读 本文主要是在三种常见的 Text2SQL ICL settings 评估不同的 prompt constructio…

node.js漏洞——

一.什么是node.js 简单的说 Node.js 就是运行在服务端的 JavaScript。 Node.js 是一个基于 Chrome JavaScript 运行时建立的一个平台。 Node.js 是一个事件驱动 I/O 服务端 JavaScript 环境&#xff0c;基于 Google 的 V8 引擎&#xff0c;V8 引擎执行 Javascript 的速度非常…

5-Django项目--分页与搜索(资产页面)

目录 views/asset_data.py asset_data/asset_data.html 搜索与分页笔记: 搜索 整数搜索 字符串搜索 分页 views/asset_data.py # -*- coding:utf-8 -*- from django.shortcuts import render, redirect, HttpResponse from django.utils.safestring import mark_safe f…

redis安裝启动

1、下载redis解压 https://github.com/tporadowski/redis/releases 2、打开cmd&#xff0c;切换到解压的文件夹 3、redis-server.exe redis.windows.conf 启动redis redis可通过命令行输入config set requirepass password和直接修改redis.config文件中修改 requirepass 来设…

usb的hid报表描述符的数据含义详解

报表描述符组成基本单元item 项目编码有二种&#xff1a;短项目和长项目&#xff0c;长项目仅是保留给未来使用&#xff0c;所以不作介绍。下面是短item时&#xff0c;最后一个字节描述了item种类和尺寸 长item格式如下&#xff1a; 短格式如下 bSize &#xff1a;代表后面的…

kotlin 调用java的get方法Use of getter method instead of property access syntax

调用警告 Person.class public class Person {private String name;Person(String name) {this.name name.trim();}public String getName() {return name;}public void setName(String name) {this.name name;}public String getFullName() {return name " Wang&quo…

PasteCode系列系统说明

定义 PasteCode系列是指项目是基于PasteTemplate构建的五层以上项目&#xff0c;包括不仅限于 Domain EntityFrameworkCore Application.Contracts Application HttpApi.Host 熟悉ABP vNext就很好理解了&#xff0c;因为PasteTemplate就是基于ABP的框架精简而来&#xff01;在…

【Java】static 修饰成员方法

static 修饰成员方法 简介 应用 static 修饰成员方法 1.static 修饰成员方法2.内存原理3.main函数4.类方法的应用 1.static 修饰成员方法 测试类&#xff1a; package suziguang_d2_staticdemo;public class Test {public static void main(String[] args) {// 1.类方法使用/…

体育器材管理系统(Java+MySQL)

技术栈 Java语言&#xff1a;作为主要编程语言&#xff0c;用于编写应用逻辑和界面交互。MySQL数据库&#xff1a;用于存储和管理体育器材的相关数据。Swing窗口视图&#xff1a;用于创建图形用户界面&#xff0c;使用户能够通过窗口进行操作&#xff08;GBK编码&#xff09;。…

电源设计01

嵌入式电源设计 电池容量的计算电路充电时的选择&#xff1a; 科普硬件知识&#xff0c;写写关于电路板电源的事情。各类电源模块实物但为什么硬件工程师又必须要了解电源并且在板内自己设计电源呢&#xff1f;首先是DCDC的降压芯片下面推荐几个升压芯片&#xff1a;LDO 电池容…

vue3+elementPlus实现Radio单选切换显示不同内容

el-radio-group 组件方法&#xff1a; <template><el-radio-group v-model"radio"><el-radio :value"0">阶梯达标</el-radio><el-radio :value"1">限时达标</el-radio></el-radio-group> </templ…

【设计模式深度剖析】【3】【行为型】【职责链模式】| 以购物中心客户服务流程为例加深理解

&#x1f448;️上一篇:命令模式 设计模式-专栏&#x1f448;️ 文章目录 职责链模式定义英文原话直译如何理解呢&#xff1f; 职责链模式的角色1. Handler&#xff08;抽象处理者&#xff09;2. ConcreteHandler&#xff08;具体处理者&#xff09;3. Client&#xff08;客户…

Vue随笔记

1 Idea里面使用Vue Idea里面要安装Vue插件 File - New - Project - JavaScript - Vue.js 然后出现&#xff1a; "C:\Program Files\nodejs\node.exe" "C:\Program Files\nodejs\node_modules\npm\bin\npx-cli.js" --ignore-existing --package vue/cli…

学习串口屏需要了解哪些方面的知识

学习串口屏需要掌握的知识主要包括以下几个方面&#xff1a; 串口通信原理&#xff1a;串口屏是基于串口通信的显示控制模组&#xff0c;因此了解串口通信的基本原理和通信协议是必要的。你需要了解串口通信的基本概念、数据格式、波特率、校验位等参数&#xff0c;以及串口通…

信息学奥赛初赛天天练-21-完善程序-动态规划、编辑距离与字符数组应用的极致探索

PDF文档公众号回复关键字:20240606 1 2023 CSP-J 完善程序2 完善程序&#xff08;单选题&#xff0c;每小题 3 分&#xff0c;共计 30 分&#xff09; 给定两个字符串&#xff0c;每次操作可以选择删除&#xff08;Delete&#xff09;、插入&#xff08;Insert&#xff09;…