Electron 主进程与渲染进程、预加载preload.js

在 Electron 中,主要控制两类进程: 主进程渲染进程

Electron 应⽤的结构如下图:
在这里插入图片描述
如果需要更深入的了解electron进程,可以访问官网 流程模型 文档。

主进程

  • 每个 Electron 应用都有一个单一的主进程,作为应用程序的入口点(主进程具有唯一性)。任何 Electron 应用程序的入口都是 main 文件,负责控制应用的生命周期、创建和管理窗口、与操作系统进行交互等。
  • 主进程在 Node.js 环境中运行,它具有 require 模块和使⽤所有 Node.js API 的能力。
  • 主进程的核心:使用 BrowserWindow 来创建和管理应用程序窗口。

main.js 中,打印:

console.log(__dirname)
console.log('node版本:', process.versions.node)
console.log('chrome版本:', process.versions.chrome)
console.log('electron版本:', process.versions.electron)

在终端中输入结果如下:
在这里插入图片描述

注意:在主进程中执行的console.log()语句,都在vs code 的终端中输出,不会在electron 应用中打印。

main.js 中,打印 window

console.log(window)

报错:window is not defined…
在这里插入图片描述

渲染进程

每个 Electron 应用都会为每个打开的 BrowserWindow ( 与每个网页嵌入 ) 生成一个单独的渲染器进程。 洽如其名,渲染器负责 渲染 网页内容。

  • 每个 BrowserWindow 实例都对应⼀个单独的渲染进程。
  • 一个 Electron 窗口可以包含一个或多个渲染进程,每个渲染进程负责渲染网页内容并执行网页中的 JavaScript 代码。(关系类似于 浏览器、浏览器中的标签页)
  • 运行在渲染器进程中的代码,必须遵守网页标准。这意味着 渲染进程无权直接访问 require 或 使用 任何 Node.js API。
  • 渲染进程主要负责呈现用户界面、响应用户交互、执行网页中的业务逻辑等。

pages/index.html 中:


                
### 三、Electron预加载脚本(preload.js)的作用功能详解 在 Electron 应用中,`preload.js` 是一个在渲染进程加载之前执行的特殊脚本文件,它运行在渲染进程的上下文中,但具有访问 Node.js 模块和 Electron API 的能力[^2]。通过合理设计 `preload.js`,可以实现渲染进程主进程之间的安全通信,并控制暴露给渲染进程的 API,从而增强应用的安全性[^1]。 #### 1. 提供安全的 Node.jsElectron API 访问能力 由于 Electron渲染进程本质上是基于 Chromium 的网页环境,默认情况下不具备访问 Node.jsElectron 模块的能力。通过 `preload.js`,可以在不直接暴露完整 Node.js API 的前提下,有选择性地将特定功能暴露给渲染进程。 例如,可以使用 `contextBridge` 和 `ipcRenderer` 来安全地暴露 IPC 通信接口: ```javascript const { contextBridge, ipcRenderer } = require('electron'); contextBridge.exposeInMainWorld('electronAPI', { send: (channel, data) => ipcRenderer.send(channel, data), on: (channel, func) => ipcRenderer.on(channel, (event, ...args) => func(...args)), once: (channel, func) => ipcRenderer.once(channel, (event, ...args) => func(...args)) }); ``` 这样,渲染进程可以通过 `window.electronAPI` 安全地主进程通信,而不会暴露整个 `ipcRenderer` 或其他潜在危险的模块[^3]。 #### 2. 控制渲染进程的 API 暴露范围 Electron 默认允许渲染进程通过 `nodeIntegration` 使用 Node.js API,但这会带来安全风险。通过启用 `nodeIntegration` 并配合 `preload.js`,可以实现最小权限原则,仅暴露必要的功能。这种机制有助于减少攻击面,防止恶意脚本访问完整的 Node.js 环境。 #### 3. 实现主进程渲染进程的通信桥梁 `preload.js` 通常用于封装 IPC 通信逻辑,使得渲染进程可以通过统一的接口主进程交互。例如,在渲染进程中调用: ```javascript window.electronAPI.send('message-to-main', 'Hello from renderer'); window.electronAPI.on('response-from-main', (data) => { console.log('Received:', data); }); ``` 主进程则通过 `ipcMain` 监听并响应这些消息,从而实现双向通信。 #### 4. 提供初始化逻辑和全局配置 除了通信功能,`preload.js` 还可以用于执行渲染进程的初始化任务,例如设置全局变量、加载本地存储、初始化第三方库等。由于该脚本在页面内容加载之前运行,因此非常适合用于准备运行时环境。 #### 5. 支持多渲染进程的一致性管理 在具有多个窗口或渲染进程Electron 应用中,`preload.js` 可以确保每个窗口都具有相同的初始化逻辑和通信接口,从而保持行为的一致性。通过统一的预加载脚本,开发者可以避免在多个页面中重复相同的代码[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值