Utilice los módulos del proceso principal del proceso de renderizado.

Proceso: Renderer

⚠️ ADVERTENCIA ⚠️ El remote el módulo es obsoleto. En lugar de remote, usar ipcRenderer y ipcMain.

Leer más sobre por qué remote el módulo está en desuso aquí.

Si todavía quieres usar remote a pesar de las preocupaciones sobre el rendimiento y la seguridad, consulte @ electron / remoto.

los remote El módulo proporciona una forma sencilla de realizar la comunicación entre procesos (IPC) entre el proceso de renderizado (página web) y el proceso principal.

En Electron, los módulos relacionados con la GUI (como dialog, menu etc.) solo están disponibles en el proceso principal, no en el proceso de renderizado. Para usarlos desde el proceso de renderizado, el ipc El módulo es necesario para enviar mensajes entre procesos al proceso principal. Con el remote módulo, puede invocar métodos del objeto de proceso principal sin enviar explícitamente mensajes entre procesos, similar al de Java RMI. Un ejemplo de cómo crear una ventana del navegador a partir de un proceso de renderizado:

const BrowserWindow =require('electron').remote
const win =newBrowserWindow( width:800, height:600)
win.loadURL('https://github.com')

Nota: Para lo contrario (acceda al proceso de renderizado desde el proceso principal), puede usar webContents.executeJavaScript.

Nota: El módulo remoto se puede desactivar por razones de seguridad en los siguientes contextos:

  • BrowserWindow – configurando el enableRemoteModule opción a false.
  • – configurando el enableremotemodule attribute para false.

Objetos remotos

Cada objeto (incluidas las funciones) devuelto por el remote módulo representa un objeto en el proceso principal (lo llamamos un objeto remoto o función remota). Cuando invoca métodos de un objeto remoto, llama a una función remota o crea un nuevo objeto con el constructor remoto (función), en realidad está enviando mensajes entre procesos sincrónicos.

En el ejemplo anterior, ambos BrowserWindow y win eran objetos remotos y new BrowserWindow no creó un BrowserWindow objeto en el proceso de renderizado. En cambio, creó una BrowserWindow objeto en el proceso principal y devolvió el objeto remoto correspondiente en el proceso de renderizado, es decir, el win objeto.

Nota: Solamente propiedades enumerables que están presentes cuando se hace referencia al objeto remoto por primera vez son accesibles a través del control remoto.

Nota: Las matrices y búferes se copian a través de IPC cuando se accede a través de la remote módulo. Modificarlos en el proceso de renderizado no los modifica en el proceso principal y viceversa.

Vida útil de los objetos remotos

Electron se asegura de que mientras viva el objeto remoto en el proceso del renderizador (en otras palabras, no se haya recolectado basura), el objeto correspondiente en el proceso principal no será liberado. Cuando el objeto remoto ha sido recolectado como basura, el objeto correspondiente en el proceso principal será desreferenciado.

Si el objeto remoto se filtra en el proceso de renderizado (por ejemplo, se almacena en un mapa pero nunca se libera), el objeto correspondiente en el proceso principal también se filtrará, por lo que debe tener mucho cuidado de no filtrar objetos remotos.

Sin embargo, los tipos de valores primarios como cadenas y números se envían por copia.

Pasando devoluciones de llamada al proceso principal

El código en el proceso principal puede aceptar devoluciones de llamada del renderizador, por ejemplo, el remote módulo, pero debe tener mucho cuidado al utilizar esta función.

Primero, para evitar interbloqueos, las devoluciones de llamada que se pasan al proceso principal se llaman de forma asincrónica. No debe esperar que el proceso principal obtenga el valor de retorno de las devoluciones de llamada pasadas.

Por ejemplo, no puede utilizar una función del proceso de renderizado en un Array.map llamado en el proceso principal:

// main process mapNumbers.js
exports.withRendererCallback=(mapper)=>return[1,2,3].map(mapper)

exports.withLocalCallback=()=>return[1,2,3].map(x=> x +1)
// renderer processconst mapNumbers =require('electron').remote.require('./mapNumbers')const withRendererCb = mapNumbers.withRendererCallback(x=> x +1)const withLocalCb = mapNumbers.withLocalCallback()

console.log(withRendererCb, withLocalCb)// [undefined, undefined, undefined], [2, 3, 4]

Como puede ver, el valor de retorno sincrónico de la devolución de llamada del renderizador no fue el esperado y no coincidió con el valor de retorno de una devolución de llamada idéntica que vive en el proceso principal.

En segundo lugar, las devoluciones de llamada pasadas al proceso principal persistirán hasta que el proceso principal las recopile.

Por ejemplo, el siguiente código parece inocente a primera vista. Instala una devolución de llamada para el close evento en un objeto remoto:

require('electron').remote.getCurrentWindow().on('close',()=>// window was closed...)

Pero recuerde que el proceso principal hace referencia a la devolución de llamada hasta que la desinstale explícitamente. Si no lo hace, cada vez que recargue su ventana, la devolución de llamada se instalará nuevamente y se filtrará una devolución de llamada por cada reinicio.

Para empeorar las cosas, dado que se ha liberado el contexto de devoluciones de llamada instaladas previamente, se generarán excepciones en el proceso principal cuando el close se emite el evento.

Para evitar este problema, asegúrese de limpiar cualquier referencia a las devoluciones de llamada del renderizador pasadas al proceso principal. Esto implica limpiar los controladores de eventos o asegurarse de que se le indique explícitamente al proceso principal que elimine la referencia a las devoluciones de llamada que provienen de un proceso de representación que está saliendo.

Acceder a módulos integrados en el proceso principal

Los módulos incorporados en el proceso principal se agregan como captadores en el remote módulo, por lo que puede utilizarlos directamente como el electron módulo.

const app =require('electron').remote.app
console.log(app)

Métodos

los remote módulo tiene los siguientes métodos:

remote.getCurrentWindow()

Devoluciones BrowserWindow – La ventana a la que pertenece esta página web.

Nota: No utilice removeAllListeners sobre BrowserWindow. El uso de esto puede eliminar todo blur oyentes, deshabilite los eventos de clic en los botones de la barra táctil y otras consecuencias no deseadas.

remote.getCurrentWebContents()

Devoluciones WebContents – Los contenidos web de esta página web.

remote.getGlobal(name)

  • name Cuerda

Devoluciones any – La variable global de name (p.ej global[name]) en el proceso principal.

Propiedades

remote.require

A NodeJS.Require función equivalente a require(module) en el proceso principal. Los módulos especificados por su ruta relativa se resolverán en relación con el punto de entrada del proceso principal.

p.ej

project/
├── main
│   ├── foo.js
│   └── index.js
├── package.json
└── renderer
    └── index.js
// main process: main/index.jsconst app =require('electron')
app.whenReady().then(()=>/* ... */)
// some relative module: main/foo.js
module.exports ='bar'
// renderer process: renderer/index.jsconst foo =require('electron').remote.require('./foo')// bar

remote.processSolo lectura

A NodeJS.Process objeto. los process objeto en el proceso principal. Esto es lo mismo que remote.getGlobal('process') pero está en caché.