Electron主进程和渲染进程

本文详细介绍了Electron应用中的主进程和渲染进程,包括它们的定义,主进程日志在执行npm run electron的控制台查看,渲染进程日志通过Chrome开发者工具查看。此外,还讲解了如何在Electron中自定义原生菜单的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、主进程和渲染进程

1、定义

Electron运行package.json的main脚本的进程被称为主进程。在主进程中运行的脚本通过创建web页面来展示用户界面。一个Electron应用总是有且仅有一个主进程

由于Electron也使用了Chromium来展示web页面,所以Chromium的多进程架构也被使用到。每个Electron的web页面运行在它的叫渲染进程的进程中。

在普通的浏览器中,web页面无法访问操作系统的原生资源。然而Electron的用户在Node.js的API支持下,可以在页面中和操作系统进行一些底层交互。

2、主进程和渲染进程的日志的打印位置

(1)主进程的日志在执行npm run electron的控制台查看日志。

(2)渲染进程的日志使用chcontrol+shift+i查看日志。

         或者在main.js中加一行,在electron运行时自动打开调试工具可以查看日志。

  // 默认打开调试工具
  mainWindow.webContents.openDevTools()

二、自定义原生菜单 

步骤:1、自定义菜单模板,2、编译模版 3、设置菜单

// BrowserWindow是用来新建窗口的, Menu操作自定义菜单
const { app, BrowserWindow, Menu } = require('electron')
// 步骤:1、自定义菜单模板,2、编译模版 3、设置菜单
// 自定义菜单模版
const template = [
  {
    label: '自定义菜单',
    // 子菜单
    submenu: [
      { 
        label: '新建窗口',
        //  给菜单定义点击事件,是一个函数 
        click() {
          new BrowserWindow({
            width: 200,
            height: 200
          })
        }
      }
    ]
  },
  {
    label: '自定义菜单帮助',
    submenu: [
      {
        label: 'reload'
      }
    ]
  }
]

// 由于mac第一个菜单会被遮挡,所以用这种方式
template.unshift({
  label: app.getName()
});

// 编译模版,得到menu对象
const menu = Menu.buildFromTemplate(template)
// 设置菜单
Menu.setApplicationMenu(menu)

  

### Electron 主进程渲染进程发送消息 在 Electron 中,`ipcMain` 是主进程中的模块,而 `ipcRenderer` 则是渲染进程中的模块。两者通过 IPC(Inter-Process Communication)机制实现通信。 以下是主进程渲染进程发送消息的具体示例: #### 示例代码 ```javascript // main.js (主进程) const { app, BrowserWindow, ipcMain } = require('electron'); let mainWindow; app.whenReady().then(() => { mainWindow = new BrowserWindow({ webPreferences: { preload: __dirname + '/preload.js', // 预加载脚本路径 nodeIntegration: false, contextIsolation: true } }); mainWindow.loadFile('index.html'); }); // 使用 ipcMain 向渲染进程发送消息 ipcMain.on('request-message-from-renderer', (event) => { event.reply('response-to-renderer', '这是来自主进程的消息'); // 发送消息给渲染进程[^1] }); ``` ```javascript // preload.js (预加载脚本) const { contextBridge, ipcRenderer } = require('electron'); contextBridge.exposeInMainWorld('api', { sendMessageToMain: () => ipcRenderer.send('request-message-from-renderer'), // 请求主进程消息[^2] receiveMessageFromMain: (callback) => ipcRenderer.on('response-to-renderer', callback) // 接收主进程消息[^3] }); ``` ```html <!-- index.html --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Electron Example</title> </head> <body> <script> window.api.sendMessageToMain(); // 调用预加载脚本的方法请求主进程数据 window.api.receiveMessageFromMain((event, message) => { console.log(message); // 输出接收到的主进程消息 }); </script> </body> </html> ``` #### 解析 上述代码展示了如何利用 `ipcMain` `ipcRenderer` 进行主进程渲染进程间的通信: - **主进程**监听事件并响应渲染进程发出的请求,随后调用 `event.reply()` 方法返回消息。 - **预加载脚本**作为桥梁,在安全模式下允许渲染进程访问特定 API。 - **渲染进程**通过调用预加载脚本暴露的功能发起请求,并接收主进程发回的数据。 此方法遵循现代 Electron 的最佳实践,即启用上下文隔离 (`contextIsolation`) 并禁用 Node.js 集成 (`nodeIntegration`),从而提升安全性[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值