Estoy creando una aplicación de Electron para mi propio propósito. Mi problema es que cuando estoy usando funciones de nodo dentro de mi página HTML arroja un error de:
'require ()' no está definido.
¿Hay alguna forma de utilizar las funcionalidades de Node en todas mis páginas HTML? Si es posible, déme un ejemplo de cómo hacerlo o proporcione un enlace. Estas son las variables que intento usar en mi página HTML:
var app = require('electron').remote;
var dialog = app.dialog;
var fs = require('fs');
y estos son los valores que estoy usando en todas mis ventanas HTML dentro de Electron.
javascript
html
node.js
electron
Mari Selvan
fuente
fuente
Respuestas:
A partir de la versión 5, el valor predeterminado de
nodeIntegration
cambió de verdadero a falso. Puede habilitarlo al crear la ventana del navegador:fuente
nodeIntegration: true
es un riesgo de seguridad solo cuando está ejecutando un código remoto que no es de confianza en su aplicación. Por ejemplo, suponga que su aplicación abre una página web de terceros. Eso sería un riesgo de seguridad porque la página web de terceros tendrá acceso al tiempo de ejecución del nodo y puede ejecutar algún código malicioso en el sistema de archivos de su usuario. En ese caso, tiene sentido establecernodeIntegration: false
. Si su aplicación no muestra ningún contenido remoto o solo muestra contenido confiable, la configuraciónnodeIntegration: true
está bien.Por razones de seguridad, debe mantener
nodeIntegration: false
y usar un script de precarga para exponer justo lo que necesita de la API de Node / Electron al proceso de renderizado (vista) a través de la variable de ventana. De los documentos de Electron :Ejemplo
main.js
preload.js
renderer.js
fuente
<script src="./renderer.js"></script>
Espero que esta respuesta reciba algo de atención, porque la gran mayoría de las respuestas aquí dejan grandes agujeros de seguridad en su aplicación electrónica. De hecho, esta respuesta es esencialmente lo que debería estar haciendo para usar
require()
en sus aplicaciones electrónicas. (Solo hay una nueva API de electrones que lo hace un poco más limpio en la v7).Escribí una explicación / solución detallada en github usando las apis electrónicas más actuales de cómo puedes hacer
require()
algo, pero explicaré brevemente aquí por qué deberías seguir un enfoque utilizando un script de precarga, contextBridge e ipc.El problema
Las aplicaciones electrónicas son geniales porque podemos usar el nodo, pero este poder es un arma de doble filo. Si no tenemos cuidado, le damos acceso a alguien al nodo a través de nuestra aplicación, y con el nodo un mal actor puede dañar su máquina o borrar los archivos de su sistema operativo (entre otras cosas, me imagino).
Como se ve el problema
Este problema se manifiesta cuando usted (cualquiera de los siguientes):
nodeIntegration:true
habilitadoremote
móduloTodos estos problemas dan acceso ininterrumpido al nodo desde su proceso de renderizado. Si su proceso de renderizado alguna vez es secuestrado, puede considerar que todo está perdido.
Cual es nuestra solucion
La solución es no darle al renderizador acceso directo al nodo (es decir
require()
), sino darle a nuestro proceso principal de electrones acceso arequire
, y cada vez que nuestro proceso renderizador necesite usarrequire
, dirigir una solicitud al proceso principal.La forma en que esto funciona en las últimas versiones (7+) de Electron es en el lado del renderizador, configuramos los enlaces ipcRenderer , y en el lado principal configuramos los enlaces ipcMain . En los enlaces ipcMain configuramos métodos de escucha que usan módulos we
require()
. Esto está muy bien porque nuestro proceso principal puede hacerrequire
todo lo que quiera.Usamos el contextBridge para pasar los enlaces de ipcRenderer al código de nuestra aplicación (para usar), por lo que cuando nuestra aplicación necesita usar los
require
módulos d en main, envía un mensaje a través de IPC (comunicación entre procesos) y el proceso principal se ejecuta algún código, y luego enviamos un mensaje con nuestro resultado.A grandes rasgos , esto es lo que quiere hacer.
main.js
preload.js
index.html
Descargo de responsabilidad
Soy el autor de
secure-electron-template
una plantilla segura para crear aplicaciones electrónicas. Me importa este tema y he estado trabajando en esto durante algunas semanas (en este momento).fuente
nodeIntegration
evita que el usuario se cause daño accidental o intencionalmente mientras usa la aplicación, y es una protección adicional en caso de que algún malware se adjuntara a su proceso electrónico y pudiera realizar XSS sabiendo que este vector estaba abierto (increíblemente raro, pero ahí es donde se fue mi cerebro)!¿Está utilizando
nodeIntegration: false
durante la inicialización de BrowserWindow? Si es así, establézcalo entrue
(el valor predeterminado estrue
).E incluya sus scripts externos en el HTML de esta manera (no como
<script> src="./index.js" </script>
):fuente
var pdfjsLib = require('pdfjs-dist')
y usarlo de esta manera.require
lugar de<script src="..."></script>
? Esto también tiene una pregunta sin respuesta aquí .En primer lugar, la solución @Sathiraumesh deja su aplicación electrónica con un gran problema de seguridad. Imagine que su aplicación está agregando algunas funciones adicionales
messenger.com
, por ejemplo, el ícono de la barra de herramientas cambiará o parpadeará cuando tenga un mensaje no leído. Entonces, en sumain.js
archivo, crea una nueva BrowserWindow así (observe que intencionalmente escribí mal messenger.com):¿Qué pasa si
messengre.com
es un sitio web malicioso que quiere dañar su computadora? Si configuranodeIntegration: true
este sitio tiene acceso a su sistema de archivos local y puede ejecutar esto:Y su directorio de inicio se ha ido.
Solución
Exponga solo lo que necesita, en lugar de todo. Esto se logra cargando previamente el código javascript con
require
declaraciones.Ahora awful
messengre.com
no puede borrar todo su sistema de archivos.fuente
Finalmente, lo hice funcionar. Agregue este código a su elemento de script de documento HTML.
Perdón por la respuesta tardía. Utilizo el siguiente código para hacer esto.
Y use en
nodeRequire
lugar de usarrequire
.Funciona bien.
fuente
Debe habilitar nodeIntegration en webPreferences para usarlo. vea abajo,
Hubo cambios rotundos en la api en electron 5.0 ( anuncio en el repositorio ). En las versiones recientes, nodeIntegration se establece de forma predeterminada en false .
Pero si desea mantener la capacidad de usar Node.js y las API de Electron, debe cambiar el nombre de los símbolos en la página antes de incluir otras bibliotecas:
fuente