nell04 2024-11-28 21:40 采纳率: 9.1%
浏览 21

Electron是否可以自preload 引入main进程导出的类?

请问,Electron是否可以自preload 引入main进程导出的类?

// main/index.ts

export { MenuItem } from 'electron'
// src/preload/index.ts

import { MenuItem } from '../main/index.ts'
  • 写回答

3条回答 默认 最新

  • stormsha 优质创作者: 编程框架技术领域 2024-11-28 21:45
    关注

    本答案参考GPT。若问题解决,望采纳;如仍有疑问,请评论回复。

    在 Electron 中,preload 脚本是在渲染进程(renderer)中运行的 JavaScript 代码,它在创建渲染进程之前加载,因此可以用来暴露一些 Node.js 功能给渲染进程。但是,preload 脚本和主进程(main)是隔离的,它们不能直接共享内存或对象实例。因此,你不能直接从 preload 脚本中导入主进程导出的类。

    不过,你可以使用 ipcRendereripcMain 模块在主进程和渲染进程之间进行通信,从而实现类似功能。以下是实现这一目标的一种方法:

    1. 在主进程中,创建一个类并导出一个函数,该函数接受渲染进程的请求并返回类实例。
    // main/index.ts
    
    import { app, BrowserWindow, ipcMain } from 'electron';
    
    export class MenuItem {
      // 类的实现
    }
    
    // 监听渲染进程的请求
    ipcMain.handle('create-menu-item', async () => {
      return new MenuItem();
    });
    
    1. preload 脚本中,使用 ipcRenderer 发送请求并接收主进程返回的类实例。
    // src/preload/index.ts
    
    const { contextBridge, ipcRenderer } = require('electron');
    
    contextBridge.exposeInMainWorld('electron', {
      createMenuItem: () => ipcRenderer.invoke('create-menu-item')
    });
    
    1. 在渲染进程中,使用 window.electron 访问 preload 脚本暴露的函数。
    // 在渲染进程的某个 HTML 文件或 JavaScript 文件中
    
    window.electron.createMenuItem().then((instance) => {
      // 使用 instance
    });
    

    这种方法允许你在渲染进程中创建和使用主进程中定义的类实例,同时保持了主进程和渲染进程之间的隔离。

    评论

报告相同问题?

问题事件

  • 创建了问题 11月28日