web-dev-qa-db-fra.com

Quand utiliser remote vs ipcRenderer, ipcMain

J'essaie de comprendre les communications entre le processus principal et le moteur de rendu des électrons. La documentation https://github.com/electron/electron/blob/master/docs/api/remote.md indique que le "module distant fournit un moyen simple de communication inter-processus (IPC) ) entre le processus de rendu et le processus principal. "

Cependant, la documentation est très réduite en ce qui concerne la manière de la configurer.

Je peux obtenir que les exemples IPC) fonctionnent avec mon application, ce qui semble assez simple. Dans quels scénarios le module distant doit-il être utilisé?

45
user1513388

À partir de la à distance docs:

Dans Electron, les modules liés à l'interface graphique (tels que les boîtes de dialogue, les menus, etc.) ne sont disponibles que dans le processus principal, pas dans le processus de rendu. Pour pouvoir les utiliser à partir du processus de rendu, le module ipc est nécessaire pour envoyer des messages interprocessus au processus principal. Avec le module distant, vous pouvez appeler des méthodes de l'objet processus principal sans envoyer explicitement de messages interprocessus, similaires à Le RMI de Java. Exemple de création d'une fenêtre de navigateur à partir d'un processus de rendu:

const remote = require('electron').remote;
const BrowserWindow = remote.BrowserWindow;

var win = new BrowserWindow({ width: 800, height: 600 });
win.loadURL('https://github.com');

Fondamentalement, le module remote facilite la réalisation de tâches normalement limitées au processus principal dans un processus de rendu sans beaucoup de messages ipc manuels dans les deux sens.

Donc, dans un processus de rendu, au lieu de:

const ipc = require('electron').ipcRenderer;
ipc.send('show-dialog', { msg: 'my message' });
ipc.on('dialog-shown', () => { /*do stuff*/ });

(Et ensuite, codez pour faire des choses en réponse à ces messages).

Vous pouvez simplement faire tout cela dans le moteur de rendu:

const remote = require('electron').remote;
const dialog = remote.require('dialog')

dialog.showErrorBox('My message', 'hi.');

Le module ipc n'est pas explicitement requis (bien que cela se passe pour vous dans les coulisses). Pour ne pas dire les deux sont mutuellement exclusifs.

Une autre question lors de l'utilisation de la télécommande. Est-il possible d'accéder à une fonction qui existe dans le processus principal plutôt qu'à un module?

Je pense que ce que vous demandez vraiment, c'est: comment puis-je partager du code entre les processus principal/de rendu et comment puis-je avoir besoin d'un module dans le rendu?

EDIT: Vous pouvez simplement l'exiger comme d'habitude. Cela se produit si l’URL actuelle de votre fenêtre de rendu n’est pas dirigée vers un fichier local (non chargé à l’aide de fichier: //). Si vous chargez une URL distante, votre chemin d'accès requis doit être absolu ou vous pouvez utiliser remote comme je l'ai dit ci-dessous.

VIEUX:

Ceci est un autre cas d'utilisation pour remote. Par exemple:

remote.require('./services/PowerMonitor.js')

Notez que l'utilisation de remote comme cela entraîne l'exécution de votre code dans le contexte du processus principal. Cela pourrait avoir ses utilisations mais je ferais attention.

Les modules de nœud intégrés ou electron doivent être remplis comme d'habitude:

require('electron')
require('fs')

Puis-je accéder aux variables globales à partir du moteur de rendu?

Oui.

//in main
global.test = 123;
//in renderer
remote.getGlobal('test') //=> 123
74
ccnokes