1、electron生命周期
will-finish-launching在应用完成基本启动进程之后触发。ready当 electron 完成初始化后触发。window-all-closed所有窗口都关闭的时候触发,在 windows 和 linux 里,所有窗口都退出的时候通常是应用退出的时候。before-quit退出应用之前的时候触发。will-quit即将退出应用的时候触发。quit应用退出的时候触发。
2、进程通讯
1、渲染-主
使用 ipcRenderer.send API 发送一条消息,然后由 ipcMain.on API 接收该消息
preload是前后端沟通的桥梁
渲染进程 => preload => 主进程
流程
- 定义main文件中,我们的主线程需要做什么,规定好preload中 传入的channel字段
- 书写preload文件 ipcRenderer.send api 定义传入channel和参数
- 渲染进程发送消息,通过事件 对挂载在window上的api进行调用
main 主线程文件
function createWindow () {
const mainWindow = new BrowserWindow({
webPreferences: {
preload: path.join(__dirname, 'preload.js')
}
})//引入preload
//接收子组件传递信息
ipcMain.on(channel, (event, args ) => {
channel 字符串 从preload中传入的文本
event ipc主事件,
args 参数
})
//读取html文件
mainWindow.loadFile('index.html')
}
//preload.js文件
contextBridge.exposeInMainWorld('electronAPI', {
setTitle: (payload) => ipcRenderer.send('set-title', payload)
})
//此时,你将能够在渲染器进程中使用 window.electronAPI.setTitle() 函数。
//js文件调用
btn.addEventListener('click', () => {
window.electronAPI.setTitle(payload)
})
2、双向
通过使用 ipcRenderer.invoke 与 ipcMain.handle 配对来完成
渲染进程=>preload=>ipcRender.invoke=>主线程=>ipcMain.handle返回值=>preload=>渲染进程返回
- 主线程中,通过ipcMain.handle接收preload中invoke的消息,然后将此函数作为他的回调,返回值作为promise返回到原始的invoke调用
- 通过repload加载ipcRender.invoke,该函数会在渲染进程进行调用
- 渲染进程,执行preload的api,他抛出一个promise,这个值是我们在主线程返回的值
//main.js (Main Process)
ipcMain.handle('channel', callback)
返回值是ipcRender的值
//preload.js (Preload Script)
contextBridge.exposeInMainWorld('electronAPI', {
api: () => ipcRenderer.invoke('dialog:openFile')
})
//renderer.js
btn.addEventListener('click', async () => {
const filePath = await window.electronAPI.api()
})
3、主线程到渲染器
消息需要通过渲染器进程的 WebContents 实例发送到渲染器进程。此 WebContents 实例包含一个 send 方法,其使用方式与 ipcRenderer.send 相同。
//main文件
//窗口创建后会有一个webContens的对象,发送
mainWindow.webContents.send('channel', payload),
//preload
//接收信息
contextBridge.exposeInMainWorld('electronAPI', {
handler: (callback) => ipcRenderer.on('channel', (_event, value) => callback(value))
})
//接收一个回调,并且传入参数
//rendere.js
window.electronAPI.handler(function)