解决Elctron打包成功,IPC无法注册问题。

解决Elctron打包成功,IPC无法注册问题。

核心问题原因

  1. IPC 处理程序未注册:主进程未注册 'resource:scanDirectory'通道的处理程序
  2. 注册时序问题:处理程序注册可能晚于渲染进程的 IPC 调用
  3. 模块加载失败registerResourceIpcHandlers()函数未被正确导入或执行

核心代码

ipcRegister.js

// 静态导入,确保构建工具能识别
import { registerFileSystemIpcHandlers } from '../../ipcHandlers/fileSystemHandler.js'
import { registerResourceIpcHandlers } from '../../ipcHandlers/resourceHandler.js'

const handlers = [
  { name: 'FileSystem', register: registerFileSystemIpcHandlers },
  { name: 'Resource', register: registerResourceIpcHandlers }
]

export async function registerAllIpcHandlers() {
  for (const handler of handlers) {
    try {
      await handler.register()
      console.log(`✅ ${handler.name} IPC 处理程序注册成功`)
    } catch (error) {
      console.error(`🛑 注册 ${handler.name} 失败:`, error)
      throw new Error(`IPC 注册失败: ${handler.name} - ${error.message}`)
    }
  }
  console.log('🎉 所有 IPC 处理程序注册完成')
}

main/index.js

import { app } from 'electron'
import { electronApp, optimizer } from '@electron-toolkit/utils'
import { setupAppLifecycle } from './modules/appLifecycle.js'
import { registerAllIpcHandlers } from './modules/ipcRegister.js'
import { createWindow } from './modules/windowManager.js'

// 当 Electron 完成初始化时触发
app.whenReady().then(async () => {
  // 1. 设置应用用户模型 ID (主要用于 Windows)
  electronApp.setAppUserModelId('com.electron')

  // 2. 设置窗口快捷键监听 (如 F12 开发者工具)
  app.on('browser-window-created', (_, window) => {
    optimizer.watchWindowShortcuts(window)
  })

  // 3. 注册所有 IPC 处理程序
  await registerAllIpcHandlers()

  // 4. 创建主浏览器窗口
  createWindow()

  // 5. 设置应用激活时的行为 (主要用于 macOS)
  setupAppLifecycle()
})

// 当所有窗口都关闭时触发
app.on('window-all-closed', () => {
  // 在 macOS 上,应用程序和它们的菜单栏通常会保持活动状态,
  // 直到用户明确退出(Cmd+Q)。
  if (process.platform !== 'darwin') {
    app.quit()
  }
})

src/renderer/index.html

<!doctype html>
<html>
<head>
  <meta charset="UTF-8"/>
  <title>数据标注</title>
  <!-- https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP -->
  <!--    <meta-->
  <!--      http-equiv="Content-Security-Policy"-->
  <!--      content="default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:"-->
  <!--    />-->
</head>

<body>
<div id="app"></div>
<script type="module" src="/src/main.js"></script>
</body>
</html>

项目地址

electron本地连接mysql数据库项目模板,解决ipc注册问题、prismaclient加载问题

posted @ 2025-11-16 20:11  AJun816  阅读(10)  评论(0)    收藏  举报