electron [Feature Request]: Support multiple preload scripts

yrwegjxp  于 5个月前  发布在  Electron
关注(0)|答案(2)|浏览(42)

预检清单

问题描述

我希望通过将业务逻辑从主应用程序中分离并将其移动到单独的包中来实现这一点。为了促进这些包在其他应用程序中的可重用性,我还将提供处理 IPC 设置(注册侦听器、在前端公开方法等)的包。每个包都包含一个预加载脚本,由于没有执行多个预加载脚本的方法,因此这是不可能的。

建议的解决方案

Electron.WebPreferences.preload 可以接受字符串数组,其中每个字符串都是预加载脚本的路径。

考虑的其他替代方案

在预加载脚本中填充 require 可以支持导入本地 JavaScript 文件。这样,就可以有一个预加载脚本,它可以导入所有其他必要的脚本。

其他信息

  • 无响应*
ryevplcw

ryevplcw1#

考虑的替代方案
通常接受的方法是使用捆绑器。这将给您带来自由,可以导入尽可能多的文件。
您提出的功能也使这个问题保持开放,即这些多个预加载脚本应该如何相互作用。您期望它们被连接在一起吗?或者您会使用全局变量以某种方式从一个脚本暴露API到下一个脚本?

2w3rbyxf

2w3rbyxf2#

通常接受的方法是使用打包器。这将给您导入任意数量的文件的自由。
虽然这是一个选项,但它会使应用程序中的包更难以设置。
您提出的功能也使多个预加载脚本如何相互作用的问题悬而未决。您期望它们被连接吗?还是您会使用全局变量以某种方式从一个脚本暴露API到下一个脚本?
预加载脚本需要相互交互吗?
对于我的用例,我不需要在脚本之间共享任何状态。每个包只需公开方法,使用预加载脚本调用其IPC通道即可。
示例:

// preload-script-1.js
const { contextBridge, ipcRenderer } = require('electron/renderer');

contextBridge.exposeInMainWorld('communication', {
    sayHello: () => ipcRenderer.invoke('say-hello'),
    talk: (message) =>  ipcRenderer.invoke('talk', message),
});
// preload-script-2.js
const { contextBridge, ipcRenderer } = require('electron/renderer');

contextBridge.exposeInMainWorld('windowControl', {
    setTitle: (title) => ipcRenderer.invoke('set-tile', title),
});

相关问题