Electron 如何在渲染进程中去创建新弹窗

在Electron中要想在渲染进程中弹出新窗体,一般有以下两种方式

  • 引入remote模块,在页面中使用remote中的BrowserWindow对象来创建窗体
  • 使用渲染进程和主线程的通信,利用渲染进程发信给主线程,统一由主线程来创建新窗体

实现过程

remote模块创建窗体

安装@electron/remote模块

shell 复制代码
npm i -D @electron/remote

主进程

@electron/remote/main 必须在主进程中初始化,然后才能从渲染进程中使用它

javascript 复制代码
require('@electron/remote/main').initialize()

在中electron >= 14.0.0,您必须使用新的enableAPI来分别启用每个所需的远程模块WebContents

javascript 复制代码
const { app } = require("electron");
const mainWin = new BrowserWindow({
   ...,
   webPreferences: {
   	 nodeIntegration: true, //允许渲染进程内启用Node集成
     contextIsolation: false, //是否在独立 JavaScript 环境中运行 Electron API和指定的preload 脚本. 默认为 true
   },
 });
app.on('browser-window-created', (_, window) => {
    require("@electron/remote/main").enable(window.webContents)
})

electron < 14.0.0 中,@electron/remote尊重enableRemoteModuleWebPreferences 值。您必须传递{ webPreferences: { enableRemoteModule: true } }给窗体的构造函数,BrowserWindow该构造函数应授予@electron/remote使用权限

javascript 复制代码
const { BrowserWindow } = require("electron");
const mainWin = new BrowserWindow({
   ...,
   webPreferences: {
   	 nodeIntegration: true, //允许渲染进程内启用Node集成
     contextIsolation: false, //是否在独立 JavaScript 环境中运行 Electron API和指定的preload 脚本. 默认为 true
     enableRemoteModule: true
   },
 });

渲染进程

调用@electron/remote创建新窗体 同步方式

javascript 复制代码
const { BrowserWindow } = require("@electron/remote");
let win = new BrowserWindow({width:800,height:600})
win.loadURL('https://wwww.baidu.com');

主进程和渲染进程通信创建窗体

渲染进程

javascript 复制代码
const { ipcRenderer } = require("electron");
ipcRenderer.send("openWindow");

主进程

javascript 复制代码
const { ipcMain, BrowserWindow } = require("electron");
ipcMain.on('openWindow',(ev,target)=>{
  const newWin = new BrowserWindow({
    width: 600,
    height: 400,
  });
  newWin.loadURL('https://wwww.baidu.com');
})

注意

  1. 上面的例子中是通过{ webPreferences: { nodeIntegration: true ,contextIsolation: false} }给窗体的构造函数来解决渲染进程不能引入nodeElectron模块的问题,不过这样子会有安全风险 ,一般来说可以用webPreferences 中 preload来暴露nodeElectron的Api
  2. @electron/remote由于这需要通过 npm 的模块而不是内置模块,因此如果您remote从渲染进程中使用,则需要适当配置捆绑器以打包@electron/remote 预加载脚本中的代码。当然,使用@electron/remote会让沙盒的效率大大降低。在@electron/remotenpm官网^1^中也明确说明不推荐使用该模块

Footnotes

  1. @electron/remotenpm官网
相关推荐
绿岛之北3 小时前
Electron 安全第三章:URL 加载与 WebView
前端·electron
菜鸟前端程序员1 天前
当 AI 文件遇上 PDF:一个基于 Electron + Ghostscript 的矢量格式转换引擎深度剖析
electron
clorinda2 天前
把 DeepSeek Harness 打包成类似 Codex 的 Windows 桌面应用:Electron、一键启动、插件管理和动态壁纸
前端·javascript·windows·electron
晴天164 天前
Mojo IPC 和 Electron 的关系-Day21
javascript·electron·mojo
卸任4 天前
AI英语学习助手:从翻译工具到 AI 英语学习助手
前端·electron
kaixin_learn_qt_ing4 天前
Electron程序---初体验
javascript·electron
晴天165 天前
Electron面试题-Day19
java·javascript·electron
绿岛之北5 天前
Electron 安全入门:为什么一个 XSS 可能变成 RCE?
前端·electron
明快de玄米616 天前
Electron学习文档
学习·electron·vim
爱丶不疚9 天前
Electron net 模块你可以没用过,但不能不知道
前端·electron