typescript 如何在Electron中加载多个preload.js文件

kiz8lqtg  于 2023-03-31  发布在  TypeScript
关注(0)|答案(1)|浏览(599)

如何导出preload1preload2preload3并将其引入索引?

索引.ts

const test1 = require("./preload1")
const test2 = require("./preload2")
const test3 = require("./preload3")
const { contextBridge } = require('electron');

contextBridge.exposeInMainWorld('testApi', { test1, test2, test3 })

preload1.ts

const { contextBridge, ipcRenderer } = require('electron');

const test1 = async () => {
  return await ipcRenderer.invoke('on-test-event')
}

export default {test1}

preload2.ts

const { contextBridge, ipcRenderer } = require('electron');

const test2 = async () => {
  return await ipcRenderer.invoke('on-test-event')
}

export default {test2}

preload3.ts

const { contextBridge, ipcRenderer } = require('electron');

const test3 = async () => {
  return await ipcRenderer.invoke('on-test-event')
}

export default {test3}

index.vue

console.log(testApi);

控制台错误

VM4 sandbox_bundle:93 Unable to load preload script: \electron-vite-vue\dist-electron\preloads\index.js

VM4 sandbox_bundle:93 Error: module not found: ./preload1
    at preloadRequire (VM4 sandbox_bundle:93:1386)
    at <anonymous>:2:17
    at runPreloadScript (VM4 sandbox_bundle:93:2211)
    at Object.<anonymous> (VM4 sandbox_bundle:93:2478)
    at ./lib/sandboxed_renderer/init.ts (VM4 sandbox_bundle:93:2632)
    at __webpack_require__ (VM4 sandbox_bundle:1:170)
    at VM4 sandbox_bundle:1:1242
    at ___electron_webpack_init__ (VM4 sandbox_bundle:1:1320)
    at VM4 sandbox_bundle:160:455

如果我在索引中写入所有的preload,它工作正常:

索引.ts

const { contextBridge, ipcRenderer } = require('electron');

const test1 = async () => {
  return await ipcRenderer.invoke('on-test-event')
}

const test2 = async () => {
  return await ipcRenderer.invoke('on-test-event')
}

const test3 = async () => {
  return await ipcRenderer.invoke('on-test-event')
}

contextBridge.exposeInMainWorld('testApi', {test1, test2, test3})

控制台

{test1: ƒ, test2: ƒ, test3: ƒ}
 test1: ƒ ()
 test2: ƒ ()
 test3: ƒ ()
 [[Prototype]]: Object
fzsnzjdm

fzsnzjdm1#

默认情况下,Electron的进程是sandboxed,这意味着你不能在渲染器中使用require,你只能在预加载中使用require一些特定的模块:
为了允许渲染器进程与主进程通信,附加到沙箱渲染器的预加载脚本仍将具有可用的Node.js API的polyfilled子集。暴露了类似于Node的require模块的require函数,但只能导入Electron和Node的内置模块的子集:

沙盒是一种安全功能,但如果你真的想导入你的预加载文件,你只能通过在BrowserWindowwebPreferences中禁用sandbox来做到这一点:

const mainWindow = new BrowserWindow({
  webPreferences: {
    nodeIntegration: false,
    contextIsolation: true,
    sandbox: false
  }
});

相关问题