javascript - example - Error no detectado: no se puede encontrar el módulo ''jquery''
title css (6)
Estoy usando Electron para hacer una aplicación de escritorio. En mi aplicación, estoy cargando un sitio externo (fuera de la aplicación Atom), digamos http://mydummysite/index.html página.
Aquí está la estructura de mi aplicación en Atom Editor :
es decir, tiene las siguientes partes:
-
main.js
-
package.json
-
nodemodules>jquery
(para cargar jquery)
Código fuente:
main.js:
''use strict'';
var app = require(''app'');
app.on(''ready'', function() {
var BrowserWindow = require(''browser-window'');
var win =
new BrowserWindow({ width: 800, height: 600, show: false,
''node-integration'':true });
win.on(''closed'', function() {
win = null;
});
win.loadUrl(''http://mydummysite/index.html '');
win.show();
});
package.json:
{
"name": "my-mac-app",
"version": "5.2.0",
"description": "My Mac Desktop App",
"main": "main.js",
"scripts": {
"start": "electron ."
},
"author": "Me",
"license": "ISC",
"dependencies": {
"jquery": "^2.1.4"
}
}
Página externa - http://mydummysite/index.html código de página:
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<h1>Hello World!</h1>
</body>
<script>
var jqr=require(''jquery'');
</script>
</html>
Cuando ejecuto la aplicación anterior (arrastrando la carpeta de la aplicación a Electron) la página externa ( http://mydummysite/index.html ) se carga en Electron shell pero con el error
Error no detectado: no se puede encontrar el módulo ''jquery''
¿Me pueden ayudar a encontrar la causa de este problema?
Como puede ver en mi captura de pantalla de la estructura de directorios, ya instalé el módulo jquery en mi carpeta y lo hice a través del
npm install jquery
.
Nota: Para jugar con el comando
require
en JS intenté agregar
require("ipc")
en mi página externa
http://mydummysite/index.html
y estaba funcionando, así que cuál podría ser la razón con
require("jquery")
.
¿Agregué el módulo externo (jquery) de manera correcta en Electron?
¿Me falta alguna dependencia en
package.json
?
Lo que ya he probado:
-
npm cache clean
,npm install jquery
(en la carpeta de mi aplicación) -
npm install --save jquery
-
npm install jquery -g
-
npm rebuild
-
sudo npm install jquery -g
-
sudo npm install jquery
-
export NODE_PATH=/usr/local/lib/node_modules
Aquí está la captura de pantalla de la ubicación desde donde se arroja el error en
module.js
¿Alguien puede sugerir por qué
require("ipc")
funciona y
require("jquery")
no?
Mi objetivo es usar jQuery con la aplicación de electrones con integración de nodos verdadera.
Espero que el siguiente enlace aclare tu duda sobre
¿por qué require ("ipc") funciona y require ("jquery") no?
https://github.com/atom/electron/issues/254
https://discuss.atom.io/t/electron-app-to-host-external-site/16390/7
Instalar jquery con npm no es suficiente:
npm install --save jquery
Recupera los archivos fuente de jQuery en su proyecto. Pero debe incluir el script en su archivo html:
<!DOCTYPE html>
<html>
<head></head>
<body>
<h1>Hello World!</h1>
</body>
<!-- Try to load from cdn to exclude path issues. -->
<script src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
<script>
window.jQuery = window.$ = jQuery;
$(document).ready(function() {
console.log( "jQuery is loaded" );
});
</script>
</html>
Me ocurrió el mismo problema, una solución simple es agregar esto a su archivo index.js:
app.on(''ready'', function() {
var mainWindow = new BrowserWindow({
"node-integration": false
})
//rest of your initialization code here.
})
el problema es causado por el nodo, para obtener más información, consulte esta post
Establecer la integración de nodos en falso deshabilitará node.js en el proceso de representación, es decir, su aplicación solo puede hacer lo que hará un navegador web.
Tengo el mismo problema cuando uso jQuery con electron, y encuentro una solución para este caso:
<script type="text/javascript" src="js/jquery.min.js"
onload="window.$ = window.jQuery = module.exports;" ></script>
Fuente: https://discuss.atom.io/t/electron-app-to-host-external-site/16390/9
tl; dr
A diferencia de una aplicación normal de nodejs, donde tiene acceso a módulos globales (por ejemplo, ubicados en
/usr/bin/node
), electron no establece automáticamente las variables de entorno
NODE_PATH
.
Debe configurarlo manualmente en todas las rutas que contienen los módulos deseados.
Actualizar:
La respuesta a la pregunta
¿por qué
require("ipc")
funciona yrequire("jquery")
no?
se encuentra en este issue , indicando que los módulos del sistema / usuario no deben incluirse en la ruta global del módulo
ya que podrían contener módulos no enviados con la aplicación y posiblemente compilados con los encabezados v8 incorrectos.
Y si observa
la fuente de electrones,
puede ver que los módulos internos se agregan al
module.globalPaths
:
# Add common/api/lib to module search paths.
globalPaths.push path.resolve(__dirname, ''..'', ''api'', ''lib'')
es por eso que tiene acceso a
ipc
,
app
, etc. pero no a los módulos que ha instalado globalmente usando
npm install -g
.
Acabo de probarlo con la última versión
electron-prebuilt
con un servidor local que sirve exactamente el mismo archivo HTML que usted proporcionó y creo que sé cuál es el problema: si no agrega la ruta al directorio
node_modules
su aplicación en su la raíz de la aplicación a la variable
NODE_PATH
no va a funcionar.
Entonces necesitas hacer algo como esto:
export NODE_PATH=/PATH/TO/APP/node_modules
electron /PATH/TO/APP
Al exportar
NODE_PATH
asegúrese de proporcionar una ruta absoluta.
Actualización 2:
La respuesta al comentario:
Recibo errores de jQuery no encontrado
Se encuentra en este boleto . Básicamente, si usa el paquete npm de jQuery o hace algo como lo siguiente en sus archivos HTML dentro de electron:
<script src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
Lo que obtienes es una
fábrica
y no el objeto jQuery real adjunto al contexto global (por ejemplo,
window
).
Como mencioné en una
respuesta anterior
(que contiene también el código fuente de jQuery)
Cuando necesita jQuery dentro de un entorno CommonJS o similar que proporciona
module
ymodule.exports
, lo que obtiene es una fábrica y no el objeto jQuery real.
Ahora, para usar esa fábrica (ya sea importando el código de la CDN o si tiene el módulo npm disponible localmente) necesitaría algo como lo siguiente:
<script>
window.jQuery = window.$ = require(''jquery'');
</script>
He escrito un article que explica la combinación de Node + jQuery.
# assuming you have installed jquery locally instead of globally like in as
npm install jquery -s # without -g flag
en lugar de require ( "jquery" ) , proporcione la ruta relativa desde el directorio fuente
require ( "./node_modules/jquery/dist/jquery.min.js" );
Intenta lo siguiente:
<script>window.$ = window.jQuery = require(''./node_modules/jquery/dist/jquery.min.js'');</script>
O
<script>var $ = jQuery = require(''./node_modules/jquery/dist/jquery.min.js'');</script>