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

Vite构建Electron项目:Worker导入Electron返回路径而非对象求解法

问题:Electron主进程Worker中导入Electron返回安装路径而非对象

我用Vite创建了Electron项目,尝试在主进程的Worker文件中导入Electron时,未获取到Electron对象,仅返回了Electron的安装路径。该如何正确获取Electron对象?

文件结构

src/
├─ main/
│  ├─ index.ts
│  ├─ worker.ts
├─ preload/
│  ├─ index.js
├─ renderer/
│  ├─ index.html

文件内容

src/main/index.ts

import { app, shell, BrowserWindow, ipcMain } from 'electron'
import { join } from 'path'
import { electronApp, optimizer, is } from '@electron-toolkit/utils'
import icon from '../../resources/icon.png?asset'
import creatWorker from './worker?nodeWorker'

function createWindow(): void {
  const mainWindow = new BrowserWindow({
    width: 900,
    height: 670,
    show: false,
    autoHideMenuBar: true,
    ...(process.platform === 'linux' ? { icon } : {}),
    webPreferences: {
      preload: join(__dirname, '../preload/index.js'),
      nodeIntegrationInWorker: true,
      contextIsolation: true,
      nodeIntegration: true,
      sandbox: true
    }
  })

  mainWindow.on('ready-to-show', () => {
    mainWindow.show()
  })

  mainWindow.webContents.setWindowOpenHandler((details) => {
    shell.openExternal(details.url)
    return { action: 'deny' }
  })

  if (is.dev && process.env['ELECTRON_RENDERER_URL']) {
    mainWindow.loadURL(process.env['ELECTRON_RENDERER_URL'])
  } else {
    mainWindow.loadFile(join(__dirname, '../renderer/index.html'))
  }
}

app.whenReady().then(() => {
  electronApp.setAppUserModelId('com.electron')
  app.on('browser-window-created', (_, window) => {
    optimizer.watchWindowShortcuts(window)
  })

  ipcMain.on('ping', () => console.log('pong'))

  createWindow()
  creatWorker({}).on('message', (message) => {
    console.log(`\nMessage from worker: ${message}`)
  })

  app.on('activate', function () {
    if (BrowserWindow.getAllWindows().length === 0) createWindow()
  })
})

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit()
  }
})

src/main/worker.ts

import test from 'electron'
console.log(typeof test)
// 返回 'string'
console.log(test)
// 返回 '/Users/x/Documents/code/my_project/node_modules/electron/dist/Electron.app/Contents/MacOS/Electron'

解决方案

1. 调整Electron模块的导入方式

在主进程的Node Worker中,直接导入electron顶层模块会返回Electron可执行文件的路径——这是Electron的设计逻辑(用于支持命令行启动)。正确的做法是从electron/main子模块导入主进程API:

修改src/main/worker.ts:

// 按需导入需要的API
import { app, ipcMain } from 'electron/main'

console.log(app) // 现在能获取到正确的Electron app对象
console.log(ipcMain) // 同理获取ipcMain对象

// 如果需要完整的Electron对象,可使用通配符导入
import * as electron from 'electron/main'
console.log(electron.BrowserWindow)

2. 确认Worker环境配置

你已经使用了Vite的?nodeWorker加载器,这会将Worker当作Node.js环境的Worker运行(而非渲染进程的Web Worker),这个配置是正确的。主进程BrowserWindow配置中的nodeIntegrationInWorker是针对渲染进程Worker的,对你当前的主进程Worker无影响,可忽略。


内容的提问来源于stack exchange,提问作者sandwich

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 03:36:07