预加载脚本
预加载脚本(preload)在渲染进程创建之后、页面自己的脚本执行之前运行。路径写在 webPreferences.preload 上,并且要是绝对路径。
const win = new BrowserWindow({
webPreferences: {
preload: path.join(__dirname, 'preload.js'),
contextIsolation: true,
nodeIntegration: false,
sandbox: true,
},
});
它能做什么
预加载脚本和页面共享同一份 DOM,但在上下文隔离打开时,两边的 window 不是同一个对象。预加载脚本可以把桌面能力收成少数函数,再交给页面:
const { contextBridge, ipcRenderer } = require('electron');
contextBridge.exposeInMainWorld('api', {
getVersion: () => ipcRenderer.invoke('app:version'),
});
页面里随后可以调用 window.api.getVersion()。频道名留在预加载脚本里,页面只看见业务函数。
沙箱对它的影响
sandbox: true 时,预加载脚本里的 require 只能用有限模块,常见的是 electron 里的 ipcRenderer、contextBridge、webFrame。读文件放在主进程,预加载脚本只负责转发。
官方还说明:Node 集成打开时,沙箱会自动关掉。预加载脚本需要的 Node 能力,优先改成一次 IPC,而不是关掉沙箱。