如何在Electron预加载脚本中检测contextIsolation是否启用?
在预加载脚本中检测contextIsolation状态并适配不同场景
当然可以,有两种可靠的方式在预加载脚本中判断contextIsolation是否禁用,从而选择对应的API暴露方式:
方法一:使用process.contextIsolated直接判断
Electron在预加载脚本中提供了process.contextIsolated布尔属性,可直接获取当前窗口的contextIsolation状态:
// 预加载脚本代码 if (process.contextIsolated) { // 启用contextIsolation时,使用contextBridge安全暴露API const { contextBridge } = require('electron'); contextBridge.exposeInMainWorld('appAPI', { getAppVersion: () => '1.0.0', openSettings: () => { /* 主进程通信逻辑 */ } }); } else { // 禁用contextIsolation时,直接挂载到window对象 window.appAPI = { getAppVersion: () => '1.0.0', openSettings: () => { /* 主进程通信逻辑 */ } }; }
方法二:try-catch捕获contextBridge调用错误
如果担心版本兼容性,也可以通过捕获调用contextBridge.exposeInMainWorld时的报错来做降级处理:
// 预加载脚本代码 const { contextBridge } = require('electron'); try { contextBridge.exposeInMainWorld('appAPI', { getAppVersion: () => '1.0.0', openSettings: () => { /* 主进程通信逻辑 */ } }); } catch (err) { // 捕获到错误说明contextIsolation未启用,直接挂载window属性 window.appAPI = { getAppVersion: () => '1.0.0', openSettings: () => { /* 主进程通信逻辑 */ } }; }
注意事项
- 禁用contextIsolation时直接操作
window会让暴露的API处于全局上下文,存在安全风险,建议仅在必要场景下使用这种方案。 - 尽量保持业务逻辑的一致性,两种场景下暴露的API结构要完全相同,避免渲染端代码出现兼容问题。
内容的提问来源于stack exchange,提问作者vpzomtrrfrt
相关产品推荐
相关产品推荐

