electron学习-03preload 预加载-主进程 和 渲染进程之间通信

preload预加载

主进程是有着完全操作系统访问权限的 Node.js 环境;渲染进程默认跑在网页页面上。

渲染进程不能直接访问 Node.js 接口;主进程访不能直接访问 DOM。

预加载脚本运行在具有 HTML DOM 和 Node.js、Electron API 的有限子集访问权限的环境中

预加载脚本: 将 Electron 的不同类型的进程桥接在一起;

可访问 DOM 接口和 Node.js 环境

经常在其中使用 contextBridge 接口将特权接口暴露给渲染器

预加载会在渲染器的网页加载之前注入

主进程 和 渲染进程之间通信

网页向主进程发送消息

在预处理脚本中ipcRenderer.invoke 的函数来触发该处理程序。

在主进程中通过 ipcMain.handle 程序处理。

创建 preload.js 预加载文件
# preload.js
const { contextBridge, ipcRenderer } = require('electron')
// 能暴露的不仅仅是函数,我们还可以暴露变量
contextBridge.exposeInMainWorld('versions', {
  chrome: () => process.versions.chrome,
  ping: () => ipcRenderer.invoke('ping'),
})

给我的理解

ipcRenderer.invoke 类似于 vue 的this.$emit()

ipcMain.handle 类似于 vue 触发 this.$emit() 的处理函数

在main.js中 将脚本附在渲染进程上
# main.js
const path = require('path')
const createWindow = () => {
  const win = new BrowserWindow({
    ...,
    //将脚本附在渲染进程上
    webPreferences: { preload: path.join(__dirname, 'preload.js')},
  })
}
创建 renderer.js 文件 用于页面中的dom操作
# renderer.js
const information = document.getElementById("#info")
information.innerText = `Chrome: ${window.versions.chrome()}`
const func = async () => {
  const responent = await window.versions.ping()
  console.log('renderer-responent',responent)
}

information.addEventListener('click',func)//点击触发 预加载中的 ping 
在index.js中引入该renderer.js
# index.html
<body>
  <div id="#info"></div>
  <script src="./renderer.js"></script>
</body>
在main.js主进程中添加事件处理函数
#main
# main.js
const path = require('path')
const createWindow = () => {
  const win = new BrowserWindow({
    //将脚本附在渲染进程上
    webPreferences: { preload: path.join(__dirname, 'preload.js')},
  })
  ipcMain.handle("ping", (e, a) => { console.log('在终端打印-', a); return `控制台返回值`  })
}

预加载中的ipcRenderer.invoke 触发,main.js中的函数调用,终端打印`在终端打印- ping`,执行函数体,返回值被renderer.js中的变量 responent 接收,并且在页面的控制台打印 `控制台返回值`

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
Electron 中,可以使用 `preload` 选项来指定一个 JavaScript 文件,在渲染进程页面加载前执行该文件中的代码。在加载文件中定义的变量和函数可以在渲染进程页面中使用。 要将加载文件中定义的值传递到渲染进程并刷新页面,可以使用 Electron 的 `ipcMain` 和 `ipcRenderer` 模块进行进程通信。具体步骤如下: 1. 在加载文件中创建一个函数,该函数将需要传递的值作为参数,并使用 `ipcRenderer` 发送一个消息给主进程,将值传递给主进程。 ```javascript // preload.js const { ipcRenderer } = require('electron') function setValue(value) { ipcRenderer.send('set-value', value) } ``` 2. 在主进程中监听 `set-value` 消息,并将接收到的值保存到一个变量中。 ```javascript // main.js const { app, BrowserWindow, ipcMain } = require('electron') let mainWindow let value function createWindow() { mainWindow = new BrowserWindow({ webPreferences: { preload: 'preload.js' } }) mainWindow.loadFile('index.html') } app.whenReady().then(() => { createWindow() }) ipcMain.on('set-value', (event, val) => { value = val }) ``` 3. 在渲染进程中,可以使用 `ipcRenderer` 发送一个消息给主进程请求获取值,并在接收到主进程发送的 `get-value` 消息时更新页面中的内容。 ```javascript // renderer.js const { ipcRenderer } = require('electron') ipcRenderer.send('get-value') ipcRenderer.on('get-value-reply', (event, val) => { document.getElementById('value').textContent = val }) ``` 4. 在主进程中,监听来自渲染进程的 `get-value` 消息,并使用 `webContents` 对象发送一个 `get-value-reply` 消息给渲染进程,将保存的值传递给渲染进程。 ```javascript // main.js ipcMain.on('get-value', (event) => { event.sender.webContents.send('get-value-reply', value) }) ``` 这样,当加载文件中的 `setValue` 函数被调用时,它会将值发送给主进程主进程会保存该值,并在渲染进程请求获取该值时将其传递给渲染进程渲染进程接收到值后,可以更新页面中的内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RxnNing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值