12.0
context isolation(上下文隔离)
https://www.electronjs.org/zh/docs/latest/tutorial/context-isolation
上下文隔离是 Electron 中的一项安全措施,可确保 预加载脚本不会将拥有优先权的 Electron 或 Node.js API 泄漏到 Web 渲染器进程中的内容。 启用上下文隔离后,从预加载脚本公开 API 的唯 方法是通过 contextBridge
API。
在preload.js
中引入contextBridge
,通过exposeInMainWorld
声明一个字段或者对象来暴露node的API
// preload.js
const { contextBridge } = require('electron')
contextBridge.exposeInMainWorld('versions', {
node: () => process.versions.node,
chrome: () => process.versions.chrome,
electron: () => process.versions.electron,
ver:"v0.0.1",
// we can also expose variables, not just functions
})
- 还可以配合
ipcRenderer
模块,实现与主进程的通讯
const { contextBridge, ipcRenderer } = require('electron')
contextBridge.exposeInMainWorld('versions', {
ping: () => ipcRenderer.invoke('ping')
})
- 不建议直接暴露
ipcRenderer
模块,这样会出现重大安全文件- 通过暴露
ipcRenderer.invoke('xxxx')
来执行- 如果是个人项目,可以通过
// main.js
// 确保创建窗口的时候配置中引入了preload.js
.../
webPreferences: {
preload: path.join(__dirname, 'preload.js'),
},
.../
// renderer.js
// 此时
console.log(versions.node())
console.log(versions.chrome())
console.log(versions.electron())
通过exposeInMainWorld
声明的关键字可以在renderer.js
中以全局变量的形式使用,非常便利。