No se pueden utilizar operaciones relacionadas con electrones o nodos en electron . Obtener el proceso de error no definido. Revisé en varios lugares que guían para agregar soporte de nodo, pero eso ya está hecho, así que me quedé atascado aquí. El código de mi aplicación principal es
const electron = require("electron"); const { app, BrowserWindow } = electron; function createWindow() { const win = new BrowserWindow({ width: 800, height: 600, webPreferences: { nodeIntegration: true }, }); win.loadFile("index.html"); } app.whenReady().then(createWindow); app.on("window-all-closed", () => { if (process.platform !== "darwin") { app.quit(); } }); app.on("activate", () => { if (BrowserWindow.getAllWindows().length === 0) { createWindow(); } });y el índice.html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>Hello World!</title> </head> <body style="background: white"> <h1>Hello World!</h1> <p> We are using node <script> document.write(process.versions.node); </script> , Chrome <script> document.write(process.versions.chrome); </script> , and Electron <script> document.write(process.versions.electron); </script> . </p> </body> </html>Actualización: la respuesta a continuación es una solución. No debe deshabilitar contextIsolation y no debe habilitar nodeIntegration . En su lugar, debe usar una secuencia de comandos precargada y la API contextBridge .
En Electron 12 , contextIsolation ahora es true por defecto
Si lo establece en false , tendrá acceso a las API de Node.js en el proceso de renderizado.
function createWindow() { const win = new BrowserWindow({ width: 800, height: 600, webPreferences: { contextIsolation: false, nodeIntegration: true }, }); win.loadFile("index.html"); }⚠️ ¡Es importante tener en cuenta que esto no es recomendable!
Hay una buena razón por la cual los mantenedores de Electron cambiaron el valor predeterminado. Ver esta discusión
Sin contextIsolation, cualquier código que se ejecute en un proceso de representación puede llegar con bastante facilidad a las partes internas de Electron o a su secuencia de comandos precargada y realizar acciones privilegiadas que no desea que realicen sitios web arbitrarios.
No hay razón para elevar los privilegios de su renderizador. Cualquier secuencia de comandos de terceros en esa página se ejecutaría con los mismos privilegios y eso definitivamente no es lo que desea.
En su lugar, debe usar un script de precarga que tenga ese privilegio (es decir, puede usar las API de Node.js de forma predeterminada) pero mantenga contextIsolation=true (que es el valor predeterminado de todos modos). Si necesita compartir datos entre su secuencia de comandos de precarga y su secuencia de comandos de representación, use contextBridge .
En mi ejemplo, he expuesto los datos del script de precarga al script del renderizador bajo un espacio de nombres bastante tonto ( window.BURRITO ) para que sea obvio que usted está a cargo:
principal.js
const {app, BrowserWindow} = require('electron'); //<- v13.1.7 const path = require('path'); app.whenReady().then(() => { const preload = path.join(__dirname, 'preload.js'); const mainWindow = new BrowserWindow({ webPreferences: { preload }}); mainWindow.loadFile('index.html'); });precargar.js
const {contextBridge} = require('electron'); contextBridge.exposeInMainWorld('BURRITO', { getNodeVer: () => process.versions.node, getChromeVer: () => process.versions.chrome, getElectronVer: () => process.versions.electron });renderizador.js
const onClick = (sel, fn) => document.querySelector(sel).addEventListener('click', fn); onClick('#btn1', () => alert(BURRITO.getNodeVer())); onClick('#btn2', () => alert(BURRITO.getChromeVer())); onClick('#btn3', () => alert(BURRITO.getElectronVer()));índice.html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> </head> <body> <button id="btn1">Node?</button> <button id="btn2">Chrome?</button> <button id="btn3">Electron?</button> <script src="./renderer.js"></script> </body> </html>