问题标签 [ipcmain]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
439 浏览

reactjs - 在电子应用程序中使用 contextBridge/preload 时如何更新反应状态

我有一个使用反应的电子应用程序。我在 preload.js 中使用 contextBridge。我想将 app.js 中的变量通过桥传递给主进程中的函数;它将一个值返回到桥并返回到 app.js,它会以某种方式更新状态并触发重新渲染。以下代码正在工作到更新状态。我不明白如何从 preload.js 到 app.js 获取变量?我希望的临时技巧是从预加载中设置 localstorage 并调用 setTimeout 函数来观察特定变量的变化。我知道这是一种不太有趣的方法。代码在这里:

app.js -

preload.js -

main.js -

0 投票
1 回答
395 浏览

javascript - 未捕获的 ReferenceError:使用示例文档在 ElectronJS 中未定义要求

简短介绍

我一直在关注有关从渲染和主进程进行通信的官方 Electron 文档(https://www.electronjs.org/docs/api/ipc-main
,但我无法让它工作。

错误

在尝试发送消息示例时,我在 JS 控制台中收到此错误:
❌ Uncaught ReferenceError: require is not defined

示例代码

这是我在main.js中的最后几行

这就是我在我的render.js中所拥有的

我得到的错误在这部分const { ipcRenderer } = require('electron')

https://www.electronjs.org/docs/api/ipc-main#sending-messages

这就是我在我的内部调用我的render.js的方式<head>

截屏

关于错误的屏幕截图

我试过的

我已经关注了这个相关的 Q/A,但我仍然得到同样的错误: Using ipc in Electron to set global variable from renderer
还有这个:Uncaught ReferenceError: require is not defined in Electron
And this:“Uncaught SyntaxError: Cannot use import statement导入 ECMAScript 6 时在模块之外

我看到有人说您需要在 main.js 中启用nodeIntegration的,我已启用它但仍然抛出错误:

我还尝试转换为ES6 模块语法

同时还像这样添加type="module"

但是错误是:
❌<strong>Uncaught SyntaxError: Cannot use import statement outside a module

我一直在寻找 SO 中的解决方案,但我找不到任何解决方案,所以任何帮助将不胜感激。

重现项目和错误的步骤

  1. 初始化项目并使用所需的编辑器打开。
    npx create-electron-app app cd app code .

  2. 然后编辑index.js并添加nodeIntegration: true.

  3. 编辑您index.html的添加<script src="renderer.js"></script>

  4. 在和文件renderer.js旁边的 src 文件夹中创建一个新文件。index.htmlindex.js

  5. 现在你应该有以下树:

    +-src
    ---index.css
    ---index.html
    ---index.js(这是你的 main.js)
    ---renderer.js(这是你的 renderer.js)

  6. 将示例代码添加到 index.js 和 renderer.js

  7. 运行以下命令npm start,将打开一个新窗口并运行 Electron 应用程序。

  8. 控制台抛出错误。 示例错误

0 投票
0 回答
62 浏览

node.js - Electron JS 在后面运行耗时的过程

TLDR

我正在使用reZach 的repo ( https://github.com/reZach/secure-electron-template ) 作为入门指南,到目前为止效果很好。我能够来回交流 ipcMain、ipcRenderer 和 React 打字稿。

但是,我仍然缺乏很多知识。

  1. 请参阅图 1,其中用户将单击转换,然后我将在后台运行该过程,用户仍然可以继续其他操作。转换过程通常处理.xlsx大约 90MB 的文件。
  2. 左侧的模板SFTP菜单将处理连接以连续读取和写入大约 5k 个.xml文件。

所以我的问题是:

如何在后台运行进程并2图 1中标记为红色的页面中显示进度。我应该使用多线程或服务工作者或子进程等来完成这些任务吗?

此外,进度条实际上并没有计算任何内容,但右侧的编号 [3] 表示还剩下多少任务。但是当用户点击进入页面时,他们会在那里看到一个正在运行的进程列表。

图 1 在此处输入图像描述

Electron JS 开发前的故事

我已经开发了一个使用 python 处理数据的系统,例如读取和写入大型 excel 90MB+ 并连接到 SFTP 以连续处理大约 5k+ xml 文件(连接会在大约 500 个文件后断开,但我只是以编程方式重新运行它)。到目前为止,在 python 中它运行良好,但我想通过 Electron JS 使用 Web 技术开发另一个副本。

0 投票
0 回答
171 浏览

reactjs - 如何使用单一代码库在浏览器和 PC 中运行 Electron 应用程序

要求- 使用单一代码库在浏览器和 pc 中运行电子应用程序。

面临的问题- 能够在 pc 中作为桌面应用程序运行,但在浏览器中运行 localhost:3000 时(在我的情况下是 Chrome)面临一些与 window.require 相关的问题。在网上尝试了多种解决方案,但目前没有成功。

用例- 使用 ipcMain 和 ipcRenderer 在电子 js 中的 React 应用程序和 main.js 文件之间进行通信,仅适用于 pc 应用程序。(在浏览器中,我需要将其作为没有电子功能(ipcMain 和 ipcRenderer 通信)的简单 Web 应用程序运行,但我需要应用程序在浏览器中运行以及使用单个代码库)

包.json 文件

我的 PC 配置- (macOs Big Sur | 版本 11.4)

浏览器图片 在此处输入图像描述

电子电脑应用 在此处输入图像描述

由于我是电子 js 的新手,请帮助我提供一些有价值的意见。如果有人遇到并解决了这个问题,请指导我正确的方向。

如果问题未解决或需要其他任何内容,请告诉我。

0 投票
0 回答
113 浏览

javascript - 如何从 preload.js 接收数据到 renderer.js

我正在单击一个按钮,该按钮会打开一个对话框以获取文件夹根目录。我目前正在使用调用/句柄。我创建了一个 promise 函数来返回我的数据,但不确定如何将我的数据从 preload.js 移动到 renderer.js

主.js

预加载.js

渲染器.js

CrawlDirectory(文件路径)

0 投票
0 回答
270 浏览

javascript - Electron 应用程序:TypeError fs.existsSync 不是函数

我正在使用 React 和 SQLite3 在 Electron 中构建一个桌面应用程序。我的配置如下:

  • 节点:v14.17.4
  • 电子:13.2.1
  • 反应:17.0.2
  • sqlite3:^5.0.2

我正在尝试启用主端和渲染器端之间的通信,以便通过按下使用 react 构建的按钮在 SQLite3 数据库中插入一行。为此,我正在尝试使用 ipcmain 和 ipcrenderer,但是,如果我使用该指令,const electron = require ("electron");我会收到错误:TypeError: fs.existsSync is not a function.

我正在使用该npm run start命令在开发模式下运行应用程序。

包.json

main.js

0 投票
2 回答
135 浏览

node.js - 使用 Electron/Nodejs 将数据从服务器传递到 html

我正在使用预加载和渲染器 js 将数据从 html 传递到服务器。我有一个主窗口,然后打开另一个窗口(添加窗口)。我从添加窗口获取数据并将其传递给服务器。我在服务器上收到数据,但我不知道如何将带有数据的回调从服务器发送到主窗口 html。

在预加载中,我有:

在渲染器添加窗口中:

在 app.js 中:

我应该在 rendererMain 中写什么来获取数据作为主窗口中的回调?主渲染器在第一次运行时执行,而不是在触发回调时执行(如果我用这些行触发了回调)。

0 投票
1 回答
59 浏览

javascript - Electron FFmpeg 进度处理

我有一个电子应用程序(带有 Angular)。

我是 Electron 和所有这些进程间事件处理的新手。

我的问题是我有这个 ipcMain 处理程序(主进程)(我从 Angular 服务“调用”):

我想要实现的是跟踪视频和音频合并的进度(可能需要几秒钟到几分钟)。但这里的问题是,一旦 Promise 被解决,它就不会发送下一个进度值(我最终会收到 3%,然后即使“合并”仍在进行中,也不会收到任何其他值)。

然后我尝试了以下(主要过程)(我无法编译):

我添加了评论来解释我想要实现的目标。在我的 Angular 服务中,我正在调用这个处理程序,如下所示:

编译时出现以下错误:

我相信还有其他一些“优雅”的方法可以在 Main 和 Renderer 进程之间实现这种行为,如果你能引导我找到任何我将不胜感激的方法。

否则,你能帮我解决这个错误吗?或者与我分享我可以阅读什么来学习如何在 Electron 中使用“Observables”。

0 投票
1 回答
51 浏览

javascript - ipcRenderer 没有收到来自 webContents.send 的消息(电子)

在我的程序的主窗口中,我有一个按钮,如果单击该按钮,则会创建一个新的附加窗口。当这个新窗口完成加载时,我想向ipcRenderer; 但是,到目前为止ipcRenderer,即使窗口创建成功,我也无法接收消息。

以下是 中的代码片段main.js

请注意,这createWindow是一个创建并返回浏览器窗口的函数。

这是代码片段preload.js

如您所见,我希望在received message!新窗口完成加载后在控制台中接收字符串;但是,这并没有发生。我究竟做错了什么?

0 投票
0 回答
19 浏览

javascript - 一个 ipcMain.on() 在同一个文件中工作,而另一个不工作?

我正在使用 Electron 和 vue 开发一个应用程序。

我使用这个解决方案在 main 和 render 之间进行通信,所以我有三个文件preload.js,main 和 renderer。

但是,在渲染文件中,window.api.send("msgbox", "haha");有效而window.api.send("saveall", "hahaha");无效。

Electron 版本 13.6.6 macOS Monterey 12.1