Nuestro team de redactores ha estado largas horas investigando la resolución a tus preguntas, te regalamos la soluciones así que nuestro objetivo es que te resulte de gran ayuda.
Utilice los módulos del proceso principal del proceso de renderizado.
Proceso: Renderer
⚠️ ADVERTENCIA ⚠️ El
remote
el módulo es obsoleto. En lugar deremote
, usaripcRenderer
yipcMain
.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 elenableRemoteModule
opción afalse
.
– configurando elenableremotemodule
attribute parafalse
.
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.process
Solo lectura
A NodeJS.Process
objeto. los process
objeto en el proceso principal. Esto es lo mismo que remote.getGlobal('process')
pero está en caché.
Finalizando este artículo puedes encontrar las anotaciones de otros administradores, tú de igual forma puedes mostrar el tuyo si lo deseas.