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

在 vite+vue3+electron 中使用 express

文章目录

      • 一、Vite + Vue3 + Electron 项目的搭建
      • 二、搭建 express 环境
        • 1、安装 express 框架所需依赖
        • 2、创建 express 项目
        • 3、配置路由
        • 4、启动 express 服务
        • 5、启动 electron 并获取数据
      • 三、项目打包

一、Vite + Vue3 + Electron 项目的搭建

详细的项目构建和打包可参考另一篇文章:

使用 electron-vite-vue 构建 electron + vue3 项目并打包

二、搭建 express 环境

1、安装 express 框架所需依赖

yarn add express cors morgan cookie-parser

根据自身情况下载相关依赖包。

2、创建 express 项目

在项目根目录下创建一个 server 文件夹,项目目录结构如下:

项目目录结构

如果 express 项目是基于 express-generator 构建的,只需将 app.js 文件修改成 app.ts 再做部分修改即可。

完整的 app.ts 文件内容如下:

var express = require('express');
var appPath = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var cors = require('cors');// 加载路由文件
const indexRouter = require(appPath.join(__dirname,'./routes/index.ts'));var app = express();// 解决跨域
app.use(cors());app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());app.use('/api/index', indexRouter);// ----------------------
const http = require("http");
const server = http.createServer(app);
// var port = normalizePort(process.env.PORT || "3000");// 导出启动服务器的函数
async function startServer(port) {app.set("port", port);return new Promise((resolve, reject) => {server.listen(port, () => {console.log(`Server listening on port ${port}`);resolve(server);});server.on("error", (error) => {reject(error);});});
}// 停止服务器
async function stopServer() {return new Promise((resolve) => {server.close(() => {console.log("Server stopped");resolve('');});});
}module.exports = {startServer,stopServer
};

该文件的内容是基于 express-generator 构建后生成的 app.js 文件并结合了 bin/www 文件的部分内容。此处导出启动服务器的函数,便于后续启动 electron 时一并启用该服务。

3、配置路由

可以在 server/routes 文件夹下创建一个 index.ts 文件,文件内容如下:

const router = require('express').Router();router.get('/', function (req, res) {res.send('hello express !!!');
});module.exports = router;
4、启动 express 服务

可根据需要安装 get-port,用于监听可用端口,避免端口出现冲突导致服务无法启动:

yarn add get-port

修改 electron/main.ts 文件,导入 express 启动服务相关函数:

// electron/main.ts
import { app, BrowserWindow } from "electron";
import { createRequire } from "node:module";
import { fileURLToPath } from "node:url";
import path from "node:path";// get-port => 查找可用端口
import getPort, { portNumbers } from "get-port";const require = createRequire(import.meta.url);
const __dirname = path.dirname(fileURLToPath(import.meta.url));// 导入 express 启动服务函数
const { startServer, stopServer } = require(path.join(__dirname, "../server/app.ts"));

启动服务:

// electron/main.ts
function createWindow() { ... }...app.on("window-all-closed", () => {if (process.platform !== "darwin") {app.quit();win = null;// 停止 express 服务stopServer();}
});app.whenReady().then(async () => {try {// 使用 getPort 查找可用端口 (范围 3000 ~ 3100)const port = await getPort({ port: portNumbers(3000, 3100) });// 启动 express 服务await startServer(port);createWindow();} catch (error) {console.error("Failed to start server:", error);}
});
5、启动 electron 并获取数据

为了测试是否能够获取 express 中的数据,可以在 Vue3 中安装并使用 axios 获取数据,修改 App.vue 文件内容如下:

<script setup lang="ts">
import { onMounted } from "vue";
import axios from "axios";onMounted(async () => {let res = await axios.get('http://localhost:3000/api/index');console.log(res);
})
</script>

在 electron 中查看接收的数据:

获取数据

注意:杀毒软件(如:火绒)或防火墙可能拦截相关请求,应允许相关请求。

三、项目打包

打包后启动程序可能出现相关模块无法找到的问题,可尝试修改以下配置文件后再打包。

修改 tsconfig.json 文件夹下的 include 参数:

"compilerOptions": { ... },
"include": ["server/**/*.ts","src/**/*.ts", "src/**/*.tsx", "src/**/*.vue", "electron"],

修改打包配置文件 electron-builder.json5 中的 files 属性:

"files": ["dist","dist-electron","server/**/*"
]

说明: 每次修改 server 文件中的内容都需要手动重启 electron,可以在 electron/main.ts 中任意空白位置敲空格再保存即可实现自动重启,暂时还不清楚怎么实现 express 的热更新…

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Lua协程(同步的多线程)
  • Git的基础操作
  • cpp 强制转换
  • oraclejdk相比较于openjdk,在G1,ZGC,ShenandoahGC垃圾回收器做了哪些具体的优化,此文一篇讲清楚
  • SpringSecurity框架【认证】
  • Windows搭建RTMP视频流服务器
  • 3. 序列生成
  • 迭代器+反向迭代器
  • mysql修改数据库名称
  • LabVIEW机器学习实现外观检测
  • 解决selenium打印你保存为PDF时图片未加载成功的问题
  • python 网络篇(网络编程)
  • linux高级编程(网络)(www,http,URL)
  • kaggle 量化交易 比赛
  • 【瑞吉外卖 | day07】移动端菜品展示、购物车、下单
  • “大数据应用场景”之隔壁老王(连载四)
  • javascript 哈希表
  • JavaScript中的对象个人分享
  • Java到底能干嘛?
  • Promise面试题,控制异步流程
  • ucore操作系统实验笔记 - 重新理解中断
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 动态规划入门(以爬楼梯为例)
  • 高度不固定时垂直居中
  • 今年的LC3大会没了?
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 删除表内多余的重复数据
  • 设计模式 开闭原则
  • 树莓派 - 使用须知
  • 译有关态射的一切
  • # AI产品经理的自我修养:既懂用户,更懂技术!
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #大学#套接字
  • %check_box% in rails :coditions={:has_many , :through}
  • (007)XHTML文档之标题——h1~h6
  • (1)常见O(n^2)排序算法解析
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (solr系列:一)使用tomcat部署solr服务
  • (二)斐波那契Fabonacci函数
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (黑马点评)二、短信登录功能实现
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (亲测有效)推荐2024最新的免费漫画软件app,无广告,聚合全网资源!
  • (三)SvelteKit教程:layout 文件
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考