在 vite+vue3+electron 中使用 express

文章目录

      • [一、Vite + Vue3 + Electron 项目的搭建](#一、Vite + Vue3 + Electron 项目的搭建)
      • [二、搭建 express 环境](#二、搭建 express 环境)
        • [1、安装 express 框架所需依赖](#1、安装 express 框架所需依赖)
        • [2、创建 express 项目](#2、创建 express 项目)
        • 3、配置路由
        • [4、启动 express 服务](#4、启动 express 服务)
        • [5、启动 electron 并获取数据](#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 文件内容如下:

js 复制代码
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 文件,文件内容如下:

js 复制代码
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 启动服务相关函数:

js 复制代码
// 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"));

启动服务:

js 复制代码
// 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 文件内容如下:

js 复制代码
<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 参数:

json 复制代码
"compilerOptions": { ... },
"include": ["server/**/*.ts","src/**/*.ts", "src/**/*.tsx", "src/**/*.vue", "electron"],

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

json 复制代码
"files": [
    "dist",
    "dist-electron",
    "server/**/*"
]

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

相关推荐
活宝小娜1 小时前
vue不刷新浏览器更新页面的方法
前端·javascript·vue.js
程序视点1 小时前
【Vue3新工具】Pinia.js:提升开发效率,更轻量、更高效的状态管理方案!
前端·javascript·vue.js·typescript·vue·ecmascript
coldriversnow1 小时前
在Vue中,vue document.onkeydown 无效
前端·javascript·vue.js
刚刚好ā2 小时前
js作用域超全介绍--全局作用域、局部作用、块级作用域
前端·javascript·vue.js·vue
朝九晚五ฺ3 小时前
【Linux探索学习】第十四弹——进程优先级:深入理解操作系统中的进程优先级
linux·运维·学习
会发光的猪。4 小时前
css使用弹性盒,让每个子元素平均等分父元素的4/1大小
前端·javascript·vue.js
天下代码客4 小时前
【vue】vue中.sync修饰符如何使用--详细代码对比
前端·javascript·vue.js
猫爪笔记5 小时前
前端:HTML (学习笔记)【1】
前端·笔记·学习·html
周全全5 小时前
Spring Boot + Vue 基于 RSA 的用户身份认证加密机制实现
java·vue.js·spring boot·安全·php
pq113_65 小时前
ftdi_sio应用学习笔记 3 - GPIO
笔记·学习·ftdi_sio