ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
Electron为主进程( main process)和渲染器进程(renderer processes)通信提供了多种实现方式,如可以使用[`ipcRenderer`](https://www.electronjs.org/docs/api/ipc-renderer)和[`ipcMain`](https://www.electronjs.org/docs/api/ipc-main)模块发送消息,使用[remote](https://www.electronjs.org/docs/api/remote)模块进行RPC方式通信 ## [ipcMain](https://www.electronjs.org/docs/api/ipc-main) >从主进程到渲染进程的异步通信 ### [`ipcMain.on(channel, listener)`](https://www.electronjs.org/docs/api/ipc-main#ipcmainonchannel-listener) 监听`channel`(channel为自定义的字符串),当接收到新的消息时`listener`会以`listener(event, args...)`的形式被调用。 下面是在渲染和主进程之间发送和处理消息的一个例子: ~~~ main.js // 在主进程中. const { ipcMain, BrowserWindow} = require('electron') let mainWindow app.on('ready', createWindow) //当应用被激活时发送异步消息。 各种操作都可以触发此事件, 例如首次启动应用程序、尝试在应用程序已运行时或单击应用程序的坞站或任务栏图标时重新激活它 app.on('activate', function () { if (mainWindow === null){ createWindow() } //主动发送消异步消息到渲染进程(演示用) setTimeout(()=>{ mainWindow.webContents.send },5000); //主动发送消异步消息到渲染进程 mainWindow.webContents.on('did-finish-load', () => { mainWindow.webContents.send('asynchronous-message', '嘿嘿嘿!') }) }) function createWindow () { mainWindow = new BrowserWindow({ width: 800, height: 600, webPreferences: { preload: path.join(__dirname, 'preload.js') } }) mainWindow.loadFile('index.html') mainWindow.on('closed', function () { mainWindow = null }); } //监听渲染进程的异步消息并被动响应 ipcMain.on('asynchronous-message', (event, arg) => { console.log("主进程收到的消息:",arg) // prints "ping" //向渲染进程响应(发送)数据,异步方法用reply event.reply('asynchronous-reply', 'pong') }) //监听渲染进程的同步消息并被动响应 ipcMain.on('synchronous-message', (event, arg) => { console.log(arg) // prints "ping" //响应渲染进程的消息,同步方法用returnValue event.returnValue = 'pong' }) ~~~ ## [ipcRenderer](https://www.electronjs.org/docs/api/ipc-renderer) >从渲染器进程到主进程的异步通信。 ~~~ //在渲染器进程 (网页) 中。 const { ipcRenderer } = require('electron') //通过`channel`发送同步消息到主进程 console.log(ipcRenderer.sendSync('synchronous-message', 'ping')) // prints "pong" //ipcRenderer.on(channel, listener) //监听 channel,接受主进程的消息 当新消息到达,将通过 listener(event, args...) 调用 listener ipcRenderer.on('asynchronous-reply', (event, arg) => { console.log('渲染进程接受到的数据',arg) // prints "pong" }) //发送异步消息到主进程 ipcRenderer.send(channel, ...args) ipcRenderer.send('asynchronous-message', 'ping') ~~~