You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

electron-vite-vue项目中Worker线程的正确实现及生产构建运行异常问题求助

electron-vite-vue项目中Worker线程的正确实现及生产构建运行异常问题求助

嘿,各位大佬,我最近在基于electron-vite-vue模板开发的Electron应用里遇到了Worker线程的问题,折腾好一阵没搞定,来求助大家!

情况是这样的:我在主进程的index.ts里需要创建一个Worker线程定时监控磁盘空间,开发模式下直接指定Worker文件路径能正常运行,但打包成生产版本后就找不到Worker文件了。无奈之下我改用eval的方式把Worker代码内嵌进去,开发时没问题,但生产构建后还是不工作。现在想请教下有没有更规范的Worker实现方式,或者怎么让当前的方案在生产环境正常跑起来?

先贴一下我的主进程代码和内嵌的Worker代码:

主进程index.ts关键代码

import cron from "node-cron";
import { app, BrowserWindow } from "electron";
import path, { join } from "node:path";
import Store from "electron-store";
import diskinfo from "node-disk-info";

const store = new Store();
const { Worker } = require('worker_threads');

// 原本的Worker路径写法,开发正常,生产找不到文件
// const workerPath = path.join(__dirname, 'workers/diskSpaceControl.js');

// ... 省略窗口创建等其他代码 ...

// 现在用eval方式创建Worker
const worker = new Worker(`
const Store = require("electron-store");
const diskinfo = require("node-disk-info");
const cron = require("node-cron");
const path = require("path");

const store = new Store();

cron.schedule("* * * * * *", async () => {
    try {
        const roamingFolderPath = process.env.APPDATA
        store.path = path.join(roamingFolderPath,'saber-delivery','config.json')
        const downloads = await store.get("downloads");
        const freeDiskSpace = await store.get("freeDiskSpace");
        
        const result = []
        freeDiskSpace.forEach((disk) => {
            const filteredDownloads = downloads.filter((item) =>
                typeof item.build_size === 'number' && item.downloadedPath.includes(disk.diskPath)
            );
            const total = filteredDownloads.reduce(
                (acc, item) => acc + (item.build_size - (item.total_done || 0)),
                0
            );
            result.push({ path: disk.diskPath, total: total });
        });

        const diskSpaceInfo = diskinfo.getDiskInfoSync();
        const freeDiskSpaces = diskSpaceInfo
            .filter((item) => item.filesystem === "Local Fixed Disk")
            .map((item) => ({ free: item.mounted.includes('C')?item.available - 21474836480:item.available, diskPath: item.mounted }));

        const res = result.map((item) => {
            const found = freeDiskSpaces.find((freeDiskSpace) =>
                freeDiskSpace.diskPath.includes(item.path)
            );
            if (found) {
                return { free: found.free - item.total, diskPath: item.path };
            }
            return { free: 0, diskPath: item.path };
        });

        store.set("freeDiskSpace", res);
    } catch (error) {
        console.log(error);
    }
});
`,{eval:true});

我遇到的核心问题

  • 开发环境下直接引用Worker文件路径正常运行,但生产构建后提示找不到Worker文件
  • 改用eval内嵌Worker代码后,开发正常,但生产构建后Worker完全不执行(也没报错信息)
  • 想知道在electron-vite-vue项目中,主进程创建Node.js Worker线程的正确姿势是什么?或者怎么修复当前的实现?

希望有经验的大佬能指点一二,谢谢啦!

备注:内容来源于stack exchange,提问作者Vahan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 08:03:02