electron+vue3+ts+vite

news2024/11/20 10:43:18

 首先使用vite工具创建一个vue3+ts的项目

npm create vite

创建好vue+ts项目后启动项目

cd electron-vue3-ts-vite
  npm install
  npm run dev

  

访问http://127.0.0.1:5173/地址可以看到项目已经启动成功

 安装Electron

接下来我们安装electron,使用以下命令 

npm i -D electron

同时,在根目录创建一个electron文件夹,并在里面新建两个文件,分别是main.tspreload.ts

// main.ts

// 控制应用生命周期和创建原生浏览器窗口的模组
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"),
    },
  });
    
  // 加载vite启动的本地服务
//   mainWindow.loadURL("http://localhost:5173");
// 判断当前环境是否为开发环境
if (process.env.NODE_ENV === "development") {
     // 当处于开发环境时,页面加载本地服务,并自动打开开发者工具
     mainWindow.loadURL("http://127.0.0.1:5173");
     mainWindow.webContents.openDevTools();
   } else {
     // 否则页面加载打包后的index.html文件
     mainWindow.loadFile(path.join(__dirname, "./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();
});
 
// preload.ts

// 这里我们随便写一句话
console.log("preload");

 由于main.tspreload.ts均为ts文件,需要编译为js文件,因此在tsconfig.json中进行配置:

 {
  "compilerOptions": {
    "target": "ES2020",
    "useDefineForClassFields": true,
    "module": "ESNext",
    "lib": ["ES2020", "DOM", "DOM.Iterable"],
    "skipLibCheck": true,

    /* Bundler mode */
    "moduleResolution": "bundler",
    "allowImportingTsExtensions": false, // 这里设为false
    "resolveJsonModule": true,
    "isolatedModules": false, // 这里设为false
    "noEmit": false, // 这里设为false
    "outDir": "dist", // 这里设置输出文件和vite打包后的文件一致,保证main.js和preload.js和打包后的index.html在同一路径
    "jsx": "preserve",

    /* Linting */
    "strict": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "noFallthroughCasesInSwitch": true
  },
  // "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"],
  "include": ["electron/*.ts"], // 要编译的文件
  "references": [{ "path": "./tsconfig.node.json" }]
}

之后再package.json中进行配置:

{
  "name": "test-project",
  "private": true,
  "version": "0.0.0",
  "main": "dist/main.js", //设置入口文件,即main.ts编译后的文件
  "scripts": {
    "dev": "vite",
    "build": "vue-tsc --noEmit && vite build",  // 这里需要在vue-tsc后面加上 --noEmit
    "preview": "vite preview",
    "electron:dev":"tsc && electron ." // 这里是启动electron命令,先通过tsc编译ts文件,再运行electron .
  },
  ···
} 

由于我们在main.ts使用加载本地服务的方式来访问vue页面,因此我们需要先启动本地服务。

npm run dev

等待服务开启,运行以下命令即可打开electron窗口:

npm run electron:dev

至此,一个简单的electron+vue3+ts+vite应用就创建完成了。

当我们重新启动项目时会发现页面为空白,也不能自动打开开发者工具

// main.ts
···
// 判断当前环境是否为开发环境
if (process.env.NODE_ENV === "development") {
  // 当处于开发环境时,页面加载本地服务,并自动打开开发者工具
  mainWindow.loadURL("http://localhost:5173");
  mainWindow.webContents.openDevTools();
} else {
  // 否则页面加载打包后的index.html文件
  mainWindow.loadFile(path.join(__dirname, "./index.html"));
}
··· 

在main.ts文件中,process.env.NODE_ENV并不等于development,因此页面会去加载同一层级的index.html,这是因为我们在运行命令时并没有把NODE_ENV加进来,但由于跨平台,直接在命令前添加NODE_ENV=development会报错,因此我们需要使用cross-env这个工具来解决。

安装cross-env

npm i -D cross-env

然后,我们需要修改package.json文件中的electron:dev命令:

 ···
"scripts": {
   "dev": "vite",
   "build": "vue-tsc --noEmit && vite build",
   "preview": "vite preview",
   "electron:dev": "tsc && cross-env NODE_ENV=development electron ." // 在 electron . 前增加 cross-env NODE_ENV=development
},
··· 

修改完之后,我们再次运行npm run electron:dev命令,发现页面可以正常加载,并且自动打开开发者工具。

 

在启动项目时,每次都需要先开启本地vite服务,等待服务开启之后,才能进行启动electron并加载合适的页面,但这不免有些麻烦,这时有些小伙伴可能会提出,我们把这些命令写在一行,用&&符号连接起来不就好了,这看似很合理,但其实不行,这是因为当我们运行完 npm run dev时,后面的命令并不会继续执行,不信的小伙伴可以尝试一下。

为了解决这个问题,我们需要concurrentlywait-on这两个工具,其中:

  • concurrently可以帮助我们同时运行多个命令
  • wait-on可以帮助我们等待某个命令执行完之后再去执行后面的命令

因此我们来安装这两个工具:

 

npm i -D concurrently wait-on 

同时,我们需要修改package.json文件:

···
"scripts": {
   "dev": "vite",
   "build": "vue-tsc --noEmit && vite build",
   "preview": "vite preview",
   "electron":"wait-on tcp:5173 && tsc && cross-env NODE_ENV=development electron .", // 等待5173端口服务开启,再去运行之后的命令
   "electron:dev": "concurrently -k \"npm run dev\" \"npm run electron\"" // 同时运行多个命令
},
··· 

修改好之后,再去运行npm run electron:dev命令,就可以一键启动electron项目了

electron项目的打包

 electron打包主要用到的工具为electron-builder,首先安装该工具:

npm i -D electron-builder

然后,在package.json文件中增加build配置项,并进行如下配置:

···
"build":{
  "appId": "my-app", // app的id
  "productName": "el-vue-test", // 项目名称
  "copyright": "Copyright © 2021 <condingandsleeping>", // 版权信息
  "mac": { // mac中的相关打包配置
      "category": "public.app-category.utilities"
  },
  "nsis": { // windows中安装程序配置
      "oneClick": false,
      "allowToChangeInstallationDirectory": true
  },
  "files": [ 
      "dist" // 要打包的文件夹
  ],
  "directories": {
      "buildResources": "assets",
      "output": "build" // 输出文件夹
  }
}
···
 

除了以上配置之外,还有很多相关配置,具体可以查阅electron-builder的官方文档。

同时,在package.json文件中增加命令electron:build

···
"scripts": {
  "dev": "vite",
  "build": "vue-tsc --noEmit && vite build",
  "preview": "vite preview",
  "electron": "wait-on tcp:5173 && tsc && cross-env NODE_ENV=development electron .",
  "electron:dev": "concurrently -k "npm run dev " "npm run electron"",
  "electron:build":"npm run build && tsc && electron-builder" // 打包命令,执行顺序为 vite打包、tsc编译、electron打包
},
···
 

最后,修改vite.config.ts

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
​
// https://vitejs.dev/config/
export default defineConfig({
  base:"./", // 增加相对路径配置项,保证index.html可以找到打包后的js和css文件
  plugins: [vue()],
})
 

 执行npm run electron:build进行打包,打包后会增加两个文件夹,具体的文件目录为

···
dist
 -assets
 -index.html
 -main.js
 -preload.js
 -vite.svg
 
build
 -win-unpacked
 -builder-debug.yml
 -builder-effective-config.yaml
 -test-project Setup 0.0.0.exe
 -test-project Setup 0.0.0.exe.blockmap
··· 

至此,一个完整的electron项目就打包完成了

完整的配置文件如下:

// package.json
{
  "name": "test-project",
  "private": true,
  "version": "0.0.0",
  "main": "dist/main.js",
  "scripts": {
    "dev": "vite",
    "build": "vue-tsc --noEmit && vite build",
    "preview": "vite preview",
    "electron": "wait-on tcp:5173 && tsc && cross-env NODE_ENV=development electron .",
    "electron:dev": "concurrently -k "npm run dev " "npm run electron"",
    "electron:build":"npm run build && tsc && electron-builder"
  },
  "dependencies": {
    "vue": "^3.2.47"
  },
  "devDependencies": {
    "@vitejs/plugin-vue": "^4.1.0",
    "concurrently": "^8.0.1",
    "cross-env": "^7.0.3",
    "electron": "^24.2.0",
    "electron-builder": "^23.6.0",
    "typescript": "^4.9.3",
    "vite": "^4.2.0",
    "vue-tsc": "^1.2.0",
    "wait-on": "^7.0.1"
  },
  "build":{
    "appId": "my-app",
    "productName": "test-project",
    "copyright": "Copyright © 2021 <xxx>",
    "mac": {
      "category": "public.app-category.utilities"
    },
    "nsis": {
      "oneClick": false,
      "allowToChangeInstallationDirectory": true
    },
    "files": [
      "dist"
    ],
    "directories": {
      "buildResources": "assets",
      "output": "build"
    }
  }
}
​
 
// tsconfig.json
{
  "compilerOptions": {
    "target": "ESNext",
    "useDefineForClassFields": true,
    "module": "ESNext",
    "moduleResolution": "Node",
    "strict": true,
    "jsx": "preserve",
    "resolveJsonModule": true,
    "isolatedModules": false,
    "esModuleInterop": true,
    "lib": ["ESNext", "DOM"],
    "skipLibCheck": true,
    "noEmit": false,
    "outDir": "dist"
  },
  "include": ["electron/*.ts"],
  "references": [{ "path": "./tsconfig.node.json" }]
}
 
// vite.config.ts
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
​
// https://vitejs.dev/config/
export default defineConfig({
  base:"./",
  plugins: [vue()],
})
 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FlashAttention论文解析

FlashAttention让语言模型拥有更长的上下文 FlashAttention序&#xff1a;概述&#xff1a;简介&#xff1a;FlashAttention块稀疏 FlashAttention优点&#xff1a;标准注意力算法实现流程&#xff1a; FlashAttentionBlock-Sparse FlashAttention实验使用FlashAttention后更快…

【网络管理发展】网络杂谈(12)之网络管理未来发展趋势

涉及知识点 网络管理未来的发展方向&#xff0c;网络管理未来的发展趋势&#xff0c;个人闲谈网络管理未来发展&#xff0c;网络管理技术现状&#xff0c;应用服务供应商&#xff08;ASP&#xff09;&#xff0c;网络的远程管理&#xff0c;人工智能与未来。 原创于&#xff1…

try catch 异常处理

C中使用异常时应注意的问题任何事情都是两面性的&#xff0c;异常有好处就有坏处。如果你是C程序员&#xff0c; 并且希望在你的代码中使用异常&#xff0c;那么下面的问题是你要注意的。1. 性能问题。这个一般不会成为瓶颈&#xff0c;但是如果你编写的是高性能或者实时性要求…

保偏产品系列丨5款保偏光纤产品简介

保偏光纤应用日益扩大&#xff0c;特别是在干涉型传感器等测量方面&#xff0c;利用保偏光纤的光无源器件起着非常重要的作用&#xff0c;种类也很多。 本文来介绍5款保偏光纤系列产品以及它们的性能&#xff0c;欢迎收藏转发哦&#xff01; 01、保偏光纤跳线-TLPMPC 保偏光纤跳…

2015年全国硕士研究生入学统一考试管理类专业学位联考数学试题——纯题目版

2015 级考研管理类联考数学真题 一、问题求解&#xff08;本大题共 15 小题&#xff0c;每小题 3 分&#xff0c;共 45 分&#xff09;下列每题给出 5 个选项中&#xff0c;只有一个是符合要求的&#xff0c;请在答题卡上将所选择的字母涂黑。 1.若实数a,b, c 满足 a : b : c…

手机记事本中的内容转到新手机不见了,怎么办?

在更换新手机时&#xff0c;很多网友都会面临这样一个问题&#xff0c;这就是旧手机中的重要数据如何转移到新手机上。一般来说&#xff0c;如果是相同品牌的手机&#xff0c;我们可以借助手机云空间账号进行数据的同步&#xff1b;但如果使用的是不同品牌的手机&#xff0c;这…

如何恢复电脑回收站中的数据?应对已清空电脑回收站的措施

在我们日常使用电脑的过程中&#xff0c;误删文件是难以避免的。幸运的是&#xff0c;电脑回收站提供了一种简便的方式来找回被删除的文件。然而&#xff0c;有些文件可能不会进入回收站&#xff0c;或者回收站的数据被清空&#xff0c;导致丢失的文件无法通过常规方式恢复。在…

在rails项目里面把a链接中的com前半部分用sub替换

在Rails项目中&#xff0c;你可以使用sub方法来替换a链接中的"com"前半部分。下面是一个示例&#xff1a; # 假设a链接的原始URL为&#xff1a;https://example.com/some/pagelink "https://example.com/some/page" modified_link link.sub("com…

node.js宿舍管理系统-计算机毕设 附源码80331

node.js宿舍管理系统 摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于角度存在偏差&#xff0c;人们经常能够获取不同类型的信息&#xff0c;这也是技术最为难以攻克的课题。针对宿舍管理系统等问题&#…

高防IP服务靠谱吗?能抵御什么攻击?

今天我们要揭开一个神秘而又酷炫的面纱——高防IP服务&#xff01;是不是已经感到心跳加速了呢&#xff1f;那么&#xff0c;问题来了&#xff0c;高防IP服务靠谱吗&#xff1f;它能抵御什么攻击呢&#xff1f; 我们来给大家科普一下高防IP服务是什么。简单来说&#xff0c;高防…

JetBrains编程IDE将具备Ai助手功能,或将提高开发速度

近日JetBrains发布博客文章宣布&#xff0c;本周所有基于IntelliJ的IDE和.NET工具的EAP版本都将具备AI助手功能。而这些操作或许将提高开发效率&#xff0c;并且这些AI助手也是使用自家的**ERP**模型和OpenAI服务。 JetBrains表示&#xff0c;当下AI助手功能主要体现在IDE的两…

adb 查询app占用的cup和内存

一、先将cpu定频 先进入shell 模式 adb shell 查看当前CPU的工作模式 cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor 然后把CPU工作模式设置为performance模式 echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor 改完后查看模式…

Pytest接口自动化框架

目录 前言&#xff1a; 插件&#xff1a; test_case pytest.ini (pytest.ini 配置文件不支持注释) run_all.py report 插件&#xff1a; test_case pytest.ini (pytest.ini 配置文件不支持注释) run_all.py report 前言&#xff1a; pytest是一个基于Python的开源测试框…

ShaderGraph制作“红旗迎风飘扬”效果(Unity2019版)

零、准备“旗面”游戏物体 旗面是一个平面&#xff0c;右键创建的3D物体里是平面的&#xff0c;有Quad和Plan&#xff0c;模仿旗面“起伏”的原理是对平面的顶点&#xff0c;做不同程度的抬升&#xff1a;Quad从线框图中看&#xff0c;是一个长方形&#xff0c;只有四个顶点&am…

nginx unknown directive “stream“

目录 1、安装依赖 2、执行命令 nginx 运行报错&#xff1a;unknown directive "stream"的原因&#xff0c;主要是因为没有安装stream模块导致的&#xff0c;我们只需要编译安装一下stream模块即可解决这个问题。 1、安装依赖 提前安装编译所需要的依赖插件 # gcc…

【机器学习与遥感】sklearn与rasterio实现遥感影像非监督分类

在学习遥感的过程中&#xff0c;我们都了解到了监督分类与非监督分类&#xff0c;二者是遥感解译的基础。之前更多的是使用Erdas与ENVI来进行这两种分类。这里使用python语言&#xff0c;基于机器学习库sklearn与遥感影像处理库rasterio&#xff0c;使用kmeans动态聚类方法实现…

PP-Structure—表格数据提取

目录 简介 特性 效果展示 表格识别 版面分析和表格识别 版面恢复 关键信息抽取 快速开始 1. 准备环境 1.1 安装PaddlePaddle 1.2 安装PaddleOCR whl包 2 快速使用 3. 便捷使用 3.1 命令行使用 3.2 Python脚本使用 3.3 返回结果说明 分析总结 简介 PP-Stru…

Python 装饰器

一、什么是装饰器 装饰器本质上就是一个Python函数&#xff0c;它可以装饰在其他函数上&#xff0c;使得其他函数不需要做任何改动就可以获得装饰器函数中的功能。实际上被装饰器修饰的函数在执行的时候不会直接运行其函数内部的逻辑&#xff0c;而是先将这个函数当作参数传递…

【企业架构治理】SOGAF ,Salesforce 的运营、治理和架构框架

“如果你想要新的东西&#xff0c;你必须停止做旧的东西。”——彼得德鲁克&#xff0c;《公司概念》的作者 这篇文章介绍了 Salesforce 运营、治理和架构框架 (SOGAF)&#xff0c;这是一个新的大规模治理框架&#xff0c;由对跨多个行业的学术文献、现有框架和转型案例研究的广…

如何对数据库进行垂直拆分或水平拆分?

水平拆分的意思&#xff0c;就是把一个表的数据给弄到多个库的多个表里去&#xff0c;但是每个库的表结构都一 样&#xff0c;只不过每个库表放的数据是不同的&#xff0c;所有库表的数据加起来就是全部数据。水平拆分的意 义&#xff0c;就是将数据均匀放更多的库里&#xff0…