Estoy tratando de usar módulos Node (en este ejemplo, fs ) en mis procesos de renderer , como este:
// main_window.js const fs = require('fs') function action() { console.log(fs) } Nota: La función de action se llama cuando presiono un botón en mi main_window .
Pero esto da un error:
Uncaught ReferenceError: require is not defined at main_window.js:1 Puedo resolver este problema, como lo sugiere esta respuesta aceptada , agregando estas líneas a mi main.js al inicializar main_window :
// main.js main_window = new BrowserWindow({ width: 650, height: 550, webPreferences: { nodeIntegration: true } }) Pero, de acuerdo con los documentos , esto no es lo mejor que se puede hacer y, en cambio, debería crear un archivo preload.js y cargar estos módulos de Nodo allí y luego usarlo en todos mis procesos de renderer . Me gusta esto:
main.js :
main_window = new BrowserWindow({ width: 650, height: 550, webPreferences: { preload: path.join(app.getAppPath(), 'preload.js') } }) preload.js :
const fs = require('fs') window.test = function() { console.log(fs) } main_window.js :
function action() { window.test() }¡Y funciona!
Ahora mi pregunta es, ¿no es contrario a la intuición que debería escribir la mayor parte del código de mis procesos de renderer en preload.js (porque solo en preload.js tengo acceso a los módulos de Node) y luego simplemente llamar a las funciones en cada archivo renderer.js (por ejemplo aquí, main_window.js )? ¿Qué no estoy entendiendo aquí?
Las cosas han progresado rápidamente en Electron, causando cierta confusión. El último ejemplo idiomático (lo mejor que puedo determinar después de mucho rechinar de dientes) es:
principal.js
app.whenReady().then(() => {` let mainWindow = new BrowserWindow({` webPreferences: { preload: path.join(__dirname, 'preload.js'), contextIsolation: true }, width:640, height: 480, resizable: false }) ... rest of codeprecargar.js
const { contextBridge, ipcRenderer} = require('electron') contextBridge.exposeInMainWorld( 'electron', { sendMessage: () => ipcRenderer.send('countdown-start') } )renderizador.js
document.getElementById('start').addEventListener('click', _ => { window.electron.sendMessage() })