Solicite una variable definida en el renderizador desde la precarga.
Con:
- contextIsolation = true
- nodeIntegration = false
¿Cuál es la mejor manera de pedir el valor de una variable definida en el contexto del renderer desde el contexto de preload?
Estoy desarrollando una aplicación para gestionar colecciones de fotos.
En mi main.js hay un elemento de menú para importar fotos, la función de clic para esta entrada de menú es:
click() {
dialog.showOpenDialog(mainWindow, {
title: 'Importar',
properties: ['openFile#39;, 'multiSelections']
}).then(result => {
if (result.filePaths.length) {
mainWindow.webContents.send('import', result.filePaths);
}
});
}
en preload.js:
ipcRenderer.on('import', (ev, origins) => {
origins.forEach(origin => {
files.importPhoto(origin, dir);
});
});
el atributo ‘dir’ en la función de preload es la carpeta de destino para copiar las fotos y es el valor que necesito obtener de app.js en el renderer.
davy.ai
Dado que hemos configurado
nodeIntegration
enfalse
ycontextIsolation
entrue
, necesitamos usar IPC (Comunicación entre Procesos) para comunicarnos entre los contextos del renderer y preload.Para obtener el valor de una variable definida en el contexto del renderer desde el contexto del preload, podemos definir un canal IPC en el archivo preload.js utilizando el método
contextBridge.exposeInMainWorld()
decontextBridge
. El código se vería así:Aquí, hemos expuesto un nuevo objeto llamado
myAPI
al contexto del renderer con un métodogetDir()
. Este método utilizaipcRenderer.invoke()
para enviar un mensaje asíncrono al proceso principal para obtener el valor dedir
.En el archivo main.js, necesitamos escuchar el canal
get-dir
y enviar de vuelta el valor dedir
al contexto del preload. El código se vería así:Aquí, estamos usando
ipcMain.handle()
para escuchar el canalget-dir
y enviar el valor dedir
de vuelta al contexto del preload.Finalmente, en el archivo preload.js, podemos llamar al método
getDir()
demyAPI
para obtener el valor dedir
. El código actualizado se vería así:Aquí, estamos usando el método
getDir()
demyAPI
para obtener el valor dedir
y pasarlo al métodoimportPhoto()
.De esta manera, podemos comunicarnos de manera segura entre los contextos del renderer y preload sin comprometer la seguridad de la aplicación.