当前位置: 首页 > 知识库问答 >
问题:

electron渲染进程中如何非异步的获取到文件路径?

澹台冯浩
2024-03-11

electron 的渲染进程如何获取到process.cwd()的值 或者 process.resourcesPath也行

  1. 在preload.js中可以拿到process对象,但是没有cwd函数和resourcesPath的值。
  2. 之前版本的remote.getGlobal在27版本中也被移除,否则可以在main.js里面进行设置
  3. 还有一种办法是在preload.js中定义 ipcRender的通信,从ipcMain中获取,但是这样是异步的,我需要在加载页面的时候就直接获取到,还有什么好办法吗? 还是说这一步可以先获取完以后(把获取到的值加载到window.resourcesPath中)再加载页面(如果可以的话,获取消耗时间基本忽略不计),要怎么编写代码?

共有1个答案

杭昊空
2024-03-11

在 Electron 中,出于安全考虑,渲染进程通常不能直接访问到 Node.js 的全局对象,如 process,因为这样做可能会暴露敏感信息或允许执行潜在的危险操作。process.cwd()process.resourcesPath 都是 Node.js 的全局变量,它们分别返回当前工作目录和资源的路径。

在 Electron 12 之后,remote 模块默认被禁用了,因为它允许渲染进程直接访问主进程的对象,这可能会带来安全风险。在 Electron 15 之后,remote 模块被完全移除了。

对于你提到的需求,有几种解决方案:

  1. 使用 ipcRendereripcMain 进行同步通信:虽然 IPC 默认是异步的,但你可以使用 ipcRenderer.sendSync()ipcMain.handle() 来实现同步通信。这样,你可以在渲染进程发送请求后立即获取结果。
// 在 preload.js 中const { ipcRenderer } = require('electron');window.getResourcesPath = () => {  return ipcRenderer.sendSync('get-resources-path');};// 在 main.js 中const { ipcMain } = require('electron');ipcMain.handle('get-resources-path', () => {  return process.resourcesPath;});

然后在渲染进程中,你可以在页面加载时立即调用 getResourcesPath() 来获取资源的路径。

  1. preload.js 中预加载所需的值:你可以在主进程中获取这些值,并通过 contextBridgewindow.onload 等方式传递给渲染进程。这样,渲染进程在加载页面时就可以直接访问这些值。
// 在 main.js 中const { BrowserWindow } = require('electron');const win = new BrowserWindow();win.webContents.on('did-finish-load', () => {  win.webContents.send('resources-path', process.resourcesPath);});// 在 preload.js 中const { contextBridge, ipcRenderer } = require('electron');contextBridge.exposeInMainWorld('electronAPI', {  getResourcesPath: () => {    return new Promise((resolve) => {      ipcRenderer.on('resources-path', (event, path) => {        resolve(path);      });    });  },});// 在渲染进程中window.electronAPI.getResourcesPath().then((path) => {  console.log(path);});

这种方法允许你在页面加载后异步获取路径,但你可以在页面加载之前设置一些默认值或加载指示符。

这两种方法都可以让你在 Electron 的渲染进程中获取到 process.resourcesPath 的值,而无需直接访问 Node.js 的全局对象。根据你的具体需求和应用程序的架构,你可以选择最适合你的方法。

 类似资料:
  • 我想存储在变量的路径的本地目录选择使用dialog.showOpenDialog.我尝试了每一个教程和堆栈答案,没有任何运气。最好的部分是,即使电子api演示解决方案不工作(我在这里使用一个)所以,对话框打开,我可以选择一个文件夹或文件-但没有什么是发送回渲染器进程。 在这里,我正在测试这个打开文件,但也没有结果。我正在使用jQuery btw和elcetron v 12。这是我的代码: 渲染过程

  • 从渲染进程到主进程的异步通信 进程: 渲染进程​ ipcRenderer模块是EventEmitter类的一个实例。 它提供了几个方法,所以你可以从渲染进程(网页)发送同步和异步消息到主进程。您还可以从主流程接收回复。 事件方法 ipcRenderer.on(channel, listener) 用途:监听 channel,并调用 listener(event, args...) 处理新消息 ch

  • 在主进程中处理由渲染进程发起的异步通信. 进程: 主进程​ ipcMain 模块是类EventEmitter类的一个实例. 浅显的打个比方,渲染进程给主进程挂个号,这里就开始忙活起来.当然,你也可以从主进程中向渲染进程发送消息. 发送消息 如果从主进程向渲染进程发送消息,请查看 web-contents-send​ 发送消息,事件名为 channel. 回应同步消息, 请设置 event.retu

  • 问题内容: 我想在我的ajax请求完成后呈现我的组件。 在下面您可以看到我的代码 但是我收到下面的错误,因为我正在ajax请求的done方法内返回render。 有没有办法在开始渲染之前等待我的ajax请求结束? 问题答案: 有两种处理方法,您可以选择哪种方法取决于应该拥有数据的组件和加载状态。 将Ajax请求移至父级并有条件地渲染该组件: 将Ajax请求保留在组件中,并在加载时有条件地渲染其他内

  • 本文向大家介绍vue异步axios获取的数据渲染到页面的方法,包括了vue异步axios获取的数据渲染到页面的方法的使用技巧和注意事项,需要的朋友参考一下 我们在vue,数据很多事异步获取来的,如果在template直接使用,会报错,undefined。 因为先渲染后得到的数据,那如何才能不报错呢? computed!!! 举个例子 index.vue 忽略坑人的传参方式。。。 在创建时获取数据,

  • 我想要实现一个: react 调用nodejs ping 功能,让后实时与Ping模块程序通信,进行得到的结果展示在react界面上,这个解决方案应该如何做呢? 1、是否在渲染进程中执行最好?(不再经过Ipc通信,效率会更加高) 2、如果在渲染进程中做,那么如何实现实时通信呢? 3、如果通过ipc通信,让主进程执行ping 命令,那么ipc如何才能进行实时地通信呢? 例如,每得到一个reply,就