2016-04-11 14 views
32

Sto cercando di capire le comunicazioni tra i processi di elettrone principale e di rendering. La documentazione https://github.com/electron/electron/blob/master/docs/api/remote.md afferma che "il modulo remoto fornisce un modo semplice per eseguire la comunicazione tra processi (IPC) tra il processo di rendering e il processo principale".Quando utilizzare remote vs ipcRenderer, ipcMain

Tuttavia, la documentazione è molto scarsa per quanto riguarda la configurazione.

Posso ottenere gli esempi IPC per funzionare con la mia applicazione che sembra abbastanza semplice. In quali scenari deve essere utilizzato il modulo remoto?

risposta

48

Dalle remote documentazione:

In Electron, moduli GUI correlati (come finestra di dialogo, menù ecc) sono disponibili solo nel processo principale, non nel processo di rendering. Per poterli utilizzare dal processo di rendering, il modulo ipc è necessario per inviare messaggi inter-process al processo principale. Con il modulo remoto, è possibile richiamare i metodi dell'oggetto principale senza inviare messaggi inter-processo in modo esplicito, simili a RMI di Java. Un esempio di creazione di una finestra del browser da un renderer processo:

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

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

Fondamentalmente il modulo remote rende facile fare cose normalmente riservata al processo principale in un processo di rendering, senza un sacco di messaggi IPC manuali indietro e via.

Così, in un processo di rendering, invece di:

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

(E poi il codice per lo più a fare cose in risposta a quei messaggi).

Si può solo fare tutto questo nel renderer:

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

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

Il modulo IPC non è espressamente richiesta (anche se sta accadendo per voi dietro le quinte). Per non dire che i due si escludono a vicenda.

Un'ulteriore domanda quando si utilizza il telecomando. È possibile accedere a una funzione esistente nel processo principale anziché in un modulo?

Penso che quello che stai veramente chiedendo sia: come posso condividere il codice tra i processi main/renderer e come posso richiedere un modulo nel renderer?

MODIFICA: puoi semplicemente richiederlo come al solito. Un caso limite di questo è se l'attuale URL della finestra di rendering non è puntato su un file locale (non caricato utilizzando file: //). Se stai caricando un URL remoto, il percorso richiesto deve essere assoluto o puoi utilizzare il telecomando come ho detto di seguito.

VECCHIO:

Questo è un altro caso d'uso per remote. Ad esempio:

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

Si noti che l'utilizzo di questo tipo di telecomando fa sì che il codice venga eseguito nel contesto del processo principale. Questo potrebbe avere i suoi usi ma starei attento.

Module da incasso nodo o electron essere richiesta come normale:

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

Posso accedere alle variabili globali dal renderer?

Sì.

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

Grazie per questo. – user1513388

+0

Un'ulteriore domanda quando si utilizza il telecomando. È possibile accedere a una funzione esistente nel processo principale piuttosto che in un modulo? – user1513388

+0

In realtà lo stesso vale per le variabili globali, è possibile allegare anche a quelle del processo di rendering? – user1513388

Problemi correlati